{"version":3,"file":"./app-00d77f12521adc700ce830ff92d6f097.js","mappings":"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AAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,EAAE,KAAKC,EAAI,CAAC,GAAG,IAAIC,EAAI,CAAC,EAAE,IAAIC,GAAI,CAAC,EAAE,KAAKC,GAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,GAAG,IAAIC,GAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,GAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IACzvC1D,GAAS,CAAC2D,MAAO,WAAoB,EACzCC,GAAI,CAAC,EACLC,SAAU,CAAC,MAAQ,EAAE,EAAI,EAAE,aAAe,EAAE,IAAM,EAAE,OAAS,EAAE,MAAQ,EAAE,MAAQ,EAAE,cAAgB,EAAE,WAAa,GAAG,QAAU,GAAG,QAAU,GAAG,SAAW,GAAG,MAAQ,GAAG,MAAQ,GAAG,gBAAkB,GAAG,KAAO,GAAG,KAAO,GAAG,MAAQ,GAAG,MAAQ,GAAG,KAAO,GAAG,KAAO,GAAG,IAAI,GAAG,IAAM,GAAG,IAAI,GAAG,MAAQ,GAAG,KAAO,GAAG,MAAQ,GAAG,KAAO,GAAG,IAAM,GAAG,IAAI,GAAG,IAAI,GAAG,QAAU,GAAG,YAAc,GAAG,QAAU,GAAG,KAAO,GAAG,IAAI,GAAG,IAAI,GAAG,MAAQ,GAAG,gBAAkB,GAAG,IAAI,GAAG,OAAS,GAAG,WAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,aAAe,GAAG,OAAS,GAAG,IAAM,GAAG,EAAI,GAAG,WAAa,GAAG,YAAc,GAAG,UAAY,GAAG,UAAY,GAAG,YAAc,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,EAAI,GAAG,IAAI,GAAG,EAAI,GAAG,iBAAmB,GAAG,IAAI,GAAG,QAAU,GAAG,IAAI,GAAG,IAAM,GAAG,eAAiB,GAAG,gBAAkB,GAAG,IAAI,GAAG,EAAI,GAAG,IAAI,GAAG,QAAU,EAAE,KAAO,GACl3BC,WAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,KAChYC,aAAc,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GA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WACE,aAUAA,MAAMe,QAAQmqB,OAAS,SAASvI,GAC9B,IAA8C9+G,EAA1CqB,EAAOy9G,EAAUz9G,KAAMq2F,EAAMr2F,EAAKtB,OAEtC,IAAKC,EAAI,EAAGA,EAAI03F,EAAK13F,GAAK,EAExBqB,EAAKrB,GAAK,IAAMqB,EAAKrB,GAErBqB,EAAKrB,EAAI,GAAK,IAAMqB,EAAKrB,EAAI,GAE7BqB,EAAKrB,EAAI,GAAK,IAAMqB,EAAKrB,EAAI,EAEjC,CACD,CAvBD,GA6BA,SAAUm8F,GACR,aA0CA,SAASmrB,IACPpmH,KAAKR,EAAI,EACTQ,KAAKs2B,EAAI,EACTt2B,KAAK8e,EAAI,EACT9e,KAAKT,EAAI,EACTS,KAAKy/C,KAAO,IACd,CAEA,IAAI4mE,EAAY,CACd,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAGEC,EAAY,CACd,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAqQFrrB,EAAMe,QAAQuqB,KAAO,SAAc3I,GACjC,IAAI4I,EAAStoH,KAAKmlD,MAAMrjD,KAAKymH,cAEzBD,EAAS,GArQf,SAA6B5I,EAAW4I,GACtC,IAII3kH,EACFC,EACAhD,EACAiR,EACA22G,EACA7oC,EACA8oC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACApY,EACA77B,EACAjd,EACA3F,EACA82D,EA3BEC,EAAS7J,EAAUz9G,KACrB4B,EAAQ67G,EAAU77G,MAClBklE,EAAS22C,EAAU32C,OA2BjBygD,EAAMlB,EAASA,EAAS,EAC1BmB,EAAc5lH,EAAQ,EACtB6lH,EAAe3gD,EAAS,EACxB4gD,EAAcrB,EAAS,EACvBsB,EAAYD,GAAeA,EAAc,GAAK,EAC9CE,EAAa,IAAI3B,EACjB4B,EAAW,KACX3jF,EAAQ0jF,EACRE,EAAU,KACVC,EAAW,KACXC,EAAU9B,EAAUG,GACpB4B,EAAU9B,EAAUE,GAEtB,IAAK1nH,EAAI,EAAG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","sources":["webpack:///./node_modules/sample-player/lib/notes.js","webpack:///./node_modules/core-js/library/modules/_object-dps.js","webpack:///./node_modules/core-js/library/modules/_to-length.js","webpack:///./node_modules/core-js/library/modules/_iterators.js","webpack:///./node_modules/midimessage/dist/index.min.js","webpack:///./js/vextab/artist.js","webpack:///./node_modules/core-js/library/modules/_wks.js","webpack:///./node_modules/core-js/library/modules/_iter-step.js","webpack:///./node_modules/core-js/library/modules/_is-array-iter.js","webpack:///./js/helpers/timer.js","webpack:///./node_modules/babel-runtime/helpers/possibleConstructorReturn.js","webpack:///./node_modules/core-js/library/modules/es7.symbol.observable.js","webpack:///./node_modules/core-js/library/modules/_to-primitive.js","webpack:///./node_modules/core-js/library/modules/_an-object.js","webpack:///./node_modules/add-dom-event-listener/lib/EventBaseObject.js","webpack:///./node_modules/component-classes/index.js","webpack:///./node_modules/react-dom/index.js","webpack:///./node_modules/core-js/library/modules/_object-gopd.js","webpack:///./node_modules/soundfont-player/lib/index.js","webpack:///./node_modules/babel-runtime/core-js/object/create.js","webpack:///./node_modules/core-js/library/modules/_redefine.js","webpack:///./node_modules/core-js/library/modules/_set-to-string-tag.js","webpack:///./node_modules/audio-loader/lib/fetch.js","webpack:///./node_modules/core-js/library/fn/object/set-prototype-of.js","webpack:///./node_modules/core-js/library/modules/_object-gopn.js","webpack:///./node_modules/audio-loader/lib/index.js","webpack:///./node_modules/core-js/library/modules/_create-property.js","webpack:///./node_modules/core-js/library/modules/es6.object.create.js","webpack:///./node_modules/core-js/library/modules/_fails.js","webpack:///./node_modules/core-js/library/modules/_set-proto.js","webpack:///./node_modules/core-js/library/modules/_object-create.js","webpack:///./node_modules/add-dom-event-listener/lib/EventObject.js","webpack:///./node_modules/core-js/library/fn/object/get-prototype-of.js","webpack:///./node_modules/add-dom-event-listener/lib/index.js","webpack:///./node_modules/core-js/library/modules/es6.array.iterator.js","webpack:///./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack:///./node_modules/lodash/lodash.js","webpack:///./node_modules/react-dom/cjs/react-dom.production.min.js","webpack:///./node_modules/core-js/library/modules/_add-to-unscopables.js","webpack:///./js/vextab/vextab-jison.js","webpack:///./node_modules/core-js/library/modules/_hide.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./node_modules/core-js/library/fn/object/define-property.js","webpack:///./node_modules/konva/konva.js","webpack:///./node_modules/babel-runtime/helpers/toConsumableArray.js","webpack:///./node_modules/babel-runtime/helpers/get.js","webpack:///./node_modules/shallowequal/index.js","webpack:///./node_modules/core-js/library/modules/es7.symbol.async-iterator.js","webpack:///./node_modules/core-js/library/modules/_to-absolute-index.js","webpack:///./node_modules/core-js/library/modules/_string-at.js","webpack:///./node_modules/babel-runtime/core-js/object/assign.js","webpack:///./node_modules/vexflow/src/vex.js","webpack:///./node_modules/vexflow/src/fraction.js","webpack:///./node_modules/vexflow/src/registry.js","webpack:///./node_modules/vexflow/src/element.js","webpack:///./node_modules/vexflow/src/boundingboxcomputation.js","webpack:///./node_modules/vexflow/src/boundingbox.js","webpack:///./node_modules/vexflow/src/fonts/vexflow_font.js","webpack:///./node_modules/vexflow/src/glyph.js","webpack:///./node_modules/vexflow/src/tables.js","webpack:///./node_modules/vexflow/src/canvascontext.js","webpack:///./node_modules/vexflow/src/raphaelcontext.js","webpack:///./node_modules/vexflow/src/svgcontext.js","webpack:///./node_modules/vexflow/src/renderer.js","webpack:///./node_modules/vexflow/src/stem.js","webpack:///./node_modules/vexflow/src/tuplet.js","webpack:///./node_modules/vexflow/src/beam.js","webpack:///./node_modules/vexflow/src/voice.js","webpack:///./node_modules/vexflow/src/staveconnector.js","webpack:///./node_modules/vexflow/src/tickable.js","webpack:///./node_modules/vexflow/src/note.js","webpack:///./node_modules/vexflow/src/notehead.js","webpack:///./node_modules/vexflow/src/stemmablenote.js","webpack:///./node_modules/vexflow/src/modifier.js","webpack:///./node_modules/vexflow/src/dot.js","webpack:///./node_modules/vexflow/src/stavenote.js","webpack:///./node_modules/vexflow/src/frethandfinger.js","webpack:///./node_modules/vexflow/src/music.js","webpack:///./node_modules/vexflow/src/accidental.js","webpack:///./node_modules/vexflow/src/notesubgroup.js","webpack:///./node_modules/vexflow/src/stavetie.js","webpack:///./node_modules/vexflow/src/tabtie.js","webpack:///./node_modules/vexflow/src/gracenotegroup.js","webpack:///./node_modules/vexflow/src/strokes.js","webpack:///./node_modules/vexflow/src/stringnumber.js","webpack:///./node_modules/vexflow/src/articulation.js","webpack:///./node_modules/vexflow/src/tickcontext.js","webpack:///./node_modules/vexflow/src/ornament.js","webpack:///./node_modules/vexflow/src/annotation.js","webpack:///./node_modules/vexflow/src/bend.js","webpack:///./node_modules/vexflow/src/vibrato.js","webpack:///./node_modules/vexflow/src/modifiercontext.js","webpack:///./node_modules/vexflow/src/formatter.js","webpack:///./node_modules/vexflow/src/stavemodifier.js","webpack:///./node_modules/vexflow/src/stavebarline.js","webpack:///./node_modules/vexflow/src/staverepetition.js","webpack:///./node_modules/vexflow/src/stavesection.js","webpack:///./node_modules/vexflow/src/stavetempo.js","webpack:///./node_modules/vexflow/src/textnote.js","webpack:///./node_modules/vexflow/src/stavetext.js","webpack:///./node_modules/vexflow/src/clef.js","webpack:///./node_modules/vexflow/src/keysignature.js","webpack:///./node_modules/vexflow/src/timesignature.js","webpack:///./node_modules/vexflow/src/stavevolta.js","webpack:///./node_modules/vexflow/src/stave.js","webpack:///./node_modules/vexflow/src/tabstave.js","webpack:///./node_modules/vexflow/src/tabnote.js","webpack:///./node_modules/vexflow/src/vibratobracket.js","webpack:///./node_modules/vexflow/src/multimeasurerest.js","webpack:///./node_modules/vexflow/src/clefnote.js","webpack:///./node_modules/vexflow/src/keysignote.js","webpack:///./node_modules/vexflow/src/timesignote.js","webpack:///./node_modules/vexflow/src/tabslide.js","webpack:///./node_modules/vexflow/src/gracenote.js","webpack:///./node_modules/vexflow/src/gracetabnote.js","webpack:///./node_modules/vexflow/src/tuning.js","webpack:///./node_modules/vexflow/src/stavehairpin.js","webpack:///./node_modules/vexflow/src/curve.js","webpack:///./node_modules/vexflow/src/textdynamics.js","webpack:///./node_modules/vexflow/src/staveline.js","webpack:///./node_modules/vexflow/src/pedalmarking.js","webpack:///./node_modules/vexflow/src/textbracket.js","webpack:///./node_modules/vexflow/src/barnote.js","webpack:///./node_modules/vexflow/src/ghostnote.js","webpack:///./node_modules/vexflow/src/tremolo.js","webpack:///./node_modules/vexflow/src/crescendo.js","webpack:///./node_modules/vexflow/src/parser.js","webpack:///./node_modules/vexflow/src/easyscore.js","webpack:///./node_modules/vexflow/src/factory.js","webpack:///./node_modules/vexflow/src/system.js","webpack:///./node_modules/vexflow/src/index.js","webpack:///./node_modules/vexflow/src/keymanager.js","webpack:///./node_modules/core-js/library/modules/_cof.js","webpack:///./js/fretboard/const.js","webpack:///./js/fretboard/fretboard.js","webpack:///./js/fretboard/static.js","webpack:///./js/components/fretboardWrapper.jsx","webpack:///./js/components/scoreWrapper.jsx","webpack:///./js/components/infoTrack.jsx","webpack:///./js/components/buttons/stripButton.jsx","webpack:///./js/components/buttons/visibility.jsx","webpack:///./js/components/buttons/loop.jsx","webpack:///./node_modules/rc-slider/es/common/Track.js","webpack:///./node_modules/rc-util/es/Dom/addEventListener.js","webpack:///./node_modules/rc-slider/es/common/Steps.js","webpack:///./node_modules/rc-slider/es/common/Marks.js","webpack:///./node_modules/rc-slider/es/Handle.js","webpack:///./node_modules/rc-util/es/KeyCode.js","webpack:///./node_modules/rc-slider/es/utils.js","webpack:///./node_modules/rc-slider/es/common/createSlider.js","webpack:///./node_modules/rc-slider/es/Slider.js","webpack:///./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js","webpack:///./node_modules/rc-slider/es/Range.js","webpack:///./node_modules/rc-util/es/Dom/contains.js","webpack:///./node_modules/rc-util/es/ContainerRender.js","webpack:///./node_modules/rc-util/es/Portal.js","webpack:///./node_modules/dom-align/dist-web/index.js","webpack:///./node_modules/rc-trigger/es/utils.js","webpack:///./node_modules/rc-align/es/util.js","webpack:///./node_modules/rc-align/es/Align.js","webpack:///./node_modules/rc-align/es/index.js","webpack:///./node_modules/rc-util/es/unsafeLifecyclesPolyfill.js","webpack:///./node_modules/rc-animate/es/ChildrenUtils.js","webpack:///./node_modules/css-animation/es/Event.js","webpack:///./node_modules/css-animation/es/index.js","webpack:///./node_modules/rc-animate/es/util/animate.js","webpack:///./node_modules/rc-animate/es/AnimateChild.js","webpack:///./node_modules/rc-animate/es/Animate.js","webpack:///./node_modules/rc-trigger/es/LazyRenderBox.js","webpack:///./node_modules/rc-trigger/es/PopupInner.js","webpack:///./node_modules/rc-trigger/es/Popup.js","webpack:///./node_modules/rc-trigger/es/index.js","webpack:///./node_modules/rc-tooltip/es/placements.js","webpack:///./node_modules/rc-tooltip/es/Content.js","webpack:///./node_modules/rc-tooltip/es/Tooltip.js","webpack:///./node_modules/rc-tooltip/es/index.js","webpack:///./node_modules/rc-slider/es/index.js","webpack:///./node_modules/rc-slider/es/createSliderWithTooltip.js","webpack:///./js/components/buttons/sound.jsx","webpack:///./js/components/buttons/playPause.jsx","webpack:///./js/components/buttons/tempo.jsx","webpack:///./js/components/shared/keySelector.jsx","webpack:///./js/components/buttons/key.jsx","webpack:///./js/components/buttons/info.jsx","webpack:///./js/components/buttons/download.jsx","webpack:///./js/components/buttons/donate.jsx.js","webpack:///./js/components/buttonStrip.jsx","webpack:///./js/components/videoControl.jsx","webpack:///./js/components/barControl.jsx","webpack:///./js/components/centerControl.jsx","webpack:///./js/helpers/soundPlayer.js","webpack:///./js/components/content.jsx","webpack:///./js/app.js","webpack:///./node_modules/core-js/library/fn/object/get-own-property-descriptor.js","webpack:///./node_modules/core-js/library/modules/es6.object.assign.js","webpack:///./node_modules/core-js/library/modules/_dom-create.js","webpack:///./node_modules/core-js/library/modules/_html.js","webpack:///./node_modules/sample-player/lib/midi.js","webpack:///./node_modules/core-js/library/fn/symbol/iterator.js","webpack:///./node_modules/core-js/library/modules/es6.object.set-prototype-of.js","webpack:///./node_modules/core-js/library/modules/_object-keys.js","webpack:///./node_modules/babel-runtime/core-js/object/get-own-property-descriptor.js","webpack:///./node_modules/core-js/library/modules/_wks-ext.js","webpack:///./node_modules/core-js/library/fn/array/from.js","webpack:///./node_modules/core-js/library/modules/_is-object.js","webpack:///./node_modules/soundfont-player/lib/legacy.js","webpack:///./node_modules/core-js/library/modules/_array-includes.js","webpack:///./node_modules/babel-runtime/helpers/defineProperty.js","webpack:///./node_modules/core-js/library/modules/_shared-key.js","webpack:///./node_modules/core-js/library/modules/es6.object.define-property.js","webpack:///./node_modules/core-js/library/fn/object/assign.js","webpack:///./node_modules/core-js/library/modules/_library.js","webpack:///./node_modules/core-js/library/modules/_classof.js","webpack:///./node_modules/core-js/library/modules/_object-keys-internal.js","webpack:///./node_modules/core-js/library/modules/_to-iobject.js","webpack:///./node_modules/core-js/library/modules/_meta.js","webpack:///./node_modules/core-js/library/modules/_a-function.js","webpack:///./node_modules/object-assign/index.js","webpack:///./node_modules/core-js/library/modules/es6.array.from.js","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/core-js/library/modules/core.get-iterator-method.js","webpack:///./node_modules/react-dom/client.js","webpack:///./node_modules/sample-player/lib/player.js","webpack:///./node_modules/sample-player/lib/index.js","webpack:///./js/fretboard/fingerState.js","webpack:///./node_modules/core-js/library/modules/_is-array.js","webpack:///./node_modules/babel-runtime/helpers/extends.js","webpack:///./node_modules/core-js/library/modules/_has.js","webpack:///./node_modules/babel-runtime/core-js/symbol.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/babel-runtime/helpers/objectWithoutProperties.js","webpack:///./node_modules/babel-runtime/core-js/object/set-prototype-of.js","webpack:///./node_modules/babel-runtime/core-js/object/get-prototype-of.js","webpack:///./node_modules/core-js/library/modules/_object-gpo.js","webpack:///./node_modules/sample-player/node_modules/note-parser/index.js","webpack:///./node_modules/core-js/library/modules/_property-desc.js","webpack:///./node_modules/core-js/library/modules/_shared.js","webpack:///./node_modules/core-js/library/modules/_object-gopn-ext.js","webpack:///./node_modules/core-js/library/modules/_to-object.js","webpack:///./node_modules/babel-runtime/core-js/symbol/iterator.js","webpack:///./node_modules/audio-loader/lib/base64.js","webpack:///./node_modules/core-js/library/modules/_core.js","webpack:///./node_modules/core-js/library/modules/_enum-keys.js","webpack:///./node_modules/react/index.js","webpack:///./node_modules/core-js/library/fn/symbol/index.js","webpack:///./node_modules/core-js/library/modules/_object-pie.js","webpack:///./js/vextab/vextab.js","webpack:///./node_modules/core-js/library/modules/_global.js","webpack:///./node_modules/core-js/library/modules/_object-assign.js","webpack:///../deps/phoenix_html/priv/static/phoenix_html.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./node_modules/classnames/index.js","webpack:///./node_modules/core-js/library/modules/_iobject.js","webpack:///./node_modules/browser-request/index.js","webpack:///./node_modules/core-js/library/modules/_object-sap.js","webpack:///./node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js","webpack:///./node_modules/scheduler/cjs/scheduler.production.min.js","webpack:///./node_modules/babel-runtime/helpers/typeof.js","webpack:///./node_modules/babel-runtime/helpers/createClass.js","webpack:///./node_modules/core-js/library/modules/_defined.js","webpack:///./node_modules/babel-runtime/helpers/inherits.js","webpack:///./node_modules/core-js/library/modules/_wks-define.js","webpack:///./node_modules/core-js/library/modules/es6.string.iterator.js","webpack:///./node_modules/core-js/library/modules/_iter-detect.js","webpack:///./node_modules/core-js/library/modules/_iter-call.js","webpack:///./node_modules/core-js/library/modules/web.dom.iterable.js","webpack:///./node_modules/core-js/library/modules/_enum-bug-keys.js","webpack:///./node_modules/core-js/library/modules/es6.object.get-prototype-of.js","webpack:///./node_modules/core-js/library/modules/_descriptors.js","webpack:///./node_modules/core-js/library/modules/_iter-create.js","webpack:///./node_modules/core-js/library/fn/object/create.js","webpack:///./node_modules/core-js/library/modules/_object-dp.js","webpack:///./node_modules/core-js/library/modules/_export.js","webpack:///./node_modules/note-parser/index.js","webpack:///./node_modules/sample-player/lib/events.js","webpack:///./node_modules/core-js/library/modules/_iter-define.js","webpack:///./node_modules/core-js/library/modules/_ctx.js","webpack:///./node_modules/adsr/index.js","webpack:///./node_modules/sample-player/lib/scheduler.js","webpack:///./node_modules/core-js/library/modules/_uid.js","webpack:///./node_modules/component-indexof/index.js","webpack:///./js/helpers/scorePositionHelper.js","webpack:///./node_modules/core-js/library/modules/_to-integer.js","webpack:///./node_modules/babel-runtime/helpers/classCallCheck.js","webpack:///./node_modules/core-js/library/modules/es6.symbol.js","webpack:///./node_modules/warning/warning.js","webpack:///./node_modules/babel-runtime/core-js/array/from.js","webpack:///./node_modules/core-js/library/modules/_object-gops.js","webpack:///./node_modules/babel-runtime/core-js/object/define-property.js","webpack:///./node_modules/scheduler/index.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/node module decorator","webpack:///webpack/startup"],"sourcesContent":["'use strict'\n\nvar note = require('note-parser')\nvar isMidi = function (n) { return n !== null && n !== [] && n >= 0 && n < 129 }\nvar toMidi = function (n) { return isMidi(n) ? +n : note.midi(n) }\n\n// Adds note name to midi conversion\nmodule.exports = function (player) {\n  if (player.buffers) {\n    var map = player.opts.map\n    var toKey = typeof map === 'function' ? map : toMidi\n    var mapper = function (name) {\n      return name ? toKey(name) || name : null\n    }\n\n    player.buffers = mapBuffers(player.buffers, mapper)\n    var start = player.start\n    player.start = function (name, when, options) {\n      var key = mapper(name)\n      var dec = key % 1\n      if (dec) {\n        key = Math.floor(key)\n        options = Object.assign(options || {}, { cents: Math.floor(dec * 100) })\n      }\n      return start(key, when, options)\n    }\n  }\n  return player\n}\n\nfunction mapBuffers (buffers, toKey) {\n  return Object.keys(buffers).reduce(function (mapped, name) {\n    mapped[toKey(name)] = buffers[name]\n    return mapped\n  }, {})\n}\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","module.exports = {};\n","(function(e){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=e()}else if(typeof define===\"function\"&&define.amd){define([],e)}else{var t;if(typeof window!==\"undefined\"){t=window}else if(typeof global!==\"undefined\"){t=global}else if(typeof self!==\"undefined\"){t=self}else{t=this}t.midimessage=e()}})(function(){var e,t,s;return function o(e,t,s){function a(n,i){if(!t[n]){if(!e[n]){var l=typeof require==\"function\"&&require;if(!i&&l)return l(n,!0);if(r)return r(n,!0);var h=new Error(\"Cannot find module '\"+n+\"'\");throw h.code=\"MODULE_NOT_FOUND\",h}var c=t[n]={exports:{}};e[n][0].call(c.exports,function(t){var s=e[n][1][t];return a(s?s:t)},c,c.exports,o,e,t,s)}return t[n].exports}var r=typeof require==\"function\"&&require;for(var n=0;n<s.length;n++)a(s[n]);return a}({1:[function(e,t,s){\"use strict\";Object.defineProperty(s,\"__esModule\",{value:true});s[\"default\"]=function(e){function t(e){this._event=e;this._data=e.data;this.receivedTime=e.receivedTime;if(this._data&&this._data.length<2){console.warn(\"Illegal MIDI message of length\",this._data.length);return}this._messageCode=e.data[0]&240;this.channel=e.data[0]&15;switch(this._messageCode){case 128:this.messageType=\"noteoff\";this.key=e.data[1]&127;this.velocity=e.data[2]&127;break;case 144:this.messageType=\"noteon\";this.key=e.data[1]&127;this.velocity=e.data[2]&127;break;case 160:this.messageType=\"keypressure\";this.key=e.data[1]&127;this.pressure=e.data[2]&127;break;case 176:this.messageType=\"controlchange\";this.controllerNumber=e.data[1]&127;this.controllerValue=e.data[2]&127;if(this.controllerNumber===120&&this.controllerValue===0){this.channelModeMessage=\"allsoundoff\"}else if(this.controllerNumber===121){this.channelModeMessage=\"resetallcontrollers\"}else if(this.controllerNumber===122){if(this.controllerValue===0){this.channelModeMessage=\"localcontroloff\"}else{this.channelModeMessage=\"localcontrolon\"}}else if(this.controllerNumber===123&&this.controllerValue===0){this.channelModeMessage=\"allnotesoff\"}else if(this.controllerNumber===124&&this.controllerValue===0){this.channelModeMessage=\"omnimodeoff\"}else if(this.controllerNumber===125&&this.controllerValue===0){this.channelModeMessage=\"omnimodeon\"}else if(this.controllerNumber===126){this.channelModeMessage=\"monomodeon\"}else if(this.controllerNumber===127){this.channelModeMessage=\"polymodeon\"}break;case 192:this.messageType=\"programchange\";this.program=e.data[1];break;case 208:this.messageType=\"channelpressure\";this.pressure=e.data[1]&127;break;case 224:this.messageType=\"pitchbendchange\";var t=e.data[2]&127;var s=e.data[1]&127;this.pitchBend=(t<<8)+s;break}}return new t(e)};t.exports=s[\"default\"]},{}]},{},[1])(1)});\n//# sourceMappingURL=dist/index.js.map","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS103: Rewrite code to no longer use __guard__\n * DS202: Simplify dynamic range loops\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// VexTab Artist\n// Copyright 2012 Mohit Cheppudira <mohit@muthanna.com>\n//\n// This class is responsible for rendering the elements\n// parsed by Vex.Flow.VexTab.\n\nfunction __guard__(value, transform) {\n  return (typeof value !== 'undefined' && value !== null) ? transform(value) : undefined;\n}\n\nconst Vex = require('vexflow').default;\nconst _ = require('lodash');\n\nvar Artist = (function() {\n  let L = undefined;\n  let parseBool = undefined;\n  let makeDuration = undefined;\n  let makeBend = undefined;\n  let getFingering = undefined;\n  let getStrokeParts = undefined;\n  let getScoreArticulationParts = undefined;\n  Artist = class Artist {\n    static initClass() {\n      this.DEBUG = false;\n      L = function(...args) { if (Artist.DEBUG) { return (typeof console !== 'undefined' && console !== null ? console.log(\"(Vex.Flow.Artist)\", ...Array.from(args)) : undefined); } };\n\n      this.NOLOGO = true;\n\n      parseBool = str => str === \"true\";\n\n      makeDuration = (time, dot) => time + (dot ? \"d\" : \"\");\n\n      makeBend = function(from_fret, to_fret) {\n        let direction = Vex.Flow.Bend.UP;\n        let text = \"\";\n\n        if (parseInt(from_fret, 10) > parseInt(to_fret, 10)) {\n          direction = Vex.Flow.Bend.DOWN;\n        } else {\n          text = (() => { switch (Math.abs(to_fret - from_fret)) {\n            case 1: return \"1/2\";\n            case 2: return \"Full\";\n            case 3: return \"1 1/2\";\n            default: return `Bend to ${to_fret}`;\n          } })();\n        }\n\n        return {type: direction, text};\n      };\n\n      getFingering = text => text.match(/^\\.fingering\\/([^.]+)\\./);\n\n      getStrokeParts = text => text.match(/^\\.stroke\\/([^.]+)\\./);\n\n      getScoreArticulationParts = text => text.match(/^\\.(a[^\\/]*)\\/(t|b)[^.]*\\./);\n    }\n\n    constructor(x, y, width, options) {\n      this.x = x;\n      this.y = y;\n      this.width = width;\n      this.options = {\n        font_face: \"Arial\",\n        font_size: 10,\n        font_style: null,\n        bottom_spacing: 20 + (Artist.NOLOGO ? 0 : 10),\n        tab_stave_lower_spacing: 10,\n        note_stave_lower_spacing: 0,\n        scale: 1.0\n      };\n      if (options != null) { _.extend(this.options, options); }\n      this.reset();\n    }\n\n    reset() {\n      this.tuning = new Vex.Flow.Tuning();\n      this.key_manager = new Vex.Flow.KeyManager(\"C\");\n      this.music_api = new Vex.Flow.Music();\n\n      // User customizations\n      this.customizations = {\n        \"font-size\": this.options.font_size,\n        \"font-face\": this.options.font_face,\n        \"font-style\": this.options.font_style,\n        \"annotation-position\": \"bottom\",\n        \"scale\": this.options.scale,\n        \"width\": this.width,\n        \"stave-distance\": 0,\n        \"space\": 0,\n        \"player\": \"false\",\n        \"tempo\": 120,\n        \"instrument\": \"acoustic_grand_piano\",\n        \"accidentals\": \"standard\",  // standard / cautionary\n        \"tab-stems\": \"false\",\n        \"tab-stem-direction\": \"up\",\n        \"beam-rests\": \"true\",\n        \"beam-stemlets\": \"true\",\n        \"beam-middle-only\": \"false\",\n        \"connector-space\": 5\n      };\n\n      // Generated elements\n      this.staves = [];\n      this.tab_articulations = [];\n      this.stave_articulations = [];\n\n      // Voices for player\n      this.player_voices = [];\n\n      // Current state\n      this.last_y = this.y;\n      this.current_duration = \"q\";\n      this.current_clef = \"treble\";\n      this.current_bends = {};\n      this.current_octave_shift = 0;\n      this.bend_start_index = null;\n      this.bend_start_strings = null;\n      this.rendered = false;\n      return this.renderer_context = null;\n    }\n\n    attachPlayer(player) {\n      return this.player = player;\n    }\n\n    setOptions(options) {\n      L(\"setOptions: \", options);\n      // Set @customizations\n      const valid_options = _.keys(this.customizations);\n      for (let k in options) {\n        const v = options[k];\n        if (Array.from(valid_options).includes(k)) {\n          this.customizations[k] = v;\n        } else {\n          throw new Vex.RERR(\"ArtistError\", `Invalid option '${k}'`);\n        }\n      }\n\n      this.last_y += parseInt(this.customizations.space, 10);\n      if (this.customizations.player === \"true\") { return this.last_y += 15; }\n    }\n\n    getPlayerData() {\n      return {\n        voices: this.player_voices,\n        context: this.renderer_context,\n        scale: this.customizations.scale\n      };\n    }\n\n    render(renderer) {\n      let articulation;\n      L(\"Render: \", this.options);\n      this.closeBends();\n      renderer.resize(this.customizations.width * this.customizations.scale,\n          (this.last_y + this.options.bottom_spacing) * this.customizations.scale);\n      const ctx = renderer.getContext();\n      ctx.scale(this.customizations.scale, this.customizations.scale);\n      ctx.clear();\n      ctx.setFont(this.options.font_face, this.options.font_size, \"\");\n\n      this.renderer_context = ctx;\n\n      const setBar = function(stave, notes) {\n        const last_note = _.last(notes);\n        if (last_note instanceof Vex.Flow.BarNote) {\n          notes.pop();\n          //Setting the endbar type causes the stave to 'format'\n          //which causes the start_x to reset, resulting in malaligned notes and tabs\n          const tab_note_start_x = stave.getNoteStartX();\n          stave.setEndBarType(last_note.getType());\n          return stave.setNoteStartX(tab_note_start_x);\n        }\n      };\n\n      for (let stave of Array.from(this.staves)) {\n        L(\"Rendering staves.\");\n        // If the last note is a bar, then remove it and render it as a stave modifier.\n        if (stave.tab != null) { setBar(stave.tab, stave.tab_notes); }\n        if (stave.note != null) { setBar(stave.note, stave.note_notes); }\n\n        if (stave.tab != null) { stave.tab.setContext(ctx).draw(); }\n        if (stave.note != null) { stave.note.setContext(ctx).draw(); }\n\n        stave.tab_voices.push(stave.tab_notes);\n        stave.note_voices.push(stave.note_notes);\n\n        const voices = this.formatAndRender(ctx,\n                        (stave.tab != null) ? {stave: stave.tab, voices: stave.tab_voices} : null,\n                        (stave.note != null) ? {stave: stave.note, voices: stave.note_voices} : null,\n                        stave.text_voices,\n                        this.customizations,\n                        {beam_groups: stave.beam_groups});\n\n        this.player_voices.push(voices);\n      }\n\n      L(\"Rendering tab articulations.\");\n      for (articulation of Array.from(this.tab_articulations)) {\n        articulation.setContext(ctx).draw();\n      }\n\n      L(\"Rendering note articulations.\");\n      for (articulation of Array.from(this.stave_articulations)) {\n        articulation.setContext(ctx).draw();\n      }\n\n      if (this.player != null) {\n        if (this.customizations.player === \"true\") {\n          this.player.setTempo(parseInt(this.customizations.tempo, 10));\n          this.player.setInstrument(this.customizations.instrument);\n          this.player.render();\n        } else {\n          this.player.removeControls();\n        }\n      }\n      this.rendered = true;\n\n      if (!Artist.NOLOGO) {\n        const LOGO = \"vexflow.com\";\n        const {\n          width\n        } = ctx.measureText(LOGO);\n        ctx.save();\n        ctx.setFont(\"Times\", 10, \"italic\");\n        ctx.fillText(LOGO, (this.customizations.width - width) / 2, this.last_y + 25);\n        return ctx.restore();\n      }\n    }\n\n    formatAndRender(ctx, tab, score, text_notes, customizations, options) {\n      let i, multi_voice, notes, score_stave, tab_stave, voice;\n      if (tab != null) { tab_stave = tab.stave; }\n      if (score != null) { score_stave = score.stave; }\n\n      const tab_voices = [];\n      const score_voices = [];\n      const text_voices = [];\n      let beams = [];\n      let format_stave = null;\n      let text_stave = null;\n\n      const beam_config = {\n        beam_rests: parseBool(customizations[\"beam-rests\"]),\n        show_stemlets: parseBool(customizations[\"beam-stemlets\"]),\n        beam_middle_only: parseBool(customizations[\"beam-middle-only\"]),\n        groups: options.beam_groups\n      };\n\n      if (tab != null) {\n        multi_voice = (tab.voices.length > 1) ? true : false;\n        for (i = 0; i < tab.voices.length; i++) {\n          notes = tab.voices[i];\n          if (_.isEmpty(notes)) { continue; }\n          _.each(notes, note => note.setStave(tab_stave));\n          voice = new Vex.Flow.Voice(Vex.Flow.TIME4_4).\n            setMode(Vex.Flow.Voice.Mode.SOFT);\n          voice.addTickables(notes);\n          tab_voices.push(voice);\n\n          if (customizations[\"tab-stems\"] === \"true\") {\n            if (multi_voice) {\n              beam_config.stem_direction = i === 0 ? 1 : -1;\n            } else {\n              beam_config.stem_direction = customizations[\"tab-stem-direction\"] === \"down\" ? -1 : 1;\n            }\n\n            beam_config.beam_rests = false;\n            beams = beams.concat(Vex.Flow.Beam.generateBeams(voice.getTickables(), beam_config));\n          }\n        }\n\n        format_stave = tab_stave;\n        text_stave = tab_stave;\n      }\n\n      beam_config.beam_rests = parseBool(customizations[\"beam-rests\"]);\n\n      if (score != null) {\n        multi_voice = (score.voices.length > 1) ? true : false;\n        for (i = 0; i < score.voices.length; i++) {\n          notes = score.voices[i];\n          if (_.isEmpty(notes)) { continue; }\n          const stem_direction = i === 0 ? 1 : -1;\n          _.each(notes, note => note.setStave(score_stave));\n\n          voice = new Vex.Flow.Voice(Vex.Flow.TIME4_4).\n            setMode(Vex.Flow.Voice.Mode.SOFT);\n          voice.addTickables(notes);\n          score_voices.push(voice);\n          if (multi_voice) {\n            beam_config.stem_direction = stem_direction;\n            beams = beams.concat(Vex.Flow.Beam.generateBeams(notes, beam_config));\n          } else {\n            beam_config.stem_direction = null;\n            beams = beams.concat(Vex.Flow.Beam.generateBeams(notes, beam_config));\n          }\n        }\n\n        format_stave = score_stave;\n        text_stave = score_stave;\n      }\n\n      for (notes of Array.from(text_notes)) {\n        if (_.isEmpty(notes)) { continue; }\n        _.each(notes, voice => voice.setStave(text_stave));\n        voice = new Vex.Flow.Voice(Vex.Flow.TIME4_4).\n            setMode(Vex.Flow.Voice.Mode.SOFT);\n        voice.addTickables(notes);\n        text_voices.push(voice);\n      }\n\n      if (format_stave != null) {\n        let format_voices = [];\n        const formatter = new Vex.Flow.Formatter();\n        let align_rests = false;\n\n        if (tab != null) {\n          if (!_.isEmpty(tab_voices)) { formatter.joinVoices(tab_voices); }\n          format_voices = tab_voices;\n        }\n\n        if (score != null) {\n          if (!_.isEmpty(score_voices)) { formatter.joinVoices(score_voices); }\n          format_voices = format_voices.concat(score_voices);\n          if (score_voices.length > 1) { align_rests = true; }\n        }\n\n        if (!_.isEmpty(text_notes) && !_.isEmpty(text_voices)) {\n          formatter.joinVoices(text_voices);\n          format_voices = format_voices.concat(text_voices);\n        }\n\n        if (!_.isEmpty(format_voices)) { formatter.formatToStave(format_voices, format_stave, {align_rests}); }\n\n        if (tab != null) { _.each(tab_voices, voice => voice.draw(ctx, tab_stave)); }\n        if (score != null) { _.each(score_voices, voice => voice.draw(ctx, score_stave)); }\n        _.each(beams, beam => beam.setContext(ctx).draw());\n        if (!_.isEmpty(text_notes)) { _.each(text_voices, voice => voice.draw(ctx, text_stave)); }\n\n        if ((tab != null) && (score != null)) {\n          if(this.renderConnector){\n            (new Vex.Flow.StaveConnector(score.stave, tab.stave))\n            .setType(Vex.Flow.StaveConnector.type.BRACKET)\n            .setContext(ctx).draw();\n          }\n        }\n\n        if (score != null) { return score_voices; } else { return tab_voices; }\n      }\n    }\n\n    isRendered() { return this.rendered; }\n\n    draw(renderer) { return this.render(renderer); }\n\n    // Given a fret/string pair, returns a note, octave, and required accidentals\n    // based on current guitar tuning and stave key. The accidentals may be different\n    // for repeats of the same notes because they get set (or cancelled) by the Key\n    // Manager.\n    getNoteForFret(fret, string) {\n      const spec = this.tuning.getNoteForFret(fret, string);\n      const spec_props = Vex.Flow.keyProperties(spec);\n\n      const selected_note = this.key_manager.selectNote(spec_props.key);\n      let accidental = null;\n\n      // Do we need to specify an explicit accidental?\n      switch (this.customizations.accidentals) {\n        case \"standard\":\n          if (selected_note.change) {\n            accidental = (selected_note.accidental != null) ? selected_note.accidental : \"n\";\n          }\n          break;\n        case \"cautionary\":\n          if (selected_note.change) {\n            accidental = (selected_note.accidental != null) ? selected_note.accidental : \"n\";\n          } else {\n            accidental = (selected_note.accidental != null) ? selected_note.accidental + \"_c\" : undefined;\n          }\n          break;\n        default:\n          throw new Vex.RERR(\"ArtistError\", `Invalid value for option 'accidentals': ${this.customizations.accidentals}`);\n      }\n\n      const new_note = selected_note.note;\n      let new_octave = spec_props.octave;\n\n      // TODO(0xfe): This logic should probably be in the KeyManager code\n      const old_root = this.music_api.getNoteParts(spec_props.key).root;\n      const new_root = this.music_api.getNoteParts(selected_note.note).root;\n\n      // Figure out if there's an octave shift based on what the Key\n      // Manager just told us about the note.\n      if ((new_root === \"b\") && (old_root === \"c\")) {\n        new_octave--;\n      } else if ((new_root === \"c\") && (old_root === \"b\")) {\n        new_octave++;\n      }\n\n      return [new_note, new_octave, accidental];\n    }\n\n    getNoteForABC(abc, string) {\n      const {\n        key\n      } = abc;\n      const octave = string;\n      let {\n        accidental\n      } = abc;\n      if (abc.accidental_type != null) { accidental += `_${abc.accidental_type}`; }\n      return [key, octave, accidental];\n    }\n\n    addStaveNote(note_params) {\n      const params = {\n        is_rest: false,\n        play_note: null\n      };\n\n      _.extend(params, note_params);\n      const stave_notes = _.last(this.staves).note_notes;\n      const stave_note = new Vex.Flow.StaveNote({\n        keys: params.spec,\n        duration: this.current_duration + (params.is_rest ? \"r\" : \"\"),\n        clef: params.is_rest ? \"treble\" : this.current_clef,\n        auto_stem: params.is_rest ? false : true\n      });\n      for (let index = 0; index < params.accidentals.length; index++) {\n        const acc = params.accidentals[index];\n        if (acc != null) {\n          const parts = acc.split(\"_\");\n          const new_accidental = new Vex.Flow.Accidental(parts[0]);\n\n          if ((parts.length > 1) && (parts[1] === \"c\")) {\n            new_accidental.setAsCautionary();\n          }\n\n          stave_note.addAccidental(index, new_accidental);\n        }\n      }\n\n      if (this.current_duration[this.current_duration.length - 1] === \"d\") {\n        stave_note.addDotToAll();\n      }\n\n      if (params.play_note != null) { stave_note.setPlayNote(params.play_note); }\n      return stave_notes.push(stave_note);\n    }\n\n    addTabNote(spec, play_note=null) {\n      const {\n        tab_notes\n      } = _.last(this.staves);\n      const new_tab_note = new Vex.Flow.TabNote({\n        positions: spec,\n        duration: this.current_duration\n        }, (this.customizations[\"tab-stems\"] === \"true\")\n      );\n      if (play_note != null) { new_tab_note.setPlayNote(play_note); }\n      tab_notes.push(new_tab_note);\n\n      if (this.current_duration[this.current_duration.length - 1] === \"d\") {\n        return new_tab_note.addDot();\n      }\n    }\n    setDuration(time, dot) {\n      if (dot == null) { dot = false; }\n      const t = time.split(/\\s+/);\n      L(\"setDuration: \", t[0], dot);\n      return this.current_duration = makeDuration(t[0], dot);\n    }\n\n    addBar(type) {\n      L(\"addBar: \", type);\n      this.closeBends();\n      this.key_manager.reset();\n      const stave = _.last(this.staves);\n\n      const TYPE = Vex.Flow.Barline.type;\n      type = (() => { switch (type) {\n        case \"single\":\n          return TYPE.SINGLE;\n        case \"double\":\n          return TYPE.DOUBLE;\n        case \"end\":\n          return TYPE.END;\n        case \"repeat-begin\":\n          return TYPE.REPEAT_BEGIN;\n        case \"repeat-end\":\n          return TYPE.REPEAT_END;\n        case \"repeat-both\":\n          return TYPE.REPEAT_BOTH;\n        default:\n          return TYPE.SINGLE;\n      } })();\n\n      const bar_note = new Vex.Flow.BarNote().setType(type);\n      stave.tab_notes.push(bar_note);\n      if (stave.note != null) { return stave.note_notes.push(bar_note); }\n    }\n\n    openBends(first_note, last_note, first_indices, last_indices) {\n      L(\"openBends\", first_note, last_note, first_indices, last_indices);\n      const {\n        tab_notes\n      } = _.last(this.staves);\n\n      let start_note = first_note;\n      let start_indices = first_indices;\n      if (_.isEmpty(this.current_bends)) {\n        this.bend_start_index = tab_notes.length - 2;\n        this.bend_start_strings = first_indices;\n      } else {\n        start_note = tab_notes[this.bend_start_index];\n        start_indices = this.bend_start_strings;\n      }\n\n      const first_frets = start_note.getPositions();\n      const last_frets = last_note.getPositions();\n      return (() => {\n        const result = [];\n        for (let i = 0; i < start_indices.length; i++) {\n          const index = start_indices[i];\n          const last_index = last_indices[i];\n          const from_fret = first_note.getPositions()[first_indices[i]];\n          const to_fret = last_frets[last_index];\n          if (this.current_bends[index] == null) { this.current_bends[index] = []; }\n          result.push(this.current_bends[index].push(makeBend(from_fret.fret, to_fret.fret)));\n        }\n        return result;\n      })();\n    }\n\n    // Close and apply all the bends to the last N notes.\n    closeBends(offset) {\n      if (offset == null) { offset = 1; }\n      if (this.bend_start_index == null) { return; }\n      L(`closeBends(${offset})`);\n      const {\n        tab_notes\n      } = _.last(this.staves);\n      for (let k in this.current_bends) {\n        const v = this.current_bends[k];\n        const phrase = [];\n        for (let bend of Array.from(v)) {\n          phrase.push(bend);\n        }\n        tab_notes[this.bend_start_index].addModifier(\n          new Vex.Flow.Bend(null, null, phrase), k);\n      }\n\n      // Replace bent notes with ghosts (make them invisible)\n      for (let tab_note of Array.from(tab_notes.slice(this.bend_start_index+1, +((tab_notes.length - 2) + offset) + 1 || undefined))) {\n        tab_note.setGhost(true);\n      }\n\n      this.current_bends = {};\n      return this.bend_start_index = null;\n    }\n\n    makeTuplets(tuplets, notes) {\n      L(\"makeTuplets\", tuplets, notes);\n      if (notes == null) { notes = tuplets; }\n      if (!_.last(this.staves).note) { return; }\n      const stave_notes = _.last(this.staves).note_notes;\n      const {\n        tab_notes\n      } = _.last(this.staves);\n\n      if (stave_notes.length < notes) { throw new Vex.RERR(\"ArtistError\", \"Not enough notes for tuplet\"); }\n      const modifier = new Vex.Flow.Tuplet(stave_notes.slice(stave_notes.length - notes), {num_notes: tuplets});\n      this.stave_articulations.push(modifier);\n\n      // Creating a Vex.Flow.Tuplet corrects the ticks for the notes, so it needs to\n      // be created whether or not it gets rendered. Below, if tab stems are not required\n      // the created tuplet is simply thrown away.\n      const tab_modifier = new Vex.Flow.Tuplet(tab_notes.slice(tab_notes.length - notes), {num_notes: tuplets});\n      if (this.customizations[\"tab-stems\"] === \"true\") {\n        return this.tab_articulations.push(tab_modifier);\n      }\n    }\n    makeFingering(text) {\n      const parts = getFingering(text);\n      const POS = Vex.Flow.Modifier.Position;\n      let fingers = [];\n      const fingering = [];\n\n      if (parts != null) {\n        fingers = (Array.from(parts[1].split(/-/)).map((p) => p.trim()));\n      } else {\n        return null;\n      }\n\n      const badFingering = () => new Vex.RERR(\"ArtistError\", `Bad fingering: ${parts[1]}`);\n\n      for (let finger of Array.from(fingers)) {\n        const pieces = finger.match(/(\\d+):([ablr]):([fs]):([^-.]+)/);\n        if (pieces == null) { throw badFingering(); }\n\n        const note_number = parseInt(pieces[1], 10) - 1;\n        let position = POS.RIGHT;\n        switch (pieces[2]) {\n          case \"l\":\n            position = POS.LEFT;\n            break;\n          case \"r\":\n            position = POS.RIGHT;\n            break;\n          case \"a\":\n            position = POS.ABOVE;\n            break;\n          case \"b\":\n            position = POS.BELOW;\n            break;\n        }\n\n        let modifier = null;\n        const number = pieces[4];\n        switch (pieces[3]) {\n          case \"s\":\n            modifier = new Vex.Flow.StringNumber(number).setPosition(position);\n            break;\n          case \"f\":\n            modifier = new Vex.Flow.FretHandFinger(number).setPosition(position);\n            break;\n        }\n\n        fingering.push({num: note_number, modifier});\n      }\n\n      return fingering;\n    }\n    makeStroke(text) {\n      const parts = getStrokeParts(text);\n      const TYPE = Vex.Flow.Stroke.Type;\n      let type = null;\n\n      if (parts != null) {\n        switch (parts[1]) {\n          case \"bu\":\n            type = TYPE.BRUSH_UP;\n            break;\n          case \"bd\":\n            type = TYPE.BRUSH_DOWN;\n            break;\n          case \"ru\":\n            type = TYPE.ROLL_UP;\n            break;\n          case \"rd\":\n            type = TYPE.ROLL_DOWN;\n            break;\n          case \"qu\":\n            type = TYPE.RASQUEDO_UP;\n            break;\n          case \"qd\":\n            type = TYPE.RASQUEDO_DOWN;\n            break;\n          default:\n            throw new Vex.RERR(\"ArtistError\", `Invalid stroke type: ${parts[1]}`);\n        }\n        return new Vex.Flow.Stroke(type);\n      } else {\n        return null;\n      }\n    }\n    makeScoreArticulation(text) {\n      const parts = getScoreArticulationParts(text);\n      if (parts != null) {\n        const type = parts[1];\n        const position = parts[2];\n\n        const POSTYPE = Vex.Flow.Modifier.Position;\n        const pos = position === \"t\" ? POSTYPE.ABOVE : POSTYPE.BELOW;\n        return new Vex.Flow.Articulation(type).setPosition(pos);\n      } else { return null; }\n    }\n\n    makeAnnotation(text) {\n      let font_face = this.customizations[\"font-face\"];\n      let font_size = this.customizations[\"font-size\"];\n      let font_style = this.customizations[\"font-style\"];\n      const aposition = this.customizations[\"annotation-position\"];\n\n      const VJUST = Vex.Flow.Annotation.VerticalJustify;\n      const default_vjust = aposition === \"top\" ? VJUST.TOP : VJUST.BOTTOM;\n\n      const makeIt = function(text, just) {\n        if (just == null) { just = default_vjust; }\n        return new Vex.Flow.Annotation(text).\n          setFont(font_face, font_size, font_style).\n          setVerticalJustification(just);\n      };\n\n      let parts = text.match(/^\\.([^-]*)-([^-]*)-([^.]*)\\.(.*)/);\n      if (parts != null) {\n        font_face = parts[1];\n        font_size = parts[2];\n        font_style = parts[3];\n        text = parts[4];\n        if (text) { return makeIt(text); } else { return null; }\n      }\n\n      parts = text.match(/^\\.([^.]*)\\.(.*)/);\n      if (parts != null) {\n        let just = default_vjust;\n        text = parts[2];\n        switch (parts[1]) {\n          case \"big\":\n            font_style = \"bold\";\n            font_size = \"14\";\n            break;\n          case \"italic\": case \"italics\":\n            font_face = \"Times\";\n            font_style = \"italic\";\n            break;\n          case \"medium\":\n            font_size = \"12\";\n            break;\n          case \"top\":\n            just = VJUST.TOP;\n            this.customizations[\"annotation-position\"] = \"top\";\n            break;\n          case \"bottom\":\n            just = VJUST.BOTTOM;\n            this.customizations[\"annotation-position\"] = \"bottom\";\n            break;\n        }\n        if (text) { return makeIt(text, just); } else { return null; }\n      }\n\n      return makeIt(text);\n    }\n\n    addAnnotations(annotations) {\n      let annotation, i, note, score_articulation, stroke;\n      const stave = _.last(this.staves);\n      const stave_notes = stave.note_notes;\n      const {\n        tab_notes\n      } = stave;\n\n      if (annotations.length > tab_notes.length) {\n        throw new Vex.RERR(\"ArtistError\", \"More annotations than note elements\");\n      }\n\n      // Add text annotations\n      if (stave.tab) {\n        const iterable = tab_notes.slice(tab_notes.length - annotations.length);\n        for (i = 0; i < iterable.length; i++) {\n          const tab_note = iterable[i];\n          if (getScoreArticulationParts(annotations[i])) {\n            score_articulation = this.makeScoreArticulation(annotations[i]);\n            tab_note.addModifier(score_articulation, 0);\n          } else if (getStrokeParts(annotations[i])) {\n            stroke = this.makeStroke(annotations[i]);\n            tab_note.addModifier(stroke, 0);\n          } else {\n            annotation = this.makeAnnotation(annotations[i]);\n            if (annotation) { tab_note.addModifier(this.makeAnnotation(annotations[i]), 0); }\n          }\n        }\n      } else {\n        const iterable1 = stave_notes.slice(stave_notes.length - annotations.length);\n        for (i = 0; i < iterable1.length; i++) {\n          note = iterable1[i];\n          if (!getScoreArticulationParts(annotations[i])) {\n            annotation = this.makeAnnotation(annotations[i]);\n            if (annotation) { note.addAnnotation(0, this.makeAnnotation(annotations[i])); }\n          }\n        }\n      }\n\n      // Add glyph articulations, strokes, or fingerings on score\n      if (stave.note) {\n        return (() => {\n          const result = [];\n          const iterable2 = stave_notes.slice(stave_notes.length - annotations.length);\n          for (i = 0; i < iterable2.length; i++) {\n            note = iterable2[i];\n            score_articulation = this.makeScoreArticulation(annotations[i]);\n            if (score_articulation != null) { note.addArticulation(0, score_articulation); }\n\n            stroke = this.makeStroke(annotations[i]);\n            if (stroke != null) { note.addStroke(0, stroke); }\n\n            const fingerings = this.makeFingering(annotations[i]);\n            if (fingerings != null) {\n              try {\n                result.push((Array.from(fingerings).map((fingering) => note.addModifier(fingering.num, fingering.modifier))));\n              } catch (e) {\n                throw new Vex.RERR(\"ArtistError\", `Bad note number in fingering: ${annotations[i]}`);\n              }\n            } else {\n              result.push(undefined);\n            }\n          }\n          return result;\n        })();\n      }\n    }\n\n    addTabArticulation(type, first_note, last_note, first_indices, last_indices) {\n      L(\"addTabArticulations: \", type, first_note, last_note, first_indices, last_indices);\n\n      if (type === \"t\") {\n        last_note.addModifier(\n          new Vex.Flow.Annotation(\"T\").\n            setVerticalJustification(Vex.Flow.Annotation.VerticalJustify.BOTTOM));\n      }\n\n      if (_.isEmpty(first_indices) && _.isEmpty(last_indices)) { return; }\n\n      let articulation = null;\n\n      if (type === \"s\") {\n        articulation = new Vex.Flow.TabSlide({\n          first_note,\n          last_note,\n          first_indices,\n          last_indices\n          });\n      }\n\n      if ([\"h\", \"p\"].includes(type)) {\n        articulation = new Vex.Flow.TabTie({\n          first_note,\n          last_note,\n          first_indices,\n          last_indices\n          }, type.toUpperCase());\n      }\n\n      if ([\"T\", \"t\"].includes(type)) {\n        articulation = new Vex.Flow.TabTie({\n          first_note,\n          last_note,\n          first_indices,\n          last_indices\n          }, \" \");\n      }\n\n      if (type === \"b\") {\n        this.openBends(first_note, last_note, first_indices, last_indices);\n      }\n\n      if (articulation != null) { return this.tab_articulations.push(articulation); }\n    }\n\n    addStaveArticulation(type, first_note, last_note, first_indices, last_indices) {\n      L(\"addStaveArticulations: \", type, first_note, last_note, first_indices, last_indices);\n      let articulation = null;\n      if ([\"b\", \"s\", \"h\", \"p\", \"t\", \"T\"].includes(type)) {\n        articulation = new Vex.Flow.StaveTie({\n          first_note,\n          last_note,\n          first_indices,\n          last_indices\n          });\n      }\n\n      if (articulation != null) { return this.stave_articulations.push(articulation); }\n    }\n\n    // This gets the previous (second-to-last) non-bar non-ghost note.\n    getPreviousNoteIndex() {\n      const {\n        tab_notes\n      } = _.last(this.staves);\n      let index = 2;\n      while (index <= tab_notes.length) {\n        const note = tab_notes[tab_notes.length - index];\n        if (note instanceof Vex.Flow.TabNote) { return (tab_notes.length - index); }\n        index++;\n      }\n\n      return -1;\n    }\n\n    addDecorator(decorator) {\n      L(\"addDecorator: \", decorator);\n      if (decorator == null) { return; }\n\n      const stave = _.last(this.staves);\n      const {\n        tab_notes\n      } = stave;\n      const score_notes = stave.note_notes;\n      let modifier = null;\n      let score_modifier = null;\n\n      if (decorator === \"v\") {\n        modifier = new Vex.Flow.Vibrato();\n      }\n      if (decorator === \"V\") {\n        modifier = new Vex.Flow.Vibrato().setHarsh(true);\n      }\n      if (decorator === \"u\") {\n        modifier = new Vex.Flow.Articulation(\"a|\").setPosition(Vex.Flow.Modifier.Position.BOTTOM);\n        score_modifier = new Vex.Flow.Articulation(\"a|\").setPosition(Vex.Flow.Modifier.Position.BOTTOM);\n      }\n      if (decorator === \"d\") {\n        modifier = new Vex.Flow.Articulation(\"am\").setPosition(Vex.Flow.Modifier.Position.BOTTOM);\n        score_modifier = new Vex.Flow.Articulation(\"am\").setPosition(Vex.Flow.Modifier.Position.BOTTOM);\n      }\n\n      if (modifier != null) { _.last(tab_notes).addModifier(modifier, 0); }\n      if (score_modifier != null) { return __guard__(_.last(score_notes), x => x.addArticulation(0, score_modifier)); }\n    }\n\n\n    addArticulations(articulations) {\n      let i, n;\n      L(\"addArticulations: \", articulations);\n      const stave = _.last(this.staves);\n      const {\n        tab_notes\n      } = stave;\n      const stave_notes = stave.note_notes;\n      if (_.isEmpty(tab_notes) || _.isEmpty(articulations)) {\n        this.closeBends(0);\n        return;\n      }\n\n      const current_tab_note = _.last(tab_notes);\n\n      let has_bends = false;\n      for (var valid_articulation of [\"b\", \"s\", \"h\", \"p\", \"t\", \"T\", \"v\", \"V\"]) {\n        var current_indices, prev_indices, prev_tab_note;\n        var indices = ((() => {\n          const result = [];\n          for (i = 0; i < articulations.length; i++) {\n            const art = articulations[i];\n            if ((art != null) && (art === valid_articulation)) {\n              result.push(i);\n            }\n          }\n          return result;\n        })());\n        if (_.isEmpty(indices)) { continue; }\n\n        if (valid_articulation === \"b\") { has_bends = true; }\n        const prev_index = this.getPreviousNoteIndex();\n        if (prev_index === -1) {\n          prev_tab_note = null;\n          prev_indices = null;\n        } else {\n          prev_tab_note = tab_notes[prev_index];\n          // Figure out which strings the articulations are on\n          var this_strings = ((() => {\n            const result1 = [];\n            const iterable = current_tab_note.getPositions();\n            for (i = 0; i < iterable.length; i++) {\n              n = iterable[i];\n              if (Array.from(indices).includes(i)) {\n                result1.push(n.str);\n              }\n            }\n            return result1;\n          })());\n\n          // Only allows articulations where both notes are on the same strings\n          var valid_strings = ((() => {\n            const result2 = [];\n            const iterable1 = prev_tab_note.getPositions();\n            for (i = 0; i < iterable1.length; i++) {\n              const pos = iterable1[i];\n              if (Array.from(this_strings).includes(pos.str)) {\n                result2.push(pos.str);\n              }\n            }\n            return result2;\n          })());\n\n          // Get indices of articulated notes on previous chord\n          prev_indices = ((() => {\n            const result3 = [];\n            const iterable2 = prev_tab_note.getPositions();\n            for (i = 0; i < iterable2.length; i++) {\n              n = iterable2[i];\n              if (Array.from(valid_strings).includes(n.str)) {\n                result3.push(i);\n              }\n            }\n            return result3;\n          })());\n\n          // Get indices of articulated notes on current chord\n          current_indices = ((() => {\n            const result4 = [];\n            const iterable3 = current_tab_note.getPositions();\n            for (i = 0; i < iterable3.length; i++) {\n              n = iterable3[i];\n              if (Array.from(valid_strings).includes(n.str)) {\n                result4.push(i);\n              }\n            }\n            return result4;\n          })());\n        }\n\n        if (stave.tab != null) {\n          this.addTabArticulation(valid_articulation,\n            prev_tab_note, current_tab_note, prev_indices, current_indices);\n        }\n\n        if (stave.note != null) {\n          this.addStaveArticulation(valid_articulation,\n            stave_notes[prev_index], _.last(stave_notes),\n            prev_indices, current_indices);\n        }\n      }\n\n      if (!has_bends) { return this.closeBends(0); }\n    }\n\n    addRest(params) {\n      let position;\n      L(\"addRest: \", params);\n      this.closeBends();\n\n      if (params[\"position\"] === 0) {\n        this.addStaveNote({\n          spec: [\"r/4\"],\n          accidentals: [],\n          is_rest: true\n        });\n      } else {\n        position = this.tuning.getNoteForFret((parseInt(params[\"position\"], 10) + 5) * 2, 6);\n        this.addStaveNote({\n          spec: [position],\n          accidentals: [],\n          is_rest: true\n        });\n      }\n\n      const {\n        tab_notes\n      } = _.last(this.staves);\n      if (this.customizations[\"tab-stems\"] === \"true\") {\n        const tab_note = new Vex.Flow.StaveNote({\n          keys: [position || \"r/4\"],\n          duration: this.current_duration + \"r\",\n          clef: \"treble\",\n          auto_stem: false\n        });\n        if (this.current_duration[this.current_duration.length - 1] === \"d\") {\n          tab_note.addDot(0);\n        }\n        return tab_notes.push(tab_note);\n      } else {\n        return tab_notes.push(new Vex.Flow.GhostNote(this.current_duration));\n      }\n    }\n\n    addChord(chord, chord_articulation, chord_decorator) {\n      let current_duration, note, play_note;\n      if (_.isEmpty(chord)) { return; }\n      L(\"addChord: \", chord);\n      const stave = _.last(this.staves);\n\n      const specs = [];          // The stave note specs\n      const play_notes = [];     // Notes to be played by audio players\n      const accidentals = [];    // The stave accidentals\n      const articulations = [];  // Articulations (ties, bends, taps)\n      const decorators = [];     // Decorators (vibratos, harmonics)\n      const tab_specs = [];      // The tab notes\n      const durations = [];      // The duration of each position\n      let num_notes = 0;\n\n      // Chords are complicated, because they can contain little\n      // lines one each string. We need to keep track of the motion\n      // of each line so we know which tick they belong in.\n      let current_string = _.first(chord).string;\n      let current_position = 0;\n\n      for (note of Array.from(chord)) {\n        num_notes++;\n        if ((note.abc != null) || (note.string !== current_string)) {\n          current_position = 0;\n          current_string = note.string;\n        }\n\n        if (specs[current_position] == null) {\n          // New position. Create new element arrays for this\n          // position.\n          specs[current_position] = [];\n          play_notes[current_position] = [];\n          accidentals[current_position] = [];\n          tab_specs[current_position] = [];\n          articulations[current_position] = [];\n          decorators[current_position] = [];\n        }\n\n        let [new_note, new_octave, accidental] = Array.from([null, null, null]);\n\n        play_note = null;\n\n        if (note.abc != null) {\n          var acc;\n          const octave = (note.octave != null) ? note.octave : note.string;\n          [new_note, new_octave, accidental] = Array.from(this.getNoteForABC(note.abc, octave));\n          if (accidental != null) {\n            acc = accidental.split(\"_\")[0];\n          } else {\n            acc = \"\";\n          }\n\n          play_note = `${new_note}${acc}`;\n          if (note.fret == null) { note.fret = 'X'; }\n        } else if (note.fret != null) {\n          [new_note, new_octave, accidental] = Array.from(this.getNoteForFret(note.fret, note.string));\n          play_note = this.tuning.getNoteForFret(note.fret, note.string).split(\"/\")[0];\n        } else {\n          throw new Vex.RERR(\"ArtistError\", \"No note specified\");\n        }\n\n        const play_octave = parseInt(new_octave, 10) + this.current_octave_shift;\n\n        current_duration = (note.time != null) ? {time: note.time, dot: note.dot} : null;\n        specs[current_position].push(`${new_note}/${new_octave}`);\n        play_notes[current_position].push(`${play_note}/${play_octave}`);\n        accidentals[current_position].push(accidental);\n        tab_specs[current_position].push({fret: note.fret, str: note.string});\n        if (note.articulation != null) { articulations[current_position].push(note.articulation); }\n        durations[current_position] = current_duration;\n        if (note.decorator != null) { decorators[current_position] = note.decorator; }\n\n        current_position++;\n      }\n\n      for (let i = 0; i < specs.length; i++) {\n        const spec = specs[i];\n        const saved_duration = this.current_duration;\n        if (durations[i] != null) { this.setDuration(durations[i].time, durations[i].dot); }\n        this.addTabNote(tab_specs[i], play_notes[i]);\n        if (stave.note != null) { this.addStaveNote({spec, accidentals: accidentals[i], play_note: play_notes[i]}); }\n        this.addArticulations(articulations[i]);\n        if (decorators[i] != null) { this.addDecorator(decorators[i]); }\n      }\n\n      if (chord_articulation != null) {\n        const art = [];\n        for (let num = 1, end = num_notes, asc = 1 <= end; asc ? num <= end : num >= end; asc ? num++ : num--) { art.push(chord_articulation); }\n        this.addArticulations(art);\n      }\n\n      if (chord_decorator != null) { return this.addDecorator(chord_decorator); }\n    }\n\n    addNote(note) {\n      return this.addChord([note]);\n    }\n\n    addTextVoice() {\n      return _.last(this.staves).text_voices.push([]);\n    }\n\n    setTextFont(font) {\n      if (font != null) {\n        const parts = font.match(/([^-]*)-([^-]*)-([^.]*)/);\n        if (parts != null) {\n          this.customizations[\"font-face\"] = parts[1];\n          this.customizations[\"font-size\"] = parseInt(parts[2], 10);\n          return this.customizations[\"font-style\"] = parts[3];\n        }\n      }\n    }\n\n    addTextNote(text, position, justification, smooth, ignore_ticks) {\n      if (position == null) { position = 0; }\n      if (justification == null) { justification = \"center\"; }\n      if (smooth == null) { smooth = true; }\n      if (ignore_ticks == null) { ignore_ticks = false; }\n      const voices = _.last(this.staves).text_voices;\n      if (_.isEmpty(voices)) { throw new Vex.RERR(\"ArtistError\", \"Can't add text note without text voice\"); }\n\n      const font_face = this.customizations[\"font-face\"];\n      const font_size = this.customizations[\"font-size\"];\n      const font_style = this.customizations[\"font-style\"];\n\n      const just = (() => { switch (justification) {\n        case \"center\":\n          return Vex.Flow.TextNote.Justification.CENTER;\n        case \"left\":\n          return Vex.Flow.TextNote.Justification.LEFT;\n        case \"right\":\n          return Vex.Flow.TextNote.Justification.RIGHT;\n        default:\n          return Vex.Flow.TextNote.Justification.CENTER;\n      } })();\n\n      const duration = ignore_ticks ? \"b\" : this.current_duration;\n\n      const struct = {\n        text,\n        duration,\n        smooth,\n        ignore_ticks,\n        font: {\n          family: font_face,\n          size: font_size,\n          weight: font_style\n        }\n      };\n\n      if (text[0] === \"#\") {\n        struct.glyph = text.slice(1);\n      }\n\n      const note = new Vex.Flow.TextNote(struct).\n        setLine(position).setJustification(just);\n\n      return _.last(voices).push(note);\n    }\n\n    addVoice(options) {\n      this.closeBends();\n      const stave = _.last(this.staves);\n      if (stave == null) { return this.addStave(options); }\n\n      if (!_.isEmpty(stave.tab_notes)) {\n        stave.tab_voices.push(stave.tab_notes);\n        stave.tab_notes = [];\n      }\n\n      if (!_.isEmpty(stave.note_notes)) {\n        stave.note_voices.push(stave.note_notes);\n        return stave.note_notes = [];\n      }\n    }\n\n    addStave(element, options) {\n      const opts = {\n        tuning: \"standard\",\n        clef: \"treble\",\n        key: \"C\",\n        notation: element === \"tabstave\" ? \"false\" : \"true\",\n        tablature: element === \"stave\" ? \"false\" : \"true\",\n        strings: 6\n      };\n\n      _.extend(opts, options);\n      L(\"addStave: \", element, opts);\n\n      let tab_stave = null;\n      let note_stave = null;\n\n      // This is used to line up tablature and notation.\n      const start_x = this.x + this.customizations[\"connector-space\"];\n      let tabstave_start_x = 40;\n\n      if (opts.notation === \"true\") {\n        note_stave = new Vex.Flow.Stave(start_x, this.last_y, this.customizations.width - 20,\n          {left_bar: false});\n        if (opts.clef !== \"none\") {\n          if(this.renderClef){\n            note_stave.addClef(opts.clef);\n          }\n        }\n        if(this.renderKeySig){\n          note_stave.addKeySignature(opts.key);\n        }\n\n        if (opts.time != null && this.renderTimeSig) {\n          note_stave.addTimeSignature(opts.time);\n        }\n\n        this.last_y += note_stave.getHeight() +\n                   this.options.note_stave_lower_spacing +\n                   parseInt(this.customizations[\"stave-distance\"], 10);\n        tabstave_start_x = note_stave.getNoteStartX();\n        this.current_clef = opts.clef === \"none\" ? \"treble\" : opts.clef;\n      }\n\n      if (opts.tablature === \"true\") {\n        tab_stave = new Vex.Flow.TabStave(start_x, this.last_y, this.customizations.width - 20,\n          {left_bar: false}).setNumLines(opts.strings);\n        if (opts.clef !== \"none\" && this.renderTabGlyph) { tab_stave.addTabGlyph(); }\n        tab_stave.setNoteStartX(tabstave_start_x);\n        this.last_y += tab_stave.getHeight() + this.options.tab_stave_lower_spacing;\n      }\n\n      this.closeBends();\n      const beam_groups = Vex.Flow.Beam.getDefaultBeamGroups(opts.time);\n      this.staves.push({\n        tab: tab_stave,\n        note: note_stave,\n        tab_voices: [],\n        note_voices: [],\n        tab_notes: [],\n        note_notes: [],\n        text_voices: [],\n        beam_groups\n      });\n\n      this.tuning.setTuning(opts.tuning);\n      this.key_manager.setKey(opts.key);\n\n    }\n\n    addKeyChange(key, cancel_key) {\n      if (!_.has(Vex.Flow.keySignature.keySpecs, key)) { throw new Vex.RERR(\"ArtistError\", `Invalid key signature '${key}'`); }\n\n      if(_.last(this.staves).note_notes.length > 0) {\n        const keysig_note = new Vex.Flow.KeySigNote(key, cancel_key);\n        _.last(this.staves).note_notes.push(keysig_note);\n        _.last(this.staves).tab_notes.push(keysig_note);\n\n        const note_voice = _.last(_.last(this.staves).note_voices);\n        if(note_voice) {\n          note_voice.push(keysig_note);\n        }\n      } else {\n        const note_stave = _.last(this.staves).note;\n        const tab_stave =  _.last(this.staves).tab;\n        let tab_stave_start_x = note_stave.getNoteStartX();\n        note_stave.setKeySignature(key);\n        note_stave.format();\n        tab_stave_start_x = note_stave.getNoteStartX();\n        tab_stave.setNoteStartX(tab_stave_start_x);\n      }\n\n      return this.key_manager.setKey(key);\n    }\n\n    runCommand(line, _l, _c) {\n      if (_l == null) { _l = 0; }\n      if (_c == null) { _c = 0; }\n      L(\"runCommand: \", line);\n      const words = line.split(/\\s+/);\n      switch (words[0]) {\n        case \"octave-shift\":\n          this.current_octave_shift = parseInt(words[1], 10);\n          return L(\"Octave shift: \", this.current_octave_shift);\n\n        case \"set-key\":\n          var key = words[1];\n          return this.addKeyChange(key, null);\n\n        case \"change-key\":\n          key = words[1];\n          var cancel_key = this.key_manager.getKey();\n          return this.addKeyChange(key, cancel_key);\n        case \"set-beam-time\":\n          var time = words[1];\n          // console.log(JSON.stringify(_.last(@staves).beam_groups))\n          // console.log(time)\n          // console.log(JSON.stringify(Vex.Flow.Beam.getDefaultBeamGroups(time)))\n          return _.last(this.staves).beam_groups =\n            Vex.Flow.Beam.getDefaultBeamGroups(time);\n          // console.log(JSON.stringify(_.last(@staves).beam_groups))\n\n        default:\n          throw new Vex.RERR(\"ArtistError\", `Invalid command '${words[0]}' at line ${_l} column ${_c}`);\n      }\n    }\n  };\n  Artist.initClass();\n  return Artist;\n})();\n\nmodule.exports = Artist;\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","\n///\n// absoluteTime : absolute time\n// startTime : absolute time when zeroTime first started\n// zeroTime: relative time when\n//                           1                   2                   3\n// abs:    1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0\n// start         4\n// zerotime: 5 (loop starts at 5)\n// maxtime: 9 (4 countes)\n//               5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7\n//               |       |       |       |       |       |       |\n//\n\nfunction absToRel(absoluteTime, startTime, zeroTime, maxTime, loopDuration, pauseDuration){\n  const absTime = ((absoluteTime - startTime) % (loopDuration + pauseDuration)) + zeroTime;\n  if(absTime < zeroTime){\n    return zeroTime;\n  }\n  if(absTime >= maxTime){\n    if(absTime < maxTime + pauseDuration){\n      return -1; //in pause\n    }else{\n      return zeroTime;\n    }\n  }\n  return absTime;\n}\n\nclass Timer {\n  constructor(params){\n    let {audioContext, score, toBar, fromBar, barDuration, pauseBarFactor, tempoFactor} = params;\n    this.absolutePrepareOffset = 100;\n    this.prepareOffset = this.absolutePrepareOffset * tempoFactor; //ms to fire prepare before currentTime\n    this.audioContext = audioContext;\n    this.fromBar = fromBar;\n    this.toBar = toBar;\n    this.score = score;\n    this.barDuration = barDuration;\n    this.pauseBarFactor = pauseBarFactor;\n    this.onAnimationFrame = this.onAnimationFrame.bind(this);\n    this.onCheckTimer = this.onCheckTimer.bind(this);\n    this.tempoFactor = tempoFactor;\n    this.startTime = 0;\n    this.zeroTime = 0;\n    this.maxTime = 0;\n    this.pauseDuration = 0;\n    this.handlers = [];\n    setInterval(this.onCheckTimer, 1);\n    // Using setInterval seems to be the better opion.\n    // window.requestAnimationFrame(()=>{\n    //   this.onAnimationFrame();\n    // });;\n  }\n\n  configure({toBar, fromBar, barDuration, pauseBarFactor, tempoFactor, beatsPerBar}){\n    this.prepareOffset = this.absolutePrepareOffset * tempoFactor; //ms to fire prepare before currentTime\n    this.toBar = toBar;\n    this.fromBar = fromBar;\n    this.barDuration = barDuration;\n    this.pauseBarFactor = pauseBarFactor;\n    this.tempoFactor = tempoFactor;\n    this.beatsPerBar = beatsPerBar;\n  }\n\n  setTempoFactor(tempoFactor){\n    this.prepareOffset = this.absolutePrepareOffset * tempoFactor;\n    const {absoluteTime, factoredTime} = this.getTime();\n    const currentTime = absToRel(factoredTime - this.prepareOffset,\n                                  this.startTime,\n                                  this.zeroTime,\n                                  this.maxTime,\n                                  this.loopDuration,\n                                  this.pauseDuration);\n\n    this.startTime = (absoluteTime * tempoFactor) - currentTime;\n\n    if(this.pausedAt){\n      this.pausedAt.factoredTime = this.pausedAt.absoluteTime * tempoFactor;\n    }\n\n    this.tempoFactor = tempoFactor;\n    this.handlers.forEach(h => {\n      if(h.onFactorChanged){\n        h.onFactorChanged();\n      }\n    });\n  }\n\n  onCheckTimer(){\n    this.check();\n  }\n\n  onAnimationFrame(){\n    this.check();\n    window.requestAnimationFrame(()=>{\n      this.onAnimationFrame();\n    });\n  }\n\n  getTime(){\n    const absoluteTime = this.audioContext.currentTime * 1000;\n    //const absoluteTime = window.performance.now();\n    //console.log(window.performance.now(), this.audioContext.currentTime * 1000);\n    return {absoluteTime, factoredTime: absoluteTime * this.tempoFactor};\n  }\n\n  //returns the time position within the piece.\n  //no absolute time\n  currentTime(){\n    let {factoredTime, absoluteTime} = this.getTime();\n    if(!this.isPlaying){\n      if(this.pausedAt){\n        factoredTime = this.pausedAt.factoredTime;\n        absoluteTime = this.pausedAt.absoluteTime;\n      }else\n      {\n        return {prepareTime: -1, currentTime: -1, absoluteTime}\n      }\n    }\n\n    const currentTime = absToRel(factoredTime - this.prepareOffset,\n                                  this.startTime,\n                                  this.zeroTime,\n                                  this.maxTime,\n                                  this.loopDuration,\n                                  this.pauseDuration);\n    const prepareTime = absToRel(factoredTime,\n                                  this.startTime,\n                                  this.zeroTime,\n                                  this.maxTime,\n                                  this.loopDuration,\n                                  this.pauseDuration);\n    return {prepareTime, currentTime, absoluteTime};\n  }\n\n\n  start()\n  {\n    const {absoluteTime} = this.getTime()\n\n    this.startTime = absoluteTime * this.tempoFactor;\n\n    //zeroTime: relative time of the beginning of the loop\n    this.zeroTime = this.fromBar ? this.fromBar.start : 0;\n    //maxTime: relative time of the end of the loop\n    this.maxTime = this.toBar ? this.toBar.end : 0;\n    //pauseDuration length of duration\n    this.pauseDuration = 4 * (this.barDuration / this.beatsPerBar) * this.pauseBarFactor;\n    //loopDuration: length of loop\n    this.loopDuration = this.maxTime - this.zeroTime;\n    this.isPlaying = true;\n\n    this.handlers.forEach(h=>{\n      if(h.onTimerStarted){\n        h.onTimerStarted();\n      }\n    });\n    this.pausedAt = null;\n  }\n  resume(){\n    this.isPlaying = true;\n    const {factoredTime} = this.getTime()\n    const timeDelay = factoredTime - this.pausedAt.factoredTime;\n    this.startTime += timeDelay;\n  }\n  stop(){\n    this.isPlaying = false;\n    this.pausedAt = this.getTime();\n  }\n  canResume(){\n    return this.canRewind();\n  }\n  canRewind(){\n    return !!this.pausedAt;\n  }\n\n  check(){\n    //current time runs preparePeriod before\n    const {prepareTime, currentTime, absoluteTime} = this.currentTime();\n    const bars = this.score.getBars();\n    var currentBar = bars.find((b) => {\n      const isCurrent = b.start < currentTime && b.end > currentTime;\n      return isCurrent;\n    });\n    var prepareBar = bars.find((b) => {\n      const isCurrent = b.start < prepareTime && b.end > prepareTime;\n      return isCurrent;\n    });\n\n    this.handlers.forEach(h => {\n      if(h.onTimeChange){\n        h.onTimeChange({currentTime, currentBar, tempoFactor: this.tempoFactor});\n      }\n      if(h.onPrepare){\n        h.onPrepare({time: prepareTime, absoluteTime, offset: this.prepareOffset, absoluteOffset: this.absolutePrepareOffset});\n      }\n    });\n  }\n  addHandler(handler){\n    this.handlers.push(handler);\n  }\n  removeHandler(handler){\n    this.handlers = this.handlers.filter(h => h !== handler);\n  }\n}\n\nmodule.exports = Timer;\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _typeof2 = require(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && ((typeof call === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(call)) === \"object\" || typeof call === \"function\") ? call : self;\n};","require('./_wks-define')('observable');\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n","/**\n * @ignore\n * base event object for custom and dom event.\n * @author yiminghe@gmail.com\n */\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction returnFalse() {\n  return false;\n}\n\nfunction returnTrue() {\n  return true;\n}\n\nfunction EventBaseObject() {\n  this.timeStamp = Date.now();\n  this.target = undefined;\n  this.currentTarget = undefined;\n}\n\nEventBaseObject.prototype = {\n  isEventObject: 1,\n\n  constructor: EventBaseObject,\n\n  isDefaultPrevented: returnFalse,\n\n  isPropagationStopped: returnFalse,\n\n  isImmediatePropagationStopped: returnFalse,\n\n  preventDefault: function preventDefault() {\n    this.isDefaultPrevented = returnTrue;\n  },\n\n  stopPropagation: function stopPropagation() {\n    this.isPropagationStopped = returnTrue;\n  },\n\n  stopImmediatePropagation: function stopImmediatePropagation() {\n    this.isImmediatePropagationStopped = returnTrue;\n    // fixed 1.2\n    // call stopPropagation implicitly\n    this.stopPropagation();\n  },\n\n  halt: function halt(immediate) {\n    if (immediate) {\n      this.stopImmediatePropagation();\n    } else {\n      this.stopPropagation();\n    }\n    this.preventDefault();\n  }\n};\n\nexports[\"default\"] = EventBaseObject;\nmodule.exports = exports[\"default\"];","/**\n * Module dependencies.\n */\n\ntry {\n  var index = require('indexof');\n} catch (err) {\n  var index = require('component-indexof');\n}\n\n/**\n * Whitespace regexp.\n */\n\nvar re = /\\s+/;\n\n/**\n * toString reference.\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Wrap `el` in a `ClassList`.\n *\n * @param {Element} el\n * @return {ClassList}\n * @api public\n */\n\nmodule.exports = function(el){\n  return new ClassList(el);\n};\n\n/**\n * Initialize a new ClassList for `el`.\n *\n * @param {Element} el\n * @api private\n */\n\nfunction ClassList(el) {\n  if (!el || !el.nodeType) {\n    throw new Error('A DOM element reference is required');\n  }\n  this.el = el;\n  this.list = el.classList;\n}\n\n/**\n * Add class `name` if not already present.\n *\n * @param {String} name\n * @return {ClassList}\n * @api public\n */\n\nClassList.prototype.add = function(name){\n  // classList\n  if (this.list) {\n    this.list.add(name);\n    return this;\n  }\n\n  // fallback\n  var arr = this.array();\n  var i = index(arr, name);\n  if (!~i) arr.push(name);\n  this.el.className = arr.join(' ');\n  return this;\n};\n\n/**\n * Remove class `name` when present, or\n * pass a regular expression to remove\n * any which match.\n *\n * @param {String|RegExp} name\n * @return {ClassList}\n * @api public\n */\n\nClassList.prototype.remove = function(name){\n  if ('[object RegExp]' == toString.call(name)) {\n    return this.removeMatching(name);\n  }\n\n  // classList\n  if (this.list) {\n    this.list.remove(name);\n    return this;\n  }\n\n  // fallback\n  var arr = this.array();\n  var i = index(arr, name);\n  if (~i) arr.splice(i, 1);\n  this.el.className = arr.join(' ');\n  return this;\n};\n\n/**\n * Remove all classes matching `re`.\n *\n * @param {RegExp} re\n * @return {ClassList}\n * @api private\n */\n\nClassList.prototype.removeMatching = function(re){\n  var arr = this.array();\n  for (var i = 0; i < arr.length; i++) {\n    if (re.test(arr[i])) {\n      this.remove(arr[i]);\n    }\n  }\n  return this;\n};\n\n/**\n * Toggle class `name`, can force state via `force`.\n *\n * For browsers that support classList, but do not support `force` yet,\n * the mistake will be detected and corrected.\n *\n * @param {String} name\n * @param {Boolean} force\n * @return {ClassList}\n * @api public\n */\n\nClassList.prototype.toggle = function(name, force){\n  // classList\n  if (this.list) {\n    if (\"undefined\" !== typeof force) {\n      if (force !== this.list.toggle(name, force)) {\n        this.list.toggle(name); // toggle again to correct\n      }\n    } else {\n      this.list.toggle(name);\n    }\n    return this;\n  }\n\n  // fallback\n  if (\"undefined\" !== typeof force) {\n    if (!force) {\n      this.remove(name);\n    } else {\n      this.add(name);\n    }\n  } else {\n    if (this.has(name)) {\n      this.remove(name);\n    } else {\n      this.add(name);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return an array of classes.\n *\n * @return {Array}\n * @api public\n */\n\nClassList.prototype.array = function(){\n  var className = this.el.getAttribute('class') || '';\n  var str = className.replace(/^\\s+|\\s+$/g, '');\n  var arr = str.split(re);\n  if ('' === arr[0]) arr.shift();\n  return arr;\n};\n\n/**\n * Check if class `name` is present.\n *\n * @param {String} name\n * @return {ClassList}\n * @api public\n */\n\nClassList.prototype.has =\nClassList.prototype.contains = function(name){\n  return this.list\n    ? this.list.contains(name)\n    : !! ~index(this.array(), name);\n};\n","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","'use strict'\n\nvar load = require('audio-loader')\nvar player = require('sample-player')\n\n/**\n * Load a soundfont instrument. It returns a promise that resolves to a\n * instrument object.\n *\n * The instrument object returned by the promise has the following properties:\n *\n * - name: the instrument name\n * - play: A function to play notes from the buffer with the signature\n * `play(note, time, duration, options)`\n *\n *\n * The valid options are:\n *\n * - `format`: the soundfont format. 'mp3' by default. Can be 'ogg'\n * - `soundfont`: the soundfont name. 'MusyngKite' by default. Can be 'FluidR3_GM'\n * - `nameToUrl` <Function>: a function to convert from instrument names to URL\n * - `destination`: by default Soundfont uses the `audioContext.destination` but you can override it.\n * - `gain`: the gain of the player (1 by default)\n * - `notes`: an array of the notes to decode. It can be an array of strings\n * with note names or an array of numbers with midi note numbers. This is a\n * performance option: since decoding mp3 is a cpu intensive process, you can limit\n * limit the number of notes you want and reduce the time to load the instrument.\n *\n * @param {AudioContext} ac - the audio context\n * @param {String} name - the instrument name. For example: 'acoustic_grand_piano'\n * @param {Object} options - (Optional) the same options as Soundfont.loadBuffers\n * @return {Promise}\n *\n * @example\n * var Soundfont = require('sounfont-player')\n * Soundfont.instrument('marimba').then(function (marimba) {\n *   marimba.play('C4')\n * })\n */\nfunction instrument (ac, name, options) {\n  if (arguments.length === 1) return function (n, o) { return instrument(ac, n, o) }\n  var opts = options || {}\n  var isUrl = opts.isSoundfontURL || isSoundfontURL\n  var toUrl = opts.nameToUrl || nameToUrl\n  var url = isUrl(name) ? name : toUrl(name, opts.soundfont, opts.format)\n\n  return load(ac, url, { only: opts.only || opts.notes }).then(function (buffers) {\n    var p = player(ac, buffers, opts).connect(opts.destination ? opts.destination : ac.destination)\n    p.url = url\n    p.name = name\n    return p\n  })\n}\n\nfunction isSoundfontURL (name) {\n  return /\\.js(\\?.*)?$/i.test(name)\n}\n\n/**\n * Given an instrument name returns a URL to to the Benjamin Gleitzman's\n * package of [pre-rendered sound fonts](https://github.com/gleitz/midi-js-soundfonts)\n *\n * @param {String} name - instrument name\n * @param {String} soundfont - (Optional) the soundfont name. One of 'FluidR3_GM'\n * or 'MusyngKite' ('MusyngKite' by default)\n * @param {String} format - (Optional) Can be 'mp3' or 'ogg' (mp3 by default)\n * @returns {String} the Soundfont file url\n * @example\n * var Soundfont = require('soundfont-player')\n * Soundfont.nameToUrl('marimba', 'mp3')\n */\nfunction nameToUrl (name, sf, format) {\n  format = format === 'ogg' ? format : 'mp3'\n  sf = sf === 'FluidR3_GM' ? sf : 'MusyngKite'\n  return 'https://gleitz.github.io/midi-js-soundfonts/' + sf + '/' + name + '-' + format + '.js'\n}\n\n// In the 1.0.0 release it will be:\n// var Soundfont = {}\nvar Soundfont = require('./legacy')\nSoundfont.instrument = instrument\nSoundfont.nameToUrl = nameToUrl\n\nif (typeof module === 'object' && module.exports) module.exports = Soundfont\nif (typeof window !== 'undefined') window.Soundfont = Soundfont\n","module.exports = { \"default\": require(\"core-js/library/fn/object/create\"), __esModule: true };","module.exports = require('./_hide');\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","/* global XMLHttpRequest */\n'use strict'\n\n/**\n * Given a url and a return type, returns a promise to the content of the url\n * Basically it wraps a XMLHttpRequest into a Promise\n *\n * @param {String} url\n * @param {String} type - can be 'text' or 'arraybuffer'\n * @return {Promise}\n */\nmodule.exports = function (url, type) {\n  return new Promise(function (done, reject) {\n    var req = new XMLHttpRequest()\n    if (type) req.responseType = type\n\n    req.open('GET', url)\n    req.onload = function () {\n      req.status === 200 ? done(req.response) : reject(Error(req.statusText))\n    }\n    req.onerror = function () { reject(Error('Network Error')) }\n    req.send()\n  })\n}\n","require('../../modules/es6.object.set-prototype-of');\nmodule.exports = require('../../modules/_core').Object.setPrototypeOf;\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n","'use strict'\n\nvar base64 = require('./base64')\nvar fetch = require('./fetch')\n\n// Given a regex, return a function that test if against a string\nfunction fromRegex (r) {\n  return function (o) { return typeof o === 'string' && r.test(o) }\n}\n// Try to apply a prefix to a name\nfunction prefix (pre, name) {\n  return typeof pre === 'string' ? pre + name\n    : typeof pre === 'function' ? pre(name)\n    : name\n}\n\n/**\n * Load one or more audio files\n *\n *\n * Possible option keys:\n *\n * - __from__ {Function|String}: a function or string to convert from file names to urls.\n * If is a string it will be prefixed to the name:\n * `load(ac, 'snare.mp3', { from: 'http://audio.net/samples/' })`\n * If it's a function it receives the file name and should return the url as string.\n * - __only__ {Array} - when loading objects, if provided, only the given keys\n * will be included in the decoded object:\n * `load(ac, 'piano.json', { only: ['C2', 'D2'] })`\n *\n * @param {AudioContext} ac - the audio context\n * @param {Object} source - the object to be loaded\n * @param {Object} options - (Optional) the load options for that object\n * @param {Object} defaultValue - (Optional) the default value to return as\n * in a promise if not valid loader found\n */\nfunction load (ac, source, options, defVal) {\n  var loader =\n    // Basic audio loading\n      isArrayBuffer(source) ? loadArrayBuffer\n    : isAudioFileName(source) ? loadAudioFile\n    : isPromise(source) ? loadPromise\n    // Compound objects\n    : isArray(source) ? loadArrayData\n    : isObject(source) ? loadObjectData\n    : isJsonFileName(source) ? loadJsonFile\n    // Base64 encoded audio\n    : isBase64Audio(source) ? loadBase64Audio\n    : isJsFileName(source) ? loadMidiJSFile\n    : null\n\n  var opts = options || {}\n  return loader ? loader(ac, source, opts)\n    : defVal ? Promise.resolve(defVal)\n    : Promise.reject('Source not valid (' + source + ')')\n}\nload.fetch = fetch\n\n// BASIC AUDIO LOADING\n// ===================\n\n// Load (decode) an array buffer\nfunction isArrayBuffer (o) { return o instanceof ArrayBuffer }\nfunction loadArrayBuffer (ac, array, options) {\n  return new Promise(function (done, reject) {\n    ac.decodeAudioData(array,\n      function (buffer) { done(buffer) },\n      function () { reject(\"Can't decode audio data (\" + array.slice(0, 30) + '...)') }\n    )\n  })\n}\n\n// Load an audio filename\nvar isAudioFileName = fromRegex(/\\.(mp3|wav|ogg)(\\?.*)?$/i)\nfunction loadAudioFile (ac, name, options) {\n  var url = prefix(options.from, name)\n  return load(ac, load.fetch(url, 'arraybuffer'), options)\n}\n\n// Load the result of a promise\nfunction isPromise (o) { return o && typeof o.then === 'function' }\nfunction loadPromise (ac, promise, options) {\n  return promise.then(function (value) {\n    return load(ac, value, options)\n  })\n}\n\n// COMPOUND OBJECTS\n// ================\n\n// Try to load all the items of an array\nvar isArray = Array.isArray\nfunction loadArrayData (ac, array, options) {\n  return Promise.all(array.map(function (data) {\n    return load(ac, data, options, data)\n  }))\n}\n\n// Try to load all the values of a key/value object\nfunction isObject (o) { return o && typeof o === 'object' }\nfunction loadObjectData (ac, obj, options) {\n  var dest = {}\n  var promises = Object.keys(obj).map(function (key) {\n    if (options.only && options.only.indexOf(key) === -1) return null\n    var value = obj[key]\n    return load(ac, value, options, value).then(function (audio) {\n      dest[key] = audio\n    })\n  })\n  return Promise.all(promises).then(function () { return dest })\n}\n\n// Load the content of a JSON file\nvar isJsonFileName = fromRegex(/\\.json(\\?.*)?$/i)\nfunction loadJsonFile (ac, name, options) {\n  var url = prefix(options.from, name)\n  return load(ac, load.fetch(url, 'text').then(JSON.parse), options)\n}\n\n// BASE64 ENCODED FORMATS\n// ======================\n\n// Load strings with Base64 encoded audio\nvar isBase64Audio = fromRegex(/^data:audio/)\nfunction loadBase64Audio (ac, source, options) {\n  var i = source.indexOf(',')\n  return load(ac, base64.decode(source.slice(i + 1)).buffer, options)\n}\n\n// Load .js files with MidiJS soundfont prerendered audio\nvar isJsFileName = fromRegex(/\\.js(\\?.*)?$/i)\nfunction loadMidiJSFile (ac, name, options) {\n  var url = prefix(options.from, name)\n  return load(ac, load.fetch(url, 'text').then(midiJsToJson), options)\n}\n\n// convert a MIDI.js javascript soundfont file to json\nfunction midiJsToJson (data) {\n  var begin = data.indexOf('MIDI.Soundfont.')\n  if (begin < 0) throw Error('Invalid MIDI.js Soundfont format')\n  begin = data.indexOf('=', begin) + 2\n  var end = data.lastIndexOf(',')\n  return JSON.parse(data.slice(begin, end) + '}')\n}\n\nif (typeof module === 'object' && module.exports) module.exports = load\nif (typeof window !== 'undefined') window.loadAudio = load\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n  if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n  else object[index] = value;\n};\n","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n","/**\n * @ignore\n * event object for dom\n * @author yiminghe@gmail.com\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _EventBaseObject = require('./EventBaseObject');\n\nvar _EventBaseObject2 = _interopRequireDefault(_EventBaseObject);\n\nvar _objectAssign = require('object-assign');\n\nvar _objectAssign2 = _interopRequireDefault(_objectAssign);\n\nvar TRUE = true;\nvar FALSE = false;\nvar commonProps = ['altKey', 'bubbles', 'cancelable', 'ctrlKey', 'currentTarget', 'eventPhase', 'metaKey', 'shiftKey', 'target', 'timeStamp', 'view', 'type'];\n\nfunction isNullOrUndefined(w) {\n  return w === null || w === undefined;\n}\n\nvar eventNormalizers = [{\n  reg: /^key/,\n  props: ['char', 'charCode', 'key', 'keyCode', 'which'],\n  fix: function fix(event, nativeEvent) {\n    if (isNullOrUndefined(event.which)) {\n      event.which = !isNullOrUndefined(nativeEvent.charCode) ? nativeEvent.charCode : nativeEvent.keyCode;\n    }\n\n    // add metaKey to non-Mac browsers (use ctrl for PC 's and Meta for Macs)\n    if (event.metaKey === undefined) {\n      event.metaKey = event.ctrlKey;\n    }\n  }\n}, {\n  reg: /^touch/,\n  props: ['touches', 'changedTouches', 'targetTouches']\n}, {\n  reg: /^hashchange$/,\n  props: ['newURL', 'oldURL']\n}, {\n  reg: /^gesturechange$/i,\n  props: ['rotation', 'scale']\n}, {\n  reg: /^(mousewheel|DOMMouseScroll)$/,\n  props: [],\n  fix: function fix(event, nativeEvent) {\n    var deltaX = undefined;\n    var deltaY = undefined;\n    var delta = undefined;\n    var wheelDelta = nativeEvent.wheelDelta;\n    var axis = nativeEvent.axis;\n    var wheelDeltaY = nativeEvent.wheelDeltaY;\n    var wheelDeltaX = nativeEvent.wheelDeltaX;\n    var detail = nativeEvent.detail;\n\n    // ie/webkit\n    if (wheelDelta) {\n      delta = wheelDelta / 120;\n    }\n\n    // gecko\n    if (detail) {\n      // press control e.detail == 1 else e.detail == 3\n      delta = 0 - (detail % 3 === 0 ? detail / 3 : detail);\n    }\n\n    // Gecko\n    if (axis !== undefined) {\n      if (axis === event.HORIZONTAL_AXIS) {\n        deltaY = 0;\n        deltaX = 0 - delta;\n      } else if (axis === event.VERTICAL_AXIS) {\n        deltaX = 0;\n        deltaY = delta;\n      }\n    }\n\n    // Webkit\n    if (wheelDeltaY !== undefined) {\n      deltaY = wheelDeltaY / 120;\n    }\n    if (wheelDeltaX !== undefined) {\n      deltaX = -1 * wheelDeltaX / 120;\n    }\n\n    // 默认 deltaY (ie)\n    if (!deltaX && !deltaY) {\n      deltaY = delta;\n    }\n\n    if (deltaX !== undefined) {\n      /**\n       * deltaX of mousewheel event\n       * @property deltaX\n       * @member Event.DomEvent.Object\n       */\n      event.deltaX = deltaX;\n    }\n\n    if (deltaY !== undefined) {\n      /**\n       * deltaY of mousewheel event\n       * @property deltaY\n       * @member Event.DomEvent.Object\n       */\n      event.deltaY = deltaY;\n    }\n\n    if (delta !== undefined) {\n      /**\n       * delta of mousewheel event\n       * @property delta\n       * @member Event.DomEvent.Object\n       */\n      event.delta = delta;\n    }\n  }\n}, {\n  reg: /^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,\n  props: ['buttons', 'clientX', 'clientY', 'button', 'offsetX', 'relatedTarget', 'which', 'fromElement', 'toElement', 'offsetY', 'pageX', 'pageY', 'screenX', 'screenY'],\n  fix: function fix(event, nativeEvent) {\n    var eventDoc = undefined;\n    var doc = undefined;\n    var body = undefined;\n    var target = event.target;\n    var button = nativeEvent.button;\n\n    // Calculate pageX/Y if missing and clientX/Y available\n    if (target && isNullOrUndefined(event.pageX) && !isNullOrUndefined(nativeEvent.clientX)) {\n      eventDoc = target.ownerDocument || document;\n      doc = eventDoc.documentElement;\n      body = eventDoc.body;\n      event.pageX = nativeEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = nativeEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // which for click: 1 === left; 2 === middle; 3 === right\n    // do not use button\n    if (!event.which && button !== undefined) {\n      if (button & 1) {\n        event.which = 1;\n      } else if (button & 2) {\n        event.which = 3;\n      } else if (button & 4) {\n        event.which = 2;\n      } else {\n        event.which = 0;\n      }\n    }\n\n    // add relatedTarget, if necessary\n    if (!event.relatedTarget && event.fromElement) {\n      event.relatedTarget = event.fromElement === target ? event.toElement : event.fromElement;\n    }\n\n    return event;\n  }\n}];\n\nfunction retTrue() {\n  return TRUE;\n}\n\nfunction retFalse() {\n  return FALSE;\n}\n\nfunction DomEventObject(nativeEvent) {\n  var type = nativeEvent.type;\n\n  var isNative = typeof nativeEvent.stopPropagation === 'function' || typeof nativeEvent.cancelBubble === 'boolean';\n\n  _EventBaseObject2['default'].call(this);\n\n  this.nativeEvent = nativeEvent;\n\n  // in case dom event has been mark as default prevented by lower dom node\n  var isDefaultPrevented = retFalse;\n  if ('defaultPrevented' in nativeEvent) {\n    isDefaultPrevented = nativeEvent.defaultPrevented ? retTrue : retFalse;\n  } else if ('getPreventDefault' in nativeEvent) {\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=691151\n    isDefaultPrevented = nativeEvent.getPreventDefault() ? retTrue : retFalse;\n  } else if ('returnValue' in nativeEvent) {\n    isDefaultPrevented = nativeEvent.returnValue === FALSE ? retTrue : retFalse;\n  }\n\n  this.isDefaultPrevented = isDefaultPrevented;\n\n  var fixFns = [];\n  var fixFn = undefined;\n  var l = undefined;\n  var prop = undefined;\n  var props = commonProps.concat();\n\n  eventNormalizers.forEach(function (normalizer) {\n    if (type.match(normalizer.reg)) {\n      props = props.concat(normalizer.props);\n      if (normalizer.fix) {\n        fixFns.push(normalizer.fix);\n      }\n    }\n  });\n\n  l = props.length;\n\n  // clone properties of the original event object\n  while (l) {\n    prop = props[--l];\n    this[prop] = nativeEvent[prop];\n  }\n\n  // fix target property, if necessary\n  if (!this.target && isNative) {\n    this.target = nativeEvent.srcElement || document; // srcElement might not be defined either\n  }\n\n  // check if target is a text node (safari)\n  if (this.target && this.target.nodeType === 3) {\n    this.target = this.target.parentNode;\n  }\n\n  l = fixFns.length;\n\n  while (l) {\n    fixFn = fixFns[--l];\n    fixFn(this, nativeEvent);\n  }\n\n  this.timeStamp = nativeEvent.timeStamp || Date.now();\n}\n\nvar EventBaseObjectProto = _EventBaseObject2['default'].prototype;\n\n(0, _objectAssign2['default'])(DomEventObject.prototype, EventBaseObjectProto, {\n  constructor: DomEventObject,\n\n  preventDefault: function preventDefault() {\n    var e = this.nativeEvent;\n\n    // if preventDefault exists run it on the original event\n    if (e.preventDefault) {\n      e.preventDefault();\n    } else {\n      // otherwise set the returnValue property of the original event to FALSE (IE)\n      e.returnValue = FALSE;\n    }\n\n    EventBaseObjectProto.preventDefault.call(this);\n  },\n\n  stopPropagation: function stopPropagation() {\n    var e = this.nativeEvent;\n\n    // if stopPropagation exists run it on the original event\n    if (e.stopPropagation) {\n      e.stopPropagation();\n    } else {\n      // otherwise set the cancelBubble property of the original event to TRUE (IE)\n      e.cancelBubble = TRUE;\n    }\n\n    EventBaseObjectProto.stopPropagation.call(this);\n  }\n});\n\nexports['default'] = DomEventObject;\nmodule.exports = exports['default'];","require('../../modules/es6.object.get-prototype-of');\nmodule.exports = require('../../modules/_core').Object.getPrototypeOf;\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\nexports['default'] = addEventListener;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _EventObject = require('./EventObject');\n\nvar _EventObject2 = _interopRequireDefault(_EventObject);\n\nfunction addEventListener(target, eventType, callback, option) {\n  function wrapCallback(e) {\n    var ne = new _EventObject2['default'](e);\n    callback.call(target, ne);\n  }\n\n  if (target.addEventListener) {\n    var _ret = (function () {\n      var useCapture = false;\n      if (typeof option === 'object') {\n        useCapture = option.capture || false;\n      } else if (typeof option === 'boolean') {\n        useCapture = option;\n      }\n\n      target.addEventListener(eventType, wrapCallback, option || false);\n\n      return {\n        v: {\n          remove: function remove() {\n            target.removeEventListener(eventType, wrapCallback, useCapture);\n          }\n        }\n      };\n    })();\n\n    if (typeof _ret === 'object') return _ret.v;\n  } else if (target.attachEvent) {\n    target.attachEvent('on' + eventType, wrapCallback);\n    return {\n      remove: function remove() {\n        target.detachEvent('on' + eventType, wrapCallback);\n      }\n    };\n  }\n}\n\nmodule.exports = exports['default'];","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+\"Capture\",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||\"undefined\"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for(\"react.element\"),wa=Symbol.for(\"react.portal\"),ya=Symbol.for(\"react.fragment\"),za=Symbol.for(\"react.strict_mode\"),Aa=Symbol.for(\"react.profiler\"),Ba=Symbol.for(\"react.provider\"),Ca=Symbol.for(\"react.context\"),Da=Symbol.for(\"react.forward_ref\"),Ea=Symbol.for(\"react.suspense\"),Fa=Symbol.for(\"react.suspense_list\"),Ga=Symbol.for(\"react.memo\"),Ha=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");Symbol.for(\"react.debug_trace_mode\");\nvar Ia=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.cache\");Symbol.for(\"react.tracing_marker\");var Ja=Symbol.iterator;function Ka(a){if(null===a||\"object\"!==typeof a)return null;a=Ja&&a[Ja]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||\"\"}return\"\\n\"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return\"\";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&\"string\"===typeof l.stack){for(var e=l.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"<anonymous>\")&&(k=k.replace(\"<anonymous>\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nfunction lb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?kb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar mb,nb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(\"http://www.w3.org/2000/svg\"!==a.namespaceURI||\"innerHTML\"in a)a.innerHTML=b;else{mb=mb||document.createElement(\"div\");mb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,\"passive\",{get:function(){Lb=!0}});window.addEventListener(\"test\",Mb,Mb);window.removeEventListener(\"test\",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&\"function\"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction Sc(a,b){switch(a){case \"focusin\":case \"focusout\":Lc=null;break;case \"dragenter\":case \"dragleave\":Mc=null;break;case \"mouseover\":case \"mouseout\":Nc=null;break;case \"pointerover\":case \"pointerout\":Oc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case \"focusin\":return Lc=Tc(Lc,a,b,c,d,e),!0;case \"dragenter\":return Mc=Tc(Mc,a,b,c,d,e),!0;case \"mouseover\":return Nc=Tc(Nc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case \"cancel\":case \"click\":case \"close\":case \"contextmenu\":case \"copy\":case \"cut\":case \"auxclick\":case \"dblclick\":case \"dragend\":case \"dragstart\":case \"drop\":case \"focusin\":case \"focusout\":case \"input\":case \"invalid\":case \"keydown\":case \"keypress\":case \"keyup\":case \"mousedown\":case \"mouseup\":case \"paste\":case \"pause\":case \"play\":case \"pointercancel\":case \"pointerdown\":case \"pointerup\":case \"ratechange\":case \"reset\":case \"resize\":case \"seeked\":case \"submit\":case \"touchcancel\":case \"touchend\":case \"touchstart\":case \"volumechange\":case \"change\":case \"selectionchange\":case \"textInput\":case \"compositionstart\":case \"compositionend\":case \"compositionupdate\":case \"beforeblur\":case \"afterblur\":case \"beforeinput\":case \"blur\":case \"fullscreenchange\":case \"focus\":case \"hashchange\":case \"popstate\":case \"select\":case \"selectstart\":return 1;case \"drag\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"mousemove\":case \"mouseout\":case \"mouseover\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"scroll\":case \"toggle\":case \"touchmove\":case \"wheel\":case \"mouseenter\":case \"mouseleave\":case \"pointerenter\":case \"pointerleave\":return 4;\ncase \"message\":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&\"CompositionEvent\"in window,be=null;ia&&\"documentMode\"in document&&(be=document.documentMode);var ce=ia&&\"TextEvent\"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var We={animationend:Ve(\"Animation\",\"AnimationEnd\"),animationiteration:Ve(\"Animation\",\"AnimationIteration\"),animationstart:Ve(\"Animation\",\"AnimationStart\"),transitionend:Ve(\"Transition\",\"TransitionEnd\")},Xe={},Ye={};\nia&&(Ye=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),\"TransitionEvent\"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze(\"animationend\"),af=Ze(\"animationiteration\"),bf=Ze(\"animationstart\"),cf=Ze(\"transitionend\"),df=new Map,ef=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,\"on\"+kf)}ff($e,\"onAnimationEnd\");ff(af,\"onAnimationIteration\");ff(bf,\"onAnimationStart\");ff(\"dblclick\",\"onDoubleClick\");ff(\"focusin\",\"onFocus\");ff(\"focusout\",\"onBlur\");ff(cf,\"onTransitionEnd\");ha(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);ha(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ha(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);\nha(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);fa(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));fa(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));fa(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);fa(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));fa(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));\nfa(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var lf=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),mf=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(lf));\nfunction nf(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+\"__bubble\";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf=\"_reactListening\"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){\"selectionchange\"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf(\"selectionchange\",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":n=\"focus\";k=Fd;break;case \"focusout\":n=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var t=0!==(b&4),J=!t&&\"scroll\"===a,x=t?null!==h?h+\"Capture\":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F=\"onMouseLeave\";x=\"onMouseEnter\";w=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)t=Td,F=\"onPointerLeave\",x=\"onPointerEnter\",w=\"pointer\";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+\"leave\",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+\"enter\",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);\"focusout\"===a&&(xa=h._wrapperState)&&\nxa.controlled&&\"number\"===h.type&&cb(h,\"number\",h.value)}xa=d?ue(d):window;switch(a){case \"focusin\":if(me(xa)||\"true\"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case \"compositionstart\":var ba=\"onCompositionStart\";break b;case \"compositionend\":ba=\"onCompositionEnd\";\nbreak b;case \"compositionupdate\":ba=\"onCompositionUpdate\";break b}ba=void 0}else ie?ge(a,c)&&(ba=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(ba=\"onCompositionStart\");ba&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==ba?\"onCompositionEnd\"===ba&&ie&&($a=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),\n0<d.length&&(e=new Ld(\"onBeforeInput\",\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return(\"string\"===typeof a?a:\"\"+a).replace(xf,\"\\n\").replace(yf,\"\")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return\"textarea\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff=\"function\"===typeof setTimeout?setTimeout:void 0,Gf=\"function\"===typeof clearTimeout?clearTimeout:void 0,Hf=\"function\"===typeof Promise?Promise:void 0,Jf=\"function\"===typeof queueMicrotask?queueMicrotask:\"undefined\"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,\"/$\"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else\"$\"!==c&&\"$?\"!==c&&\"$!\"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if(\"$\"===b||\"$!\"===b||\"$?\"===b)break;if(\"/$\"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of=\"__reactFiber$\"+Nf,Pf=\"__reactProps$\"+Nf,uf=\"__reactContainer$\"+Nf,of=\"__reactEvents$\"+Nf,Qf=\"__reactListeners$\"+Nf,Rf=\"__reactHandles$\"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg=\"\";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType=\"DELETED\";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b=\"head\"!==b&&\"body\"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;\nfunction Lg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if(\"string\"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction Mg(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,\"[object Object]\"===a?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":a));}function Ng(a){var b=a._init;return b(a._payload)}\nfunction Og(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Pg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Qg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||\"object\"===typeof f&&null!==f&&f.$$typeof===Ha&&Ng(f)===b.type))return d=e(b,c.props),d.ref=Lg(a,b,c),d.return=a,d;d=Rg(c.type,c.key,c.props,null,a.mode,d);d.ref=Lg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Tg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if(\"string\"===typeof b&&\"\"!==b||\"number\"===typeof b)return b=Qg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=Rg(b.type,b.key,b.props,null,a.mode,c),\nc.ref=Lg(a,null,b),c.return=a,c;case wa:return b=Sg(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Tg(b,a.mode,c,null),b.return=a,b;Mg(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c&&\"\"!==c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);Mg(a,c)}return null}function y(a,b,c,d,e){if(\"string\"===typeof d&&\"\"!==d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);Mg(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if(\"function\"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(p(191,e));e.call(d)}}}var th={},uh=Uf(th),vh=Uf(th),wh=Uf(th);function xh(a){if(a===th)throw Error(p(174));return a}\nfunction yh(a,b){G(wh,b);G(vh,a);G(uh,th);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(uh);G(uh,b)}function zh(){E(uh);E(vh);E(wh)}function Ah(a){xh(wh.current);var b=xh(uh.current);var c=lb(b,a.type);b!==c&&(G(vh,a),G(uh,c))}function Bh(a){vh.current===a&&(E(uh),E(vh))}var L=Uf(0);\nfunction Ch(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Dh=[];\nfunction Eh(){for(var a=0;a<Dh.length;a++)Dh[a]._workInProgressVersionPrimary=null;Dh.length=0}var Fh=ua.ReactCurrentDispatcher,Gh=ua.ReactCurrentBatchConfig,Hh=0,M=null,N=null,O=null,Ih=!1,Jh=!1,Kh=0,Lh=0;function P(){throw Error(p(321));}function Mh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Nh(a,b,c,d,e,f){Hh=f;M=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Fh.current=null===a||null===a.memoizedState?Oh:Ph;a=c(d,e);if(Jh){f=0;do{Jh=!1;Kh=0;if(25<=f)throw Error(p(301));f+=1;O=N=null;b.updateQueue=null;Fh.current=Qh;a=c(d,e)}while(Jh)}Fh.current=Rh;b=null!==N&&null!==N.next;Hh=0;O=N=M=null;Ih=!1;if(b)throw Error(p(300));return a}function Sh(){var a=0!==Kh;Kh=0;return a}\nfunction Th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===O?M.memoizedState=O=a:O=O.next=a;return O}function Uh(){if(null===N){var a=M.alternate;a=null!==a?a.memoizedState:null}else a=N.next;var b=null===O?M.memoizedState:O.next;if(null!==b)O=b,N=a;else{if(null===a)throw Error(p(310));N=a;a={memoizedState:N.memoizedState,baseState:N.baseState,baseQueue:N.baseQueue,queue:N.queue,next:null};null===O?M.memoizedState=O=a:O=O.next=a}return O}\nfunction Vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Wh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=N,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Hh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;M.lanes|=m;rh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(dh=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,M.lanes|=f,rh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction Xh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(dh=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function Yh(){}\nfunction Zh(a,b){var c=M,d=Uh(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,dh=!0);d=d.queue;$h(ai.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==O&&O.memoizedState.tag&1){c.flags|=2048;bi(9,ci.bind(null,c,d,e,b),void 0,null);if(null===Q)throw Error(p(349));0!==(Hh&30)||di(c,b,e)}return e}function di(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction ci(a,b,c,d){b.value=c;b.getSnapshot=d;ei(b)&&fi(a)}function ai(a,b,c){return c(function(){ei(b)&&fi(a)})}function ei(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function fi(a){var b=ih(a,1);null!==b&&gi(b,a,1,-1)}\nfunction hi(a){var b=Th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vh,lastRenderedState:a};b.queue=a;a=a.dispatch=ii.bind(null,M,a);return[b.memoizedState,a]}\nfunction bi(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function ji(){return Uh().memoizedState}function ki(a,b,c,d){var e=Th();M.flags|=a;e.memoizedState=bi(1|b,c,void 0,void 0===d?null:d)}\nfunction li(a,b,c,d){var e=Uh();d=void 0===d?null:d;var f=void 0;if(null!==N){var g=N.memoizedState;f=g.destroy;if(null!==d&&Mh(d,g.deps)){e.memoizedState=bi(b,c,f,d);return}}M.flags|=a;e.memoizedState=bi(1|b,c,f,d)}function mi(a,b){return ki(8390656,8,a,b)}function $h(a,b){return li(2048,8,a,b)}function ni(a,b){return li(4,2,a,b)}function oi(a,b){return li(4,4,a,b)}\nfunction pi(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function qi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return li(4,4,pi.bind(null,b,a),c)}function ri(){}function si(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction ti(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function ui(a,b,c){if(0===(Hh&21))return a.baseState&&(a.baseState=!1,dh=!0),a.memoizedState=c;He(c,b)||(c=yc(),M.lanes|=c,rh|=c,a.baseState=!0);return b}function vi(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0<c&&(b+=\"H\"+c.toString(32));b+=\":\"}else c=Lh++,b=\":\"+b+\"r\"+c.toString(32)+\":\";return a.memoizedState=b},unstable_isNewReconciler:!1},Ph={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Wh,useRef:ji,useState:function(){return Wh(Vh)},\nuseDebugValue:ri,useDeferredValue:function(a){var b=Uh();return ui(b,N.memoizedState,a)},useTransition:function(){var a=Wh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1},Qh={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Xh,useRef:ji,useState:function(){return Xh(Vh)},useDebugValue:ri,useDeferredValue:function(a){var b=Uh();return null===\nN?b.memoizedState=a:ui(b,N.memoizedState,a)},useTransition:function(){var a=Xh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1};function Ci(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}function Di(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Ei={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=R(),d=\nyi(a),e=mh(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=nh(a,e,d);null!==b&&(gi(b,a,d,c),oh(b,a,d))}};function Fi(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction Gi(a,b,c){var d=!1,e=Vf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=eh(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ei;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Hi(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ei.enqueueReplaceState(b,b.state,null)}\nfunction Ii(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs={};kh(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=eh(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Di(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\n\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ei.enqueueReplaceState(e,e.state,null),qh(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4194308)}function Ji(a,b){try{var c=\"\",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e,digest:null}}\nfunction Ki(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}function Li(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Mi=\"function\"===typeof WeakMap?WeakMap:Map;function Ni(a,b,c){c=mh(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Oi||(Oi=!0,Pi=d);Li(a,b)};return c}\nfunction Qi(a,b,c){c=mh(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Li(a,b)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){Li(a,b);\"function\"!==typeof d&&(null===Ri?Ri=new Set([this]):Ri.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nfunction Si(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Mi;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ti.bind(null,a,b,c),b.then(a,a))}function Ui(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Vi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=mh(-1,1),b.tag=2,nh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Wi=ua.ReactCurrentOwner,dh=!1;function Xi(a,b,c,d){b.child=null===a?Vg(b,null,c,d):Ug(b,a.child,c,d)}\nfunction Yi(a,b,c,d,e){c=c.render;var f=b.ref;ch(b,e);d=Nh(a,b,c,d,f,e);c=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&c&&vg(b);b.flags|=1;Xi(a,b,d,e);return b.child}\nfunction $i(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!aj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,bj(a,b,f,d,e);a=Rg(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return Zi(a,b,e)}b.flags|=1;a=Pg(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction bj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(dh=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(dh=!0);else return b.lanes=a.lanes,Zi(a,b,e)}return cj(a,b,c,d,e)}\nfunction dj(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(ej,fj),fj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(ej,fj),fj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(ej,fj);fj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(ej,fj),fj|=d;Xi(a,b,e,c);return b.child}function gj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function cj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);ch(b,e);c=Nh(a,b,c,d,f,e);d=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&d&&vg(b);b.flags|=1;Xi(a,b,c,e);return b.child}\nfunction hj(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;ch(b,e);if(null===b.stateNode)ij(a,b),Gi(b,c,d),Ii(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=eh(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;q||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&Hi(b,g,d,l);jh=!1;var r=b.memoizedState;g.state=r;qh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||jh?(\"function\"===typeof m&&(Di(b,c,m,d),k=b.memoizedState),(h=jh||Fi(b,c,h,d,r,k,l))?(q||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.flags|=4194308)):\n(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;lh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Ci(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=eh(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===typeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\n\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&Hi(b,g,d,k);jh=!1;r=b.memoizedState;g.state=r;qh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||jh?(\"function\"===typeof y&&(Di(b,c,y,d),n=b.memoizedState),(l=jh||Fi(b,c,l,d,r,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return jj(a,b,c,d,f,e)}\nfunction jj(a,b,c,d,e,f){gj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),Zi(a,b,f);d=b.stateNode;Wi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Ug(b,a.child,null,f),b.child=Ug(b,null,h,f)):Xi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function kj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);yh(a,b.containerInfo)}\nfunction lj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Xi(a,b,c,d);return b.child}var mj={dehydrated:null,treeContext:null,retryLane:0};function nj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction oj(a,b,c){var d=b.pendingProps,e=L.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(L,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:\"hidden\",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=pj(g,d,0,null),a=Tg(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=nj(c),b.memoizedState=mj,a):qj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return rj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:\"hidden\",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=Pg(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=Pg(h,f):(f=Tg(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?nj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=mj;return d}f=a.child;a=f.sibling;d=Pg(f,{mode:\"visible\",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction qj(a,b){b=pj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function sj(a,b,c,d){null!==d&&Jg(d);Ug(b,a.child,null,c);a=qj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction rj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Ki(Error(p(422))),sj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=pj({mode:\"visible\",children:d.children},e,0,null);f=Tg(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Ug(b,a.child,null,g);b.child.memoizedState=nj(g);b.memoizedState=mj;return f}if(0===(b.mode&1))return sj(a,b,g,null);if(\"$!\"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Ki(f,d,void 0);return sj(a,b,g,d)}h=0!==(g&a.childLanes);if(dh||h){d=Q;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,ih(a,e),gi(d,a,e,-1))}tj();d=Ki(Error(p(421)));return sj(a,b,g,d)}if(\"$?\"===e.data)return b.flags|=128,b.child=a.child,b=uj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=qj(b,d.children);b.flags|=4096;return b}function vj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);bh(a.return,b,c)}\nfunction wj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction xj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Xi(a,b,d.children,c);d=L.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&vj(a,c,b);else if(19===a.tag)vj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(L,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Ch(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);wj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Ch(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}wj(b,!0,c,null,f);break;case \"together\":wj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction ij(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function Zi(a,b,c){null!==a&&(b.dependencies=a.dependencies);rh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=Pg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Pg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction yj(a,b,c){switch(b.tag){case 3:kj(b);Ig();break;case 5:Ah(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:yh(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Wg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(L,L.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return oj(a,b,c);G(L,L.current&1);a=Zi(a,b,c);return null!==a?a.sibling:null}G(L,L.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return xj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(L,L.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,dj(a,b,c)}return Zi(a,b,c)}var zj,Aj,Bj,Cj;\nzj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Aj=function(){};\nBj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;xh(uh.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"select\":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ea.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&D(\"scroll\",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Cj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Dj(a,b){if(!I)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Ej(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;zh();E(Wf);E(H);Eh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Fj(zg),zg=null));Aj(a,b);S(b);return null;case 5:Bh(b);var e=xh(wh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Bj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case \"dialog\":D(\"cancel\",d);D(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",d);break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],d);break;case \"source\":D(\"error\",d);break;case \"img\":case \"image\":case \"link\":D(\"error\",\nd);D(\"load\",d);break;case \"details\":D(\"toggle\",d);break;case \"input\":Za(d,f);D(\"invalid\",d);break;case \"select\":d._wrapperState={wasMultiple:!!f.multiple};D(\"invalid\",d);break;case \"textarea\":hb(d,f),D(\"invalid\",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=[\"children\",\"\"+h]):ea.hasOwnProperty(g)&&null!=h&&\"onScroll\"===g&&D(\"scroll\",d)}switch(c){case \"input\":Va(d);db(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;\"http://www.w3.org/1999/xhtml\"===a&&(a=kb(c));\"http://www.w3.org/1999/xhtml\"===a?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case \"source\":D(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":D(\"error\",\na);D(\"load\",a);e=d;break;case \"details\":D(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);D(\"invalid\",a);break;case \"option\":e=d;break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D(\"invalid\",a);break;case \"textarea\":hb(a,d);e=gb(a,d);D(\"invalid\",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?sb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==\nc||\"\"!==k)&&ob(a,k):\"number\"===typeof k&&ob(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ea.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&D(\"scroll\",a):null!=k&&ta(a,f,k,g))}switch(c){case \"input\":Va(a);db(a,d,!1);break;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case \"button\":case \"input\":case \"select\":case \"textarea\":d=!!d.autoFocus;break a;case \"img\":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Cj(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(p(166));c=xh(wh.current);xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(L);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Fj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(L.current&1)?0===T&&(T=3):tj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return zh(),\nAj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return ah(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(L);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Dj(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Ch(a);if(null!==g){b.flags|=128;Dj(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(L,L.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Gj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Xj=!1;break a;case 3:X=h.stateNode.containerInfo;Xj=!0;break a;case 4:X=h.stateNode.containerInfo;Xj=!0;break a}h=h.return}if(null===X)throw Error(p(160));Zj(f,g,e);X=null;Xj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)dk(b,a),b=b.sibling}\nfunction dk(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:ck(b,a);ek(a);if(d&4){try{Pj(3,a,a.return),Qj(3,a)}catch(t){W(a,a.return,t)}try{Pj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);break;case 5:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,\"\")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{\"input\"===h&&\"radio\"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];\"style\"===m?sb(e,q):\"dangerouslySetInnerHTML\"===m?nb(e,q):\"children\"===m?ob(e,q):ta(e,m,q,l)}switch(h){case \"input\":bb(e,f);break;case \"textarea\":ib(e,f);break;case \"select\":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:\"\",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:ck(b,a);ek(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:ck(b,a);ek(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:ck(b,a);ek(a);break;case 13:ck(b,a);ek(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(fk=B()));d&4&&ak(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,ck(b,a),U=l):ck(b,a);ek(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Pj(4,r,r.return);break;case 1:Lj(r,r.return);var n=r.stateNode;if(\"function\"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Lj(r,r.return);break;case 22:if(null!==r.memoizedState){gk(q);continue}}null!==y?(y.return=r,V=y):gk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty(\"display\")?k.display:null,h.style.display=\nrb(\"display\",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?\"\":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:ck(b,a);ek(a);d&4&&ak(a);break;case 21:break;default:ck(b,\na),ek(a)}}function ek(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Tj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,\"\"),d.flags&=-33);var f=Uj(a);Wj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Uj(a);Vj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function hk(a,b,c){V=a;ik(a,b,c)}\nfunction ik(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Jj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Jj;var l=U;Jj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?jk(e):null!==k?(k.return=g,V=k):jk(e);for(;null!==f;)V=f,ik(f,b,c),f=f.sibling;V=e;Jj=h;U=l}kk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):kk(a,b,c)}}\nfunction kk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Qj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Ci(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&sh(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}sh(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case \"button\":case \"input\":case \"select\":case \"textarea\":k.autoFocus&&c.focus();break;case \"img\":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Rj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function gk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction jk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Qj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if(\"function\"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Rj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Rj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar lk=Math.ceil,mk=ua.ReactCurrentDispatcher,nk=ua.ReactCurrentOwner,ok=ua.ReactCurrentBatchConfig,K=0,Q=null,Y=null,Z=0,fj=0,ej=Uf(0),T=0,pk=null,rh=0,qk=0,rk=0,sk=null,tk=null,fk=0,Gj=Infinity,uk=null,Oi=!1,Pi=null,Ri=null,vk=!1,wk=null,xk=0,yk=0,zk=null,Ak=-1,Bk=0;function R(){return 0!==(K&6)?B():-1!==Ak?Ak:Ak=B()}\nfunction yi(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Bk&&(Bk=yc()),Bk;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function gi(a,b,c,d){if(50<yk)throw yk=0,zk=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==Q)a===Q&&(0===(K&2)&&(qk|=c),4===T&&Ck(a,Z)),Dk(a,d),1===c&&0===K&&0===(b.mode&1)&&(Gj=B()+500,fg&&jg())}\nfunction Dk(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===Q?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Ek.bind(null,a)):hg(Ek.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Fk(c,Gk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Gk(a,b){Ak=-1;Bk=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Hk()&&a.callbackNode!==c)return null;var d=uc(a,a===Q?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Ik(a,d);else{b=d;var e=K;K|=2;var f=Jk();if(Q!==a||Z!==b)uk=null,Gj=B()+500,Kk(a,b);do try{Lk();break}catch(h){Mk(a,h)}while(1);$g();mk.current=f;K=e;null!==Y?b=0:(Q=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Nk(a,e)));if(1===b)throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;if(6===b)Ck(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Ok(e)&&(b=Ik(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Nk(a,f))),1===b))throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Pk(a,tk,uk);break;case 3:Ck(a,d);if((d&130023424)===d&&(b=fk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){R();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),b);break}Pk(a,tk,uk);break;case 4:Ck(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),d);break}Pk(a,tk,uk);break;case 5:Pk(a,tk,uk);break;default:throw Error(p(329));}}}Dk(a,B());return a.callbackNode===c?Gk.bind(null,a):null}\nfunction Nk(a,b){var c=sk;a.current.memoizedState.isDehydrated&&(Kk(a,b).flags|=256);a=Ik(a,b);2!==a&&(b=tk,tk=c,null!==b&&Fj(b));return a}function Fj(a){null===tk?tk=a:tk.push.apply(tk,a)}\nfunction Ok(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Ck(a,b){b&=~rk;b&=~qk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Ek(a){if(0!==(K&6))throw Error(p(327));Hk();var b=uc(a,0);if(0===(b&1))return Dk(a,B()),null;var c=Ik(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Nk(a,d))}if(1===c)throw c=pk,Kk(a,0),Ck(a,b),Dk(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Pk(a,tk,uk);Dk(a,B());return null}\nfunction Qk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Gj=B()+500,fg&&jg())}}function Rk(a){null!==wk&&0===wk.tag&&0===(K&6)&&Hk();var b=K;K|=1;var c=ok.transition,d=C;try{if(ok.transition=null,C=1,a)return a()}finally{C=d,ok.transition=c,K=b,0===(K&6)&&jg()}}function Hj(){fj=ej.current;E(ej)}\nfunction Kk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:zh();E(Wf);E(H);Eh();break;case 5:Bh(d);break;case 4:zh();break;case 13:E(L);break;case 19:E(L);break;case 10:ah(d.type._context);break;case 22:case 23:Hj()}c=c.return}Q=a;Y=a=Pg(a.current,null);Z=fj=b;T=0;pk=null;rk=qk=rh=0;tk=sk=null;if(null!==fh){for(b=\n0;b<fh.length;b++)if(c=fh[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}fh=null}return a}\nfunction Mk(a,b){do{var c=Y;try{$g();Fh.current=Rh;if(Ih){for(var d=M.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Ih=!1}Hh=0;O=N=M=null;Jh=!1;Kh=0;nk.current=null;if(null===c||null===c.return){T=1;pk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Ui(g);if(null!==y){y.flags&=-257;Vi(y,g,h,f,b);y.mode&1&&Si(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Si(f,l,b);tj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Ui(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Vi(J,g,h,f,b);Jg(Ji(k,h));break a}}f=k=Ji(k,h);4!==T&&(T=2);null===sk?sk=[f]:sk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Ni(f,k,b);ph(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&(\"function\"===typeof w.getDerivedStateFromError||null!==u&&\"function\"===typeof u.componentDidCatch&&(null===Ri||!Ri.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Qi(f,h,b);ph(f,F);break a}}f=f.return}while(null!==f)}Sk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Jk(){var a=mk.current;mk.current=Rh;return null===a?Rh:a}\nfunction tj(){if(0===T||3===T||2===T)T=4;null===Q||0===(rh&268435455)&&0===(qk&268435455)||Ck(Q,Z)}function Ik(a,b){var c=K;K|=2;var d=Jk();if(Q!==a||Z!==b)uk=null,Kk(a,b);do try{Tk();break}catch(e){Mk(a,e)}while(1);$g();K=c;mk.current=d;if(null!==Y)throw Error(p(261));Q=null;Z=0;return T}function Tk(){for(;null!==Y;)Uk(Y)}function Lk(){for(;null!==Y&&!cc();)Uk(Y)}function Uk(a){var b=Vk(a.alternate,a,fj);a.memoizedProps=a.pendingProps;null===b?Sk(a):Y=b;nk.current=null}\nfunction Sk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Ej(c,b,fj),null!==c){Y=c;return}}else{c=Ij(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Pk(a,b,c){var d=C,e=ok.transition;try{ok.transition=null,C=1,Wk(a,b,c,d)}finally{ok.transition=e,C=d}return null}\nfunction Wk(a,b,c,d){do Hk();while(null!==wk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===Q&&(Y=Q=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||vk||(vk=!0,Fk(hc,function(){Hk();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=ok.transition;ok.transition=null;\nvar g=C;C=1;var h=K;K|=4;nk.current=null;Oj(a,c);dk(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;hk(c,a,e);dc();K=h;C=g;ok.transition=f}else a.current=c;vk&&(vk=!1,wk=a,xk=e);f=a.pendingLanes;0===f&&(Ri=null);mc(c.stateNode,d);Dk(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Oi)throw Oi=!1,a=Pi,Pi=null,a;0!==(xk&1)&&0!==a.tag&&Hk();f=a.pendingLanes;0!==(f&1)?a===zk?yk++:(yk=0,zk=a):yk=0;jg();return null}\nfunction Hk(){if(null!==wk){var a=Dc(xk),b=ok.transition,c=C;try{ok.transition=null;C=16>a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Pj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Sj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Pj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Qj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&\"function\"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,ok.transition=b}}return!1}function Xk(a,b,c){b=Ji(c,b);b=Ni(a,b,1);a=nh(a,b,1);b=R();null!==a&&(Ac(a,1,b),Dk(a,b))}\nfunction W(a,b,c){if(3===a.tag)Xk(a,a,c);else for(;null!==b;){if(3===b.tag){Xk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if(\"function\"===typeof b.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ri||!Ri.has(d))){a=Ji(c,a);a=Qi(b,a,1);b=nh(b,a,1);a=R();null!==b&&(Ac(b,1,a),Dk(b,a));break}}b=b.return}}\nfunction Ti(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=R();a.pingedLanes|=a.suspendedLanes&c;Q===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction dl(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction el(a,b,c,d,e,f,g,h,k){a=bl(c,d,!0,a,e,f,g,h,k);a.context=dl(null);c=a.current;d=R();e=yi(c);f=mh(d,e);f.callback=void 0!==b&&null!==b?b:null;nh(c,f,e);a.current.lanes=e;Ac(a,e,d);Dk(a,d);return a}function fl(a,b,c,d){var e=b.current,f=R(),g=yi(e);c=dl(c);null===b.context?b.context=c:b.pendingContext=c;b=mh(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=nh(e,b,g);null!==a&&(gi(a,e,g,f),oh(a,e,g));return g}\nfunction gl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function hl(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function il(a,b){hl(a,b);(a=a.alternate)&&hl(a,b)}function jl(){return null}var kl=\"function\"===typeof reportError?reportError:function(a){console.error(a)};function ll(a){this._internalRoot=a}\nml.prototype.render=ll.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));fl(a,b,null,null)};ml.prototype.unmount=ll.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Rk(function(){fl(null,a,null,null)});b[uf]=null}};function ml(a){this._internalRoot=a}\nml.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function nl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function pl(){}\nfunction ql(a,b,c,d,e){if(e){if(\"function\"===typeof d){var f=d;d=function(){var a=gl(g);f.call(a)}}var g=el(b,d,a,0,null,!1,!1,\"\",pl);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Rk();return g}for(;e=a.lastChild;)a.removeChild(e);if(\"function\"===typeof d){var h=d;d=function(){var a=gl(k);h.call(a)}}var k=bl(a,0,!1,null,null,!1,!1,\"\",pl);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Rk(function(){fl(b,k,c,d)});return k}\nfunction rl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if(\"function\"===typeof e){var h=e;e=function(){var a=gl(g);h.call(a)}}fl(b,g,a,e)}else g=ql(c,b,a,e,d);return gl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Dk(b,B()),0===(K&6)&&(Gj=B()+500,jg()))}break;case 13:Rk(function(){var b=ih(a,1);if(null!==b){var c=R();gi(b,a,1,c)}}),il(a,1)}};\nFc=function(a){if(13===a.tag){var b=ih(a,134217728);if(null!==b){var c=R();gi(b,a,134217728,c)}il(a,134217728)}};Gc=function(a){if(13===a.tag){var b=yi(a),c=ih(a,b);if(null!==c){var d=R();gi(c,a,b,d)}il(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case \"input\":bb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Qk;Hb=Rk;\nvar sl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Qk]},tl={findFiberByHostInstance:Wc,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"};\nvar ul={bundleType:tl.bundleType,version:tl.version,rendererPackageName:tl.rendererPackageName,rendererConfig:tl.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:tl.findFiberByHostInstance||\njl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var vl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!vl.isDisabled&&vl.supportsFiber)try{kc=vl.inject(ul),lc=vl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=sl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!nl(b))throw Error(p(200));return cl(a,b,null,c)};exports.createRoot=function(a,b){if(!nl(a))throw Error(p(299));var c=!1,d=\"\",e=kl;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=bl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ll(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(\",\");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Rk(a)};exports.hydrate=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!nl(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f=\"\",g=kl;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=el(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new ml(b)};exports.render=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!ol(a))throw Error(p(40));return a._reactRootContainer?(Rk(function(){rl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Qk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!ol(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return rl(a,b,c,!1,d)};exports.version=\"18.3.1-next-f1338f8080-20240426\";\n","module.exports = function () { /* empty */ };\n","/* parser generated by jison 0.4.18 */\n/*\n  Returns a Parser object of the following structure:\n\n  Parser: {\n    yy: {}\n  }\n\n  Parser.prototype: {\n    yy: {},\n    trace: function(),\n    symbols_: {associative list: name ==> number},\n    terminals_: {associative list: number ==> name},\n    productions_: [...],\n    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n    table: [...],\n    defaultActions: {...},\n    parseError: function(str, hash),\n    parse: function(input),\n\n    lexer: {\n        EOF: 1,\n        parseError: function(str, hash),\n        setInput: function(input),\n        input: function(),\n        unput: function(str),\n        more: function(),\n        less: function(n),\n        pastInput: function(),\n        upcomingInput: function(),\n        showPosition: function(),\n        test_match: function(regex_match_array, rule_index),\n        next: function(),\n        lex: function(),\n        begin: function(condition),\n        popState: function(),\n        _currentRules: function(),\n        topState: function(),\n        pushState: function(condition),\n\n        options: {\n            ranges: boolean           (optional: true ==> token location info will include a .range[] member)\n            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n        },\n\n        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n        rules: [...],\n        conditions: {associative list: name ==> set},\n    }\n  }\n\n\n  token location info (@$, _$, etc.): {\n    first_line: n,\n    last_line: n,\n    first_column: n,\n    last_column: n,\n    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)\n  }\n\n\n  the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n    text:        (matched text)\n    token:       (the produced terminal token, if any)\n    line:        (yylineno)\n  }\n  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n    loc:         (yylloc)\n    expected:    (string describing the set of expected tokens)\n    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n  }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,6],$V1=[1,7],$V2=[1,8],$V3=[1,9],$V4=[5,11,13,14,15],$V5=[5,11,13,14,15,17,19,21],$V6=[2,17],$V7=[1,14],$V8=[5,11,13,14,15,17,19,21,22],$V9=[1,18],$Va=[1,19],$Vb=[1,20],$Vc=[1,21],$Vd=[1,43],$Ve=[1,32],$Vf=[1,33],$Vg=[1,42],$Vh=[1,41],$Vi=[1,39],$Vj=[1,48],$Vk=[1,55],$Vl=[1,50],$Vm=[1,51],$Vn=[1,52],$Vo=[1,53],$Vp=[1,54],$Vq=[1,56],$Vr=[1,44],$Vs=[1,45],$Vt=[1,46],$Vu=[1,47],$Vv=[1,57],$Vw=[5,11,13,14,15,17,19,21,25],$Vx=[5,11,13,14,15,17,19,21,23,31,32,37,38,45,48,57,61,62,63,64,65,66,70,71,73,75,76],$Vy=[2,79],$Vz=[1,67],$VA=[1,64],$VB=[1,65],$VC=[1,66],$VD=[1,73],$VE=[1,74],$VF=[1,78],$VG=[1,79],$VH=[1,80],$VI=[1,81],$VJ=[41,57,59,61,62,63,64,65,66,67,68,69],$VK=[38,45,48,76],$VL=[41,48,57,59,61,62,63,64,65,66,67,68,69,81],$VM=[5,11,13,14,15,17,19,21,23,31,32,37,38,41,45,48,57,61,62,63,64,65,66,70,71,73,75,76],$VN=[1,101],$VO=[44,46],$VP=[2,63],$VQ=[1,106],$VR=[5,11,13,14,15,17,19,21,23,31,32,37,38,45,48,57,59,61,62,63,64,65,66,70,71,73,75,76],$VS=[5,11,13,14,15,17,19,21,23,31,32,37,38,45,48,57,59,60,61,62,63,64,65,66,70,71,73,75,76],$VT=[25,71],$VU=[41,48,57,59,61,62,63,64,65,66,67,68,69],$VV=[5,11,13,14,15,17,19,21,23,31,32,37,38,44,45,46,48,57,61,62,63,64,65,66,70,71,73,75,76];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"e\":3,\"maybe_vextab\":4,\"EOF\":5,\"vextab\":6,\"stave\":7,\"voice\":8,\"maybe_options\":9,\"stave_data\":10,\"OPTIONS\":11,\"options\":12,\"TABSTAVE\":13,\"STAVE\":14,\"VOICE\":15,\"stave_additions\":16,\"TEXT\":17,\"text\":18,\"NOTES\":19,\"notes\":20,\"SLUR\":21,\"WORD\":22,\"=\":23,\"STR\":24,\",\":25,\"lingo\":26,\"line\":27,\"chord\":28,\"time\":29,\"bar\":30,\"[\":31,\"]\":32,\"tuplets\":33,\"annotations\":34,\"command\":35,\"rest\":36,\"|\":37,\":\":38,\"frets\":39,\"maybe_decorator\":40,\"/\":41,\"string\":42,\"chord_line\":43,\".\":44,\"(\":45,\")\":46,\"articulation\":47,\"NUMBER\":48,\"abc\":49,\"_\":50,\"timed_fret\":51,\"time_values\":52,\"maybe_dot\":53,\"time_unit\":54,\"maybe_slash\":55,\"w\":56,\"h\":57,\"q\":58,\"d\":59,\"S\":60,\"-\":61,\"s\":62,\"t\":63,\"T\":64,\"b\":65,\"p\":66,\"v\":67,\"V\":68,\"u\":69,\"^\":70,\"$\":71,\"annotation_words\":72,\"!\":73,\"COMMAND\":74,\"#\":75,\"ABC\":76,\"abc_accidental\":77,\"accidental_type\":78,\"@\":79,\"n\":80,\"~\":81,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"EOF\",11:\"OPTIONS\",13:\"TABSTAVE\",14:\"STAVE\",15:\"VOICE\",17:\"TEXT\",19:\"NOTES\",21:\"SLUR\",22:\"WORD\",23:\"=\",24:\"STR\",25:\",\",31:\"[\",32:\"]\",37:\"|\",38:\":\",41:\"/\",44:\".\",45:\"(\",46:\")\",48:\"NUMBER\",50:\"_\",56:\"w\",57:\"h\",58:\"q\",59:\"d\",60:\"S\",61:\"-\",62:\"s\",63:\"t\",64:\"T\",65:\"b\",66:\"p\",67:\"v\",68:\"V\",69:\"u\",70:\"^\",71:\"$\",73:\"!\",74:\"COMMAND\",75:\"#\",76:\"ABC\",79:\"@\",80:\"n\",81:\"~\"},\nproductions_: [0,[3,2],[4,0],[4,1],[6,1],[6,2],[7,3],[7,2],[7,2],[8,1],[8,1],[8,1],[10,1],[10,2],[16,2],[16,2],[16,2],[9,0],[9,1],[12,3],[12,4],[18,1],[18,3],[20,1],[20,2],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[26,1],[30,1],[30,3],[30,3],[30,3],[30,3],[30,3],[27,4],[43,1],[43,3],[28,4],[28,5],[39,1],[39,1],[39,4],[39,2],[39,4],[51,5],[51,1],[51,5],[51,8],[51,1],[51,4],[29,3],[52,2],[54,1],[54,1],[54,1],[54,1],[53,0],[53,1],[55,0],[55,1],[42,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[40,1],[40,1],[40,1],[40,1],[40,0],[33,3],[33,5],[34,3],[72,1],[72,3],[35,3],[36,2],[36,3],[36,4],[49,3],[77,1],[77,2],[77,1],[77,2],[77,1],[77,0],[78,0],[78,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n\n      return $$[$0-1];\n\nbreak;\ncase 2: case 17: case 79:\n this.$ = null\nbreak;\ncase 3: case 12: case 18: case 23: case 25: case 26: case 27: case 42: case 59: case 60: case 61: case 62: case 67:\n this.$ = $$[$0]\nbreak;\ncase 4: case 83:\n this.$ = [$$[$0]]\nbreak;\ncase 5:\n this.$ = [].concat($$[$0-1], $$[$0])\nbreak;\ncase 6:\n this.$ = {\n        element: $$[$0-2],\n        options: $$[$0-1],\n        notes: $$[$0].notes,\n        text: $$[$0].text,\n        _l: _$[$0-2].first_line,\n        _c: _$[$0-2].first_column\n      }\n\nbreak;\ncase 7:\n this.$ = {\n        element: $$[$0-1],\n        options: $$[$0],\n        _l: _$[$0-1].first_line,\n        _c: _$[$0-1].first_column\n      }\n\nbreak;\ncase 8:\n\n      this.$ = {\n        element: \"options\",\n        params: $$[$0],\n        _l: _$[$0-1].first_line,\n        _c: _$[$0-1].first_column\n      }\n\nbreak;\ncase 13:\n\n      var text = [].concat($$[$0-1].text, $$[$0].text);\n      var notes = [].concat($$[$0-1].notes, $$[$0].notes);\n      var slurs = [].concat($$[$0-1].slurs, $$[$0].slurs)\n      this.$ = {text: text, notes: notes, slurs: slurs};\n\nbreak;\ncase 14:\nthis.$ = {text: $$[$0], notes: [], slurs: []}\nbreak;\ncase 15:\nthis.$ = {notes: $$[$0], text: [], slurs: []}\nbreak;\ncase 16:\nthis.$ = {slurs: $$[$0], notes: [], text: []}\nbreak;\ncase 19:\n this.$ = [{\n        key: $$[$0-2],\n        value: $$[$0],\n        _l: _$[$0-2].first_line,\n        _c: _$[$0-2].first_column\n      }]\n\nbreak;\ncase 20:\n this.$ = [].concat($$[$0-3], [{\n        key: $$[$0-2],\n        value: $$[$0],\n        _l: _$[$0-2].first_line,\n        _c: _$[$0-2].first_column\n        }])\n\nbreak;\ncase 21:\n this.$ = [{text: $$[$0], _l: _$[$0].first_line, _c: _$[$0].first_column}]\nbreak;\ncase 22:\n this.$ = [].concat($$[$0-2], {text: $$[$0], _l: _$[$0].first_line, _c: _$[$0].first_column})\nbreak;\ncase 24:\n this.$ = [].concat($$[$0-1], $$[$0])\nbreak;\ncase 28:\n this.$ = [{\n        command: \"bar\",\n        type: $$[$0],\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n        }]\n\nbreak;\ncase 29:\n this.$ = [{\n        command: \"open_beam\",\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n      }]\n\nbreak;\ncase 30:\n this.$ = [{\n        command: \"close_beam\",\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n      }]\n\nbreak;\ncase 31:\n this.$ = [{\n        command: \"tuplet\",\n        params: $$[$0],\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n      }]\n\nbreak;\ncase 32:\n this.$ = [{\n        command: \"annotations\",\n        params: $$[$0],\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n      }]\n\nbreak;\ncase 33:\n this.$ = [{\n        command: \"command\",\n        params: $$[$0],\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column\n      }]\n\nbreak;\ncase 34:\n\n    this.$ = [{\n        command: \"rest\",\n        params: $$[$0]\n      }]\n\nbreak;\ncase 35:\n this.$ = 'single'\nbreak;\ncase 36:\n this.$ = 'double'\nbreak;\ncase 37:\n this.$ = 'end'\nbreak;\ncase 38:\n this.$ = 'repeat-end'\nbreak;\ncase 39:\n this.$ = 'repeat-begin'\nbreak;\ncase 40:\n this.$ = 'repeat-both'\nbreak;\ncase 41:\n\n      _.extend(_.last($$[$0-3]), {decorator: $$[$0-2]})\n      _.each($$[$0-3], function(fret) { fret['string'] = $$[$0] })\n      this.$ = $$[$0-3]\n\nbreak;\ncase 43: case 84:\n this.$ = [].concat($$[$0-2], $$[$0])\nbreak;\ncase 44:\n this.$ = [{chord: $$[$0-2], decorator: $$[$0]}]\nbreak;\ncase 45:\n this.$ = [{chord: $$[$0-2], articulation: $$[$0-4], decorator: $$[$0]}]\nbreak;\ncase 46:\n this.$ = [{\n        fret: $$[$0],\n        _l: _$[$0].first_line,\n        _c: _$[$0].first_column}]\n\nbreak;\ncase 47:\n this.$ = [{abc: $$[$0], _l: _$[$0].first_line, _c: _$[$0].first_column}]\nbreak;\ncase 48:\n this.$ = [{abc: $$[$0-3], octave: $$[$0-2],\n             fret: $$[$0], _l: _$[$0-3].first_line, _c: _$[$0-3].first_column}]\nbreak;\ncase 49:\n this.$ = [_.extend($$[$0], {articulation: $$[$0-1]})]\nbreak;\ncase 50:\n\n      _.extend(_.last($$[$0-3]), {decorator: $$[$0-2]})\n      _.extend($$[$0], {articulation: $$[$0-1]})\n      $$[$0-3].push($$[$0])\n      this.$ = $$[$0-3]\n\nbreak;\ncase 51:\n this.$ = {\n      time: $$[$0-3], dot: $$[$0-2], fret: $$[$0],\n      _l: _$[$0-4].first_line, _c: _$[$0-4].first_column}\nbreak;\ncase 52:\n this.$ = {fret: $$[$0], _l: _$[$0].first_line, _c: _$[$0].first_column}\nbreak;\ncase 53:\n this.$ = {time: $$[$0-3], dot: $$[$0-2], abc: $$[$0]}\nbreak;\ncase 54:\n this.$ = {time: $$[$0-6], dot: $$[$0-5], abc: $$[$0-3], octave: $$[$0-2], fret: $$[$0]}\nbreak;\ncase 55:\n this.$ = {abc: $$[$0], _l: _$[$0].first_line, _c: _$[$0].first_column}\nbreak;\ncase 56:\n this.$ = {abc: $$[$0-3], octave: $$[$0-2],\n            fret: $$[$0], _l: _$[$0-3].first_line, _c: _$[$0-3].first_column}\nbreak;\ncase 57:\n this.$ = {time: $$[$0-1], dot: $$[$0]}\nbreak;\ncase 58:\n this.$ = $$[$0-1] + $$[$0]\nbreak;\ncase 63:\n this.$ = false\nbreak;\ncase 64:\n this.$ = true\nbreak;\ncase 65:\n this.$ = ''\nbreak;\ncase 66: case 69:\n this.$ = 's'\nbreak;\ncase 68:\n this.$ = '-'\nbreak;\ncase 70:\n this.$ = 't'\nbreak;\ncase 71:\n this.$ = 'T'\nbreak;\ncase 72:\n this.$ = 'b'\nbreak;\ncase 73:\n this.$ = 'h'\nbreak;\ncase 74:\n this.$ = 'p'\nbreak;\ncase 75:\n this.$ = 'v'\nbreak;\ncase 76:\n this.$ = 'V'\nbreak;\ncase 77:\n this.$ = 'u'\nbreak;\ncase 78:\n this.$ = 'd'\nbreak;\ncase 80:\n this.$ = {tuplet: $$[$0-1]}\nbreak;\ncase 81:\n this.$ = {tuplet: $$[$0-3], notes: $$[$0-1]}\nbreak;\ncase 82: case 85:\n this.$ = $$[$0-1]\nbreak;\ncase 86:\n this.$ = {position: 0}\nbreak;\ncase 87:\n this.$ = {position: $$[$0-1]}\nbreak;\ncase 88:\n this.$ = {position: $$[$0-1] * -1}\nbreak;\ncase 89:\n this.$ = {key: $$[$0-2], accidental: $$[$0-1], accidental_type: $$[$0]}\nbreak;\ncase 90:\n this.$ = \"#\"\nbreak;\ncase 91:\n this.$ = \"##\"\nbreak;\ncase 92:\n this.$ = \"b\"\nbreak;\ncase 93:\n this.$ = \"bb\"\nbreak;\ncase 94:\n this.$ = \"n\"\nbreak;\ncase 96:\n this.$ = null;\nbreak;\ncase 97:\n this.$ = \"c\"\nbreak;\n}\n},\ntable: [{3:1,4:2,5:[2,2],6:3,7:4,8:5,11:$V0,13:$V1,14:$V2,15:$V3},{1:[3]},{5:[1,10]},{5:[2,3],7:11,8:5,11:$V0,13:$V1,14:$V2,15:$V3},o($V4,[2,4]),o($V5,$V6,{9:12,12:13,22:$V7}),{12:15,22:$V7},o($V8,[2,9]),o($V8,[2,10]),o($V8,[2,11]),{1:[2,1]},o($V4,[2,5]),o($V4,[2,7],{10:16,16:17,17:$V9,19:$Va,21:$Vb}),o($V5,[2,18],{22:$Vc}),{23:[1,22]},o($V4,[2,8],{22:$Vc}),o($V4,[2,6],{16:23,17:$V9,19:$Va,21:$Vb}),o($V5,[2,12]),{18:24,24:[1,25]},{20:26,23:$Vd,26:27,27:28,28:29,29:30,30:31,31:$Ve,32:$Vf,33:34,34:35,35:36,36:37,37:$Vg,38:$Vh,39:38,45:$Vi,47:40,48:$Vj,49:49,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq,70:$Vr,71:$Vs,73:$Vt,75:$Vu,76:$Vv},o($V5,$V6,{12:13,9:58,22:$V7}),{23:[1,59]},{22:[1,60]},o($V5,[2,13]),o($V5,[2,14],{25:[1,61]}),o($Vw,[2,21]),o($V5,[2,15],{27:28,28:29,29:30,30:31,33:34,34:35,35:36,36:37,39:38,47:40,49:49,26:62,23:$Vd,31:$Ve,32:$Vf,37:$Vg,38:$Vh,45:$Vi,48:$Vj,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq,70:$Vr,71:$Vs,73:$Vt,75:$Vu,76:$Vv}),o($Vx,[2,23]),o($Vx,[2,25]),o($Vx,[2,26]),o($Vx,[2,27]),o($Vx,[2,28]),o($Vx,[2,29]),o($Vx,[2,30]),o($Vx,[2,31]),o($Vx,[2,32]),o($Vx,[2,33]),o($Vx,[2,34]),o([41,57,61,62,63,64,65,66],$Vy,{40:63,59:$Vz,67:$VA,68:$VB,69:$VC}),{27:69,39:38,43:68,47:70,48:$Vj,49:49,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq,76:$Vv},{38:$VD,45:[1,71],48:$VE,49:75,51:72,76:$Vv},{48:$VF,52:76,54:77,56:$VG,57:$VH,58:$VI},o($Vx,[2,35]),{37:[1,82],38:[1,83]},{48:[1,84]},{22:[1,86],72:85},{74:[1,87]},{48:[1,89],61:[1,90],75:[1,88]},o($VJ,[2,46]),o($VJ,[2,47],{48:[1,91]}),o($VK,[2,68]),o($VK,[2,69]),o($VK,[2,70]),o($VK,[2,71]),o($VK,[2,72]),o($VK,[2,73]),o($VK,[2,74]),o($VL,[2,95],{77:92,75:[1,93],79:[1,94],80:[1,95]}),o($V5,[2,16]),{22:[1,96]},o($V8,[2,19]),{24:[1,97]},o($Vx,[2,24]),{41:[1,98],47:99,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq},o($VM,[2,75]),o($VM,[2,76]),o($VM,[2,77]),o($VM,[2,78]),{44:$VN,46:[1,100]},o($VO,[2,42]),{38:$VD,48:$VE,49:75,51:72,76:$Vv},{27:69,39:38,43:102,47:70,48:$Vj,49:49,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq,76:$Vv},o($VJ,[2,49]),{48:$VF,52:103,54:77,56:$VG,57:$VH,58:$VI},o($VJ,[2,52]),o($VJ,[2,55],{48:[1,104]}),o($Vx,$VP,{53:105,59:$VQ}),o($VR,[2,65],{55:107,60:[1,108]}),o($VS,[2,59]),o($VS,[2,60]),o($VS,[2,61]),o($VS,[2,62]),{23:[1,110],37:[1,109],38:[1,111]},{37:[1,112],38:[1,113]},{25:[1,115],70:[1,114]},{25:[1,117],71:[1,116]},o($VT,[2,83]),{73:[1,118]},o($Vx,[2,86]),{75:[1,119]},{48:[1,120]},{50:[1,121]},o($VU,[2,96],{78:122,81:[1,123]}),o($VL,[2,90],{75:[1,124]}),o($VL,[2,92],{79:[1,125]}),o($VL,[2,94]),o($V8,[2,20]),o($Vw,[2,22]),{42:126,48:[1,127]},{38:$VD,48:$VE,49:75,51:128,76:$Vv},o($Vx,$Vy,{40:129,59:$Vz,67:$VA,68:$VB,69:$VC}),{27:130,39:38,47:70,48:$Vj,49:49,57:$Vk,61:$Vl,62:$Vm,63:$Vn,64:$Vo,65:$Vp,66:$Vq,76:$Vv},{44:$VN,46:[1,131]},{38:$VP,53:132,59:$VQ},{50:[1,133]},o($Vx,[2,57]),o($Vx,[2,64]),o($VR,[2,58]),o($VR,[2,66]),o($Vx,[2,36]),o($Vx,[2,37]),o($Vx,[2,39]),o($Vx,[2,38]),o($Vx,[2,40]),o($Vx,[2,80]),{48:[1,134]},o($Vx,[2,82]),{22:[1,135]},o($Vx,[2,85]),o($Vx,[2,87]),{75:[1,136]},{48:[1,137]},o($VU,[2,89]),o($VU,[2,97]),o($VL,[2,91]),o($VL,[2,93]),o($VV,[2,41]),o($VV,[2,67]),o($VJ,[2,50]),o($Vx,[2,44]),o($VO,[2,43]),o($Vx,$Vy,{40:138,59:$Vz,67:$VA,68:$VB,69:$VC}),{38:[1,139]},{48:[1,140]},{70:[1,141]},o($VT,[2,84]),o($Vx,[2,88]),o($VJ,[2,48]),o($Vx,[2,45]),{48:[1,142],49:143,76:$Vv},o($VJ,[2,56]),o($Vx,[2,81]),o($VJ,[2,51]),o($VJ,[2,53],{48:[1,144]}),{50:[1,145]},{48:[1,146]},o($VJ,[2,54])],\ndefaultActions: {10:[2,1]},\nparseError: function parseError (str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n    } else {\n        var error = new Error(str);\n        error.hash = hash;\n        throw error;\n    }\n},\nparse: function parse(input) {\n    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    var args = lstack.slice.call(arguments, 1);\n    var lexer = Object.create(this.lexer);\n    var sharedState = { yy: {} };\n    for (var k in this.yy) {\n        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n            sharedState.yy[k] = this.yy[k];\n        }\n    }\n    lexer.setInput(input, sharedState.yy);\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n    if (typeof lexer.yylloc == 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack.push(yyloc);\n    var ranges = lexer.options && lexer.options.ranges;\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = Object.getPrototypeOf(this).parseError;\n    }\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    _token_stack:\n        var lex = function () {\n            var token;\n            token = lexer.lex() || EOF;\n            if (typeof token !== 'number') {\n                token = self.symbols_[token] || token;\n            }\n            return token;\n        };\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || typeof symbol == 'undefined') {\n                symbol = lex();\n            }\n            action = table[state] && table[state][symbol];\n        }\n                    if (typeof action === 'undefined' || !action.length || !action[0]) {\n                var errStr = '';\n                expected = [];\n                for (p in table[state]) {\n                    if (this.terminals_[p] && p > TERROR) {\n                        expected.push('\\'' + this.terminals_[p] + '\\'');\n                    }\n                }\n                if (lexer.showPosition) {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n                } else {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n                }\n                this.parseError(errStr, {\n                    text: lexer.match,\n                    token: this.terminals_[symbol] || symbol,\n                    line: lexer.yylineno,\n                    loc: yyloc,\n                    expected: expected\n                });\n            }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(lexer.yytext);\n            lstack.push(lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = lexer.yyleng;\n                yytext = lexer.yytext;\n                yylineno = lexer.yylineno;\n                yyloc = lexer.yylloc;\n                if (recovering > 0) {\n                    recovering--;\n                }\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n                first_line: lstack[lstack.length - (len || 1)].first_line,\n                last_line: lstack[lstack.length - 1].last_line,\n                first_column: lstack[lstack.length - (len || 1)].first_column,\n                last_column: lstack[lstack.length - 1].last_column\n            };\n            if (ranges) {\n                yyval._$.range = [\n                    lstack[lstack.length - (len || 1)].range[0],\n                    lstack[lstack.length - 1].range[1]\n                ];\n            }\n            r = this.performAction.apply(yyval, [\n                yytext,\n                yyleng,\n                yylineno,\n                sharedState.yy,\n                action[1],\n                vstack,\n                lstack\n            ].concat(args));\n            if (typeof r !== 'undefined') {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}};\n\n  var _ = require(\"lodash\");\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n        if (this.yy.parser) {\n            this.yy.parser.parseError(str, hash);\n        } else {\n            throw new Error(str);\n        }\n    },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n        this.yy = yy || this.yy || {};\n        this._input = input;\n        this._more = this._backtrack = this.done = false;\n        this.yylineno = this.yyleng = 0;\n        this.yytext = this.matched = this.match = '';\n        this.conditionStack = ['INITIAL'];\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0,0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n// consumes and returns one char from the input\ninput:function () {\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(1);\n        return ch;\n    },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - 1);\n        this.matched = this.matched.substr(0, this.matched.length - 1);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n        var r = this.yylloc.range;\n\n        this.yylloc = {\n            first_line: this.yylloc.first_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.first_column,\n            last_column: lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                 + oldLines[oldLines.length - lines.length].length - lines[0].length :\n              this.yylloc.first_column - len\n        };\n\n        if (this.options.ranges) {\n            this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n        }\n        this.yyleng = this.yytext.length;\n        return this;\n    },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n        this._more = true;\n        return this;\n    },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n\n        }\n        return this;\n    },\n\n// retain first n characters of the match\nless:function (n) {\n        this.unput(this.match.slice(n));\n    },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\n        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n    },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n        var next = this.match;\n        if (next.length < 20) {\n            next += this._input.substr(0, 20-next.length);\n        }\n        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n    },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n        var pre = this.pastInput();\n        var c = new Array(pre.length + 1).join(\"-\");\n        return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n    },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n        var token,\n            lines,\n            backup;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match[0].length\n        };\n        this.yytext += match[0];\n        this.match += match[0];\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset += this.yyleng];\n        }\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match[0].length);\n        this.matched += match[0];\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        }\n        return false;\n    },\n\n// return next match in input\nnext:function () {\n        if (this.done) {\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.yytext = '';\n            this.match = '';\n        }\n        var rules = this._currentRules();\n        for (var i = 0; i < rules.length; i++) {\n            tempMatch = this._input.match(this.rules[rules[i]]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rules[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = false;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rules[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === \"\") {\n            return this.EOF;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n        }\n    },\n\n// return next match that has a token\nlex:function lex () {\n        var r = this.next();\n        if (r) {\n            return r;\n        } else {\n            return this.lex();\n        }\n    },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n        this.conditionStack.push(condition);\n    },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n        } else {\n            return this.conditions[\"INITIAL\"].rules;\n        }\n    },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return \"INITIAL\";\n        }\n    },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n        this.begin(condition);\n    },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0: this.begin('notes'); return 19;\nbreak;\ncase 1: this.begin('options'); return 13;\nbreak;\ncase 2: this.begin('options'); return 14;\nbreak;\ncase 3: this.begin('options'); return 15;\nbreak;\ncase 4: this.begin('options'); return 11;\nbreak;\ncase 5: this.begin('text'); return 17;\nbreak;\ncase 6: this.begin('options'); return 21;\nbreak;\ncase 7:return 22\nbreak;\ncase 8: this.begin('annotations'); return \"$\"\nbreak;\ncase 9: this.begin('notes'); return \"$\"\nbreak;\ncase 10:return 22\nbreak;\ncase 11: this.begin('command'); return \"!\"\nbreak;\ncase 12: this.begin('notes'); return \"!\"\nbreak;\ncase 13:return 74\nbreak;\ncase 14:return 24\nbreak;\ncase 15:return 41\nbreak;\ncase 16:return '+'\nbreak;\ncase 17:return 38\nbreak;\ncase 18:return 23\nbreak;\ncase 19:return 45\nbreak;\ncase 20:return 46\nbreak;\ncase 21:return 31\nbreak;\ncase 22:return 32\nbreak;\ncase 23:return 70\nbreak;\ncase 24:return 25\nbreak;\ncase 25:return 37\nbreak;\ncase 26:return 44\nbreak;\ncase 27:return 75\nbreak;\ncase 28:return 79\nbreak;\ncase 29:return 65\nbreak;\ncase 30:return 62\nbreak;\ncase 31:return 57\nbreak;\ncase 32:return 66\nbreak;\ncase 33:return 63\nbreak;\ncase 34:return 64\nbreak;\ncase 35:return 61\nbreak;\ncase 36:return 50\nbreak;\ncase 37:return 67\nbreak;\ncase 38:return 68\nbreak;\ncase 39:return 69\nbreak;\ncase 40:return 59\nbreak;\ncase 41:return 48\nbreak;\ncase 42:return 58\nbreak;\ncase 43:return 56\nbreak;\ncase 44:return 57\nbreak;\ncase 45:return 59\nbreak;\ncase 46:return 60\nbreak;\ncase 47:return 76\nbreak;\ncase 48:return 80\nbreak;\ncase 49:return 81\nbreak;\ncase 50: this.begin('INITIAL');\nbreak;\ncase 51:/* skip whitespace */\nbreak;\ncase 52:return 5\nbreak;\ncase 53:return 'INVALID'\nbreak;\n}\n},\nrules: [/^(?:notes\\b)/,/^(?:tabstave\\b)/,/^(?:stave\\b)/,/^(?:voice\\b)/,/^(?:options\\b)/,/^(?:text\\b)/,/^(?:slur\\b)/,/^(?:[^\\s=]+)/,/^(?:[$])/,/^(?:[$])/,/^(?:[^,$]+)/,/^(?:[!])/,/^(?:[!])/,/^(?:[^!]+)/,/^(?:[^,\\r\\n]+)/,/^(?:\\/)/,/^(?:\\+)/,/^(?::)/,/^(?:=)/,/^(?:\\()/,/^(?:\\))/,/^(?:\\[)/,/^(?:\\])/,/^(?:\\^)/,/^(?:,)/,/^(?:\\|)/,/^(?:\\.)/,/^(?:#)/,/^(?:@)/,/^(?:[b])/,/^(?:[s])/,/^(?:[h])/,/^(?:[p])/,/^(?:[t])/,/^(?:[T])/,/^(?:[-])/,/^(?:[_])/,/^(?:[v])/,/^(?:[V])/,/^(?:[u])/,/^(?:[d])/,/^(?:[0-9]+)/,/^(?:[q])/,/^(?:[w])/,/^(?:[h])/,/^(?:[d])/,/^(?:[S])/,/^(?:[A-GXLR])/,/^(?:[n])/,/^(?:[~])/,/^(?:[\\r\\n]+)/,/^(?:\\s+)/,/^(?:$)/,/^(?:.)/],\nconditions: {\"notes\":{\"rules\":[8,11,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],\"inclusive\":true},\"text\":{\"rules\":[14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,41,42,43,44,45,50,51,52,53],\"inclusive\":true},\"slur\":{\"rules\":[15,16,17,18,19,20,21,22,23,24,25,26,27,28,50,51,52,53],\"inclusive\":true},\"annotations\":{\"rules\":[9,10,15,16,17,18,19,20,21,22,23,24,25,26,27,28,50,51,52,53],\"inclusive\":true},\"options\":{\"rules\":[7,15,16,17,18,19,20,21,22,23,24,25,26,27,28,50,51,52,53],\"inclusive\":true},\"command\":{\"rules\":[12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,50,51,52,53],\"inclusive\":true},\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,15,16,17,18,19,20,21,22,23,24,25,26,27,28,50,51,52,53],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n  this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\n// require('fs') cannot be compiled for browser\n// exports.main = function commonjsMain (args) {\n//     if (!args[1]) {\n//         console.log('Usage: '+args[0]+' FILE');\n//         process.exit(1);\n//     }\n//     var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n//     return exports.parser.parse(source);\n// };\nif (typeof module !== 'undefined' && require.main === module) {\n  exports.main(process.argv.slice(1));\n}\n}","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bigint: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n","require('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc) {\n  return $Object.defineProperty(it, key, desc);\n};\n","/*\n * Konva JavaScript Framework v1.7.6\n * http://konvajs.github.io/\n * Licensed under the MIT or GPL Version 2 licenses.\n * Date: Wed Nov 01 2017\n *\n * Original work Copyright (C) 2011 - 2013 by Eric Rowell (KineticJS)\n * Modified work Copyright (C) 2014 - 2017 by Anton Lavrenov (Konva)\n *\n * @license\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n// runtime check for already included Konva\n(function() {\n  'use strict';\n  /**\n     * @namespace Konva\n     */\n\n  var PI_OVER_180 = Math.PI / 180;\n\n  var Konva = {\n    // public\n    version: '1.7.6',\n\n    // private\n    stages: [],\n    idCounter: 0,\n    ids: {},\n    names: {},\n    shapes: {},\n    listenClickTap: false,\n    inDblClickWindow: false,\n\n    isBrowser:\n      typeof window !== 'undefined' &&\n      // browser case\n      ({}.toString.call(window) === '[object Window]' ||\n        // electron case\n        {}.toString.call(window) === '[object global]'),\n\n    // configurations\n    enableTrace: false,\n    traceArrMax: 100,\n    dblClickWindow: 400,\n    /**\n         * Global pixel ratio configuration. KonvaJS automatically detect pixel ratio of current device.\n         * But you may override such property, if you want to use your value.\n         * @property pixelRatio\n         * @default undefined\n         * @memberof Konva\n         * @example\n         * Konva.pixelRatio = 1;\n         */\n    pixelRatio: undefined,\n    /**\n         * Drag distance property. If you start to drag a node you may want to wait until pointer is moved to some distance from start point,\n         * only then start dragging. Default is 3px.\n         * @property dragDistance\n         * @default 0\n         * @memberof Konva\n         * @example\n         * Konva.dragDistance = 10;\n         */\n    dragDistance: 3,\n    /**\n         * Use degree values for angle properties. You may set this property to false if you want to use radiant values.\n         * @property angleDeg\n         * @default true\n         * @memberof Konva\n         * @example\n         * node.rotation(45); // 45 degrees\n         * Konva.angleDeg = false;\n         * node.rotation(Math.PI / 2); // PI/2 radian\n         */\n    angleDeg: true,\n    /**\n         * Show different warnings about errors or wrong API usage\n         * @property showWarnings\n         * @default true\n         * @memberof Konva\n         * @example\n         * Konva.showWarnings = false;\n         */\n    showWarnings: true,\n\n    /**\n         * @namespace Filters\n         * @memberof Konva\n         */\n    Filters: {},\n\n    /**\n         * returns whether or not drag and drop is currently active\n         * @method\n         * @memberof Konva\n         */\n    isDragging: function() {\n      var dd = Konva.DD;\n\n      // if DD is not included with the build, then\n      // drag and drop is not even possible\n      if (dd) {\n        return dd.isDragging;\n      }\n      return false;\n    },\n    /**\n        * returns whether or not a drag and drop operation is ready, but may\n        *  not necessarily have started\n        * @method\n        * @memberof Konva\n        */\n    isDragReady: function() {\n      var dd = Konva.DD;\n\n      // if DD is not included with the build, then\n      // drag and drop is not even possible\n      if (dd) {\n        return !!dd.node;\n      }\n      return false;\n    },\n    _addId: function(node, id) {\n      if (id !== undefined) {\n        this.ids[id] = node;\n      }\n    },\n    _removeId: function(id) {\n      if (id !== undefined) {\n        delete this.ids[id];\n      }\n    },\n    _addName: function(node, name) {\n      if (name) {\n        if (!this.names[name]) {\n          this.names[name] = [];\n        }\n        this.names[name].push(node);\n      }\n    },\n    _removeName: function(name, _id) {\n      if (!name) {\n        return;\n      }\n      var nodes = this.names[name];\n      if (!nodes) {\n        return;\n      }\n      for (var n = 0; n < nodes.length; n++) {\n        var no = nodes[n];\n        if (no._id === _id) {\n          nodes.splice(n, 1);\n        }\n      }\n      if (nodes.length === 0) {\n        delete this.names[name];\n      }\n    },\n    getAngle: function(angle) {\n      return this.angleDeg ? angle * PI_OVER_180 : angle;\n    },\n    _detectIE: function(ua) {\n      var msie = ua.indexOf('msie ');\n      if (msie > 0) {\n        // IE 10 or older => return version number\n        return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n      }\n\n      var trident = ua.indexOf('trident/');\n      if (trident > 0) {\n        // IE 11 => return version number\n        var rv = ua.indexOf('rv:');\n        return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n      }\n\n      var edge = ua.indexOf('edge/');\n      if (edge > 0) {\n        // Edge (IE 12+) => return version number\n        return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n      }\n\n      // other browser\n      return false;\n    },\n    _parseUA: function(userAgent) {\n      var ua = userAgent.toLowerCase(),\n        // jQuery UA regex\n        match =\n          /(chrome)[ /]([\\w.]+)/.exec(ua) ||\n          /(webkit)[ /]([\\w.]+)/.exec(ua) ||\n          /(opera)(?:.*version|)[ /]([\\w.]+)/.exec(ua) ||\n          /(msie) ([\\w.]+)/.exec(ua) ||\n          (ua.indexOf('compatible') < 0 &&\n            /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(ua)) ||\n          [],\n        // adding mobile flag as well\n        mobile = !!userAgent.match(\n          /Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i\n        ),\n        ieMobile = !!userAgent.match(/IEMobile/i);\n\n      return {\n        browser: match[1] || '',\n        version: match[2] || '0',\n        isIE: Konva._detectIE(ua),\n        // adding mobile flab\n        mobile: mobile,\n        ieMobile: ieMobile // If this is true (i.e., WP8), then Konva touch events are executed instead of equivalent Konva mouse events\n      };\n    },\n    // user agent\n    UA: undefined\n  };\n\n  var glob =\n    typeof global !== 'undefined'\n      ? global\n      : typeof window !== 'undefined'\n        ? window\n        : typeof WorkerGlobalScope !== 'undefined' ? self : {};\n\n  Konva.UA = Konva._parseUA((glob.navigator && glob.navigator.userAgent) || '');\n\n  if (glob.Konva) {\n    console.error(\n      'Konva instance is already exist in current eviroment. ' +\n        'Please use only one instance.'\n    );\n  }\n  glob.Konva = Konva;\n  Konva.global = glob;\n  Konva.window = glob;\n  Konva.document = glob.document;\n\n  if (typeof exports === 'object') {\n    module.exports = Konva;\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(function() {\n      return Konva;\n    });\n  }\n})();\n\n/*eslint-disable  eqeqeq, no-cond-assign, no-empty*/\n(function() {\n  'use strict';\n  /**\n     * Collection constructor.  Collection extends\n     *  Array.  This class is used in conjunction with {@link Konva.Container#get}\n     * @constructor\n     * @memberof Konva\n     */\n  Konva.Collection = function() {\n    var args = [].slice.call(arguments),\n      length = args.length,\n      i = 0;\n\n    this.length = length;\n    for (; i < length; i++) {\n      this[i] = args[i];\n    }\n    return this;\n  };\n  Konva.Collection.prototype = [];\n  /**\n     * iterate through node array and run a function for each node.\n     *  The node and index is passed into the function\n     * @method\n     * @memberof Konva.Collection.prototype\n     * @param {Function} func\n     * @example\n     * // get all nodes with name foo inside layer, and set x to 10 for each\n     * layer.get('.foo').each(function(shape, n) {\n     *   shape.setX(10);\n     * });\n     */\n  Konva.Collection.prototype.each = function(func) {\n    for (var n = 0; n < this.length; n++) {\n      func(this[n], n);\n    }\n  };\n  /**\n     * convert collection into an array\n     * @method\n     * @memberof Konva.Collection.prototype\n     */\n  Konva.Collection.prototype.toArray = function() {\n    var arr = [],\n      len = this.length,\n      n;\n\n    for (n = 0; n < len; n++) {\n      arr.push(this[n]);\n    }\n    return arr;\n  };\n  /**\n     * convert array into a collection\n     * @method\n     * @memberof Konva.Collection\n     * @param {Array} arr\n     */\n  Konva.Collection.toCollection = function(arr) {\n    var collection = new Konva.Collection(),\n      len = arr.length,\n      n;\n\n    for (n = 0; n < len; n++) {\n      collection.push(arr[n]);\n    }\n    return collection;\n  };\n\n  // map one method by it's name\n  Konva.Collection._mapMethod = function(methodName) {\n    Konva.Collection.prototype[methodName] = function() {\n      var len = this.length,\n        i;\n\n      var args = [].slice.call(arguments);\n      for (i = 0; i < len; i++) {\n        this[i][methodName].apply(this[i], args);\n      }\n\n      return this;\n    };\n  };\n\n  Konva.Collection.mapMethods = function(constructor) {\n    var prot = constructor.prototype;\n    for (var methodName in prot) {\n      Konva.Collection._mapMethod(methodName);\n    }\n  };\n\n  /*\n    * Last updated November 2011\n    * By Simon Sarris\n    * www.simonsarris.com\n    * sarris@acm.org\n    *\n    * Free to use and distribute at will\n    * So long as you are nice to people, etc\n    */\n\n  /*\n    * The usage of this class was inspired by some of the work done by a forked\n    * project, KineticJS-Ext by Wappworks, which is based on Simon's Transform\n    * class.  Modified by Eric Rowell\n    */\n\n  /**\n     * Transform constructor\n     * @constructor\n     * @param {Array} [m] Optional six-element matrix\n     * @memberof Konva\n     */\n  Konva.Transform = function(m) {\n    this.m = (m && m.slice()) || [1, 0, 0, 1, 0, 0];\n  };\n\n  Konva.Transform.prototype = {\n    /**\n         * Copy Konva.Transform object\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @returns {Konva.Transform}\n         */\n    copy: function() {\n      return new Konva.Transform(this.m);\n    },\n    /**\n         * Transform point\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Object} point 2D point(x, y)\n         * @returns {Object} 2D point(x, y)\n         */\n    point: function(point) {\n      var m = this.m;\n      return {\n        x: m[0] * point.x + m[2] * point.y + m[4],\n        y: m[1] * point.x + m[3] * point.y + m[5]\n      };\n    },\n    /**\n         * Apply translation\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Number} x\n         * @param {Number} y\n         * @returns {Konva.Transform}\n         */\n    translate: function(x, y) {\n      this.m[4] += this.m[0] * x + this.m[2] * y;\n      this.m[5] += this.m[1] * x + this.m[3] * y;\n      return this;\n    },\n    /**\n         * Apply scale\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Number} sx\n         * @param {Number} sy\n         * @returns {Konva.Transform}\n         */\n    scale: function(sx, sy) {\n      this.m[0] *= sx;\n      this.m[1] *= sx;\n      this.m[2] *= sy;\n      this.m[3] *= sy;\n      return this;\n    },\n    /**\n         * Apply rotation\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Number} rad  Angle in radians\n         * @returns {Konva.Transform}\n         */\n    rotate: function(rad) {\n      var c = Math.cos(rad);\n      var s = Math.sin(rad);\n      var m11 = this.m[0] * c + this.m[2] * s;\n      var m12 = this.m[1] * c + this.m[3] * s;\n      var m21 = this.m[0] * -s + this.m[2] * c;\n      var m22 = this.m[1] * -s + this.m[3] * c;\n      this.m[0] = m11;\n      this.m[1] = m12;\n      this.m[2] = m21;\n      this.m[3] = m22;\n      return this;\n    },\n    /**\n         * Returns the translation\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @returns {Object} 2D point(x, y)\n         */\n    getTranslation: function() {\n      return {\n        x: this.m[4],\n        y: this.m[5]\n      };\n    },\n    /**\n         * Apply skew\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Number} sx\n         * @param {Number} sy\n         * @returns {Konva.Transform}\n         */\n    skew: function(sx, sy) {\n      var m11 = this.m[0] + this.m[2] * sy;\n      var m12 = this.m[1] + this.m[3] * sy;\n      var m21 = this.m[2] + this.m[0] * sx;\n      var m22 = this.m[3] + this.m[1] * sx;\n      this.m[0] = m11;\n      this.m[1] = m12;\n      this.m[2] = m21;\n      this.m[3] = m22;\n      return this;\n    },\n    /**\n         * Transform multiplication\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @param {Konva.Transform} matrix\n         * @returns {Konva.Transform}\n         */\n    multiply: function(matrix) {\n      var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n      var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n\n      var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n      var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n\n      var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n      var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n\n      this.m[0] = m11;\n      this.m[1] = m12;\n      this.m[2] = m21;\n      this.m[3] = m22;\n      this.m[4] = dx;\n      this.m[5] = dy;\n      return this;\n    },\n    /**\n         * Invert the matrix\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @returns {Konva.Transform}\n         */\n    invert: function() {\n      var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n      var m0 = this.m[3] * d;\n      var m1 = -this.m[1] * d;\n      var m2 = -this.m[2] * d;\n      var m3 = this.m[0] * d;\n      var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n      var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n      this.m[0] = m0;\n      this.m[1] = m1;\n      this.m[2] = m2;\n      this.m[3] = m3;\n      this.m[4] = m4;\n      this.m[5] = m5;\n      return this;\n    },\n    /**\n         * return matrix\n         * @method\n         * @memberof Konva.Transform.prototype\n         */\n    getMatrix: function() {\n      return this.m;\n    },\n    /**\n         * set to absolute position via translation\n         * @method\n         * @memberof Konva.Transform.prototype\n         * @returns {Konva.Transform}\n         * @author ericdrowell\n         */\n    setAbsolutePosition: function(x, y) {\n      var m0 = this.m[0],\n        m1 = this.m[1],\n        m2 = this.m[2],\n        m3 = this.m[3],\n        m4 = this.m[4],\n        m5 = this.m[5],\n        yt = (m0 * (y - m5) - m1 * (x - m4)) / (m0 * m3 - m1 * m2),\n        xt = (x - m4 - m2 * yt) / m0;\n\n      return this.translate(xt, yt);\n    }\n  };\n\n  // CONSTANTS\n  var CONTEXT_2D = '2d',\n    OBJECT_ARRAY = '[object Array]',\n    OBJECT_NUMBER = '[object Number]',\n    OBJECT_STRING = '[object String]',\n    PI_OVER_DEG180 = Math.PI / 180,\n    DEG180_OVER_PI = 180 / Math.PI,\n    HASH = '#',\n    EMPTY_STRING = '',\n    ZERO = '0',\n    KONVA_WARNING = 'Konva warning: ',\n    KONVA_ERROR = 'Konva error: ',\n    RGB_PAREN = 'rgb(',\n    COLORS = {\n      aliceblue: [240, 248, 255],\n      antiquewhite: [250, 235, 215],\n      aqua: [0, 255, 255],\n      aquamarine: [127, 255, 212],\n      azure: [240, 255, 255],\n      beige: [245, 245, 220],\n      bisque: [255, 228, 196],\n      black: [0, 0, 0],\n      blanchedalmond: [255, 235, 205],\n      blue: [0, 0, 255],\n      blueviolet: [138, 43, 226],\n      brown: [165, 42, 42],\n      burlywood: [222, 184, 135],\n      cadetblue: [95, 158, 160],\n      chartreuse: [127, 255, 0],\n      chocolate: [210, 105, 30],\n      coral: [255, 127, 80],\n      cornflowerblue: [100, 149, 237],\n      cornsilk: [255, 248, 220],\n      crimson: [220, 20, 60],\n      cyan: [0, 255, 255],\n      darkblue: [0, 0, 139],\n      darkcyan: [0, 139, 139],\n      darkgoldenrod: [184, 132, 11],\n      darkgray: [169, 169, 169],\n      darkgreen: [0, 100, 0],\n      darkgrey: [169, 169, 169],\n      darkkhaki: [189, 183, 107],\n      darkmagenta: [139, 0, 139],\n      darkolivegreen: [85, 107, 47],\n      darkorange: [255, 140, 0],\n      darkorchid: [153, 50, 204],\n      darkred: [139, 0, 0],\n      darksalmon: [233, 150, 122],\n      darkseagreen: [143, 188, 143],\n      darkslateblue: [72, 61, 139],\n      darkslategray: [47, 79, 79],\n      darkslategrey: [47, 79, 79],\n      darkturquoise: [0, 206, 209],\n      darkviolet: [148, 0, 211],\n      deeppink: [255, 20, 147],\n      deepskyblue: [0, 191, 255],\n      dimgray: [105, 105, 105],\n      dimgrey: [105, 105, 105],\n      dodgerblue: [30, 144, 255],\n      firebrick: [178, 34, 34],\n      floralwhite: [255, 255, 240],\n      forestgreen: [34, 139, 34],\n      fuchsia: [255, 0, 255],\n      gainsboro: [220, 220, 220],\n      ghostwhite: [248, 248, 255],\n      gold: [255, 215, 0],\n      goldenrod: [218, 165, 32],\n      gray: [128, 128, 128],\n      green: [0, 128, 0],\n      greenyellow: [173, 255, 47],\n      grey: [128, 128, 128],\n      honeydew: [240, 255, 240],\n      hotpink: [255, 105, 180],\n      indianred: [205, 92, 92],\n      indigo: [75, 0, 130],\n      ivory: [255, 255, 240],\n      khaki: [240, 230, 140],\n      lavender: [230, 230, 250],\n      lavenderblush: [255, 240, 245],\n      lawngreen: [124, 252, 0],\n      lemonchiffon: [255, 250, 205],\n      lightblue: [173, 216, 230],\n      lightcoral: [240, 128, 128],\n      lightcyan: [224, 255, 255],\n      lightgoldenrodyellow: [250, 250, 210],\n      lightgray: [211, 211, 211],\n      lightgreen: [144, 238, 144],\n      lightgrey: [211, 211, 211],\n      lightpink: [255, 182, 193],\n      lightsalmon: [255, 160, 122],\n      lightseagreen: [32, 178, 170],\n      lightskyblue: [135, 206, 250],\n      lightslategray: [119, 136, 153],\n      lightslategrey: [119, 136, 153],\n      lightsteelblue: [176, 196, 222],\n      lightyellow: [255, 255, 224],\n      lime: [0, 255, 0],\n      limegreen: [50, 205, 50],\n      linen: [250, 240, 230],\n      magenta: [255, 0, 255],\n      maroon: [128, 0, 0],\n      mediumaquamarine: [102, 205, 170],\n      mediumblue: [0, 0, 205],\n      mediumorchid: [186, 85, 211],\n      mediumpurple: [147, 112, 219],\n      mediumseagreen: [60, 179, 113],\n      mediumslateblue: [123, 104, 238],\n      mediumspringgreen: [0, 250, 154],\n      mediumturquoise: [72, 209, 204],\n      mediumvioletred: [199, 21, 133],\n      midnightblue: [25, 25, 112],\n      mintcream: [245, 255, 250],\n      mistyrose: [255, 228, 225],\n      moccasin: [255, 228, 181],\n      navajowhite: [255, 222, 173],\n      navy: [0, 0, 128],\n      oldlace: [253, 245, 230],\n      olive: [128, 128, 0],\n      olivedrab: [107, 142, 35],\n      orange: [255, 165, 0],\n      orangered: [255, 69, 0],\n      orchid: [218, 112, 214],\n      palegoldenrod: [238, 232, 170],\n      palegreen: [152, 251, 152],\n      paleturquoise: [175, 238, 238],\n      palevioletred: [219, 112, 147],\n      papayawhip: [255, 239, 213],\n      peachpuff: [255, 218, 185],\n      peru: [205, 133, 63],\n      pink: [255, 192, 203],\n      plum: [221, 160, 203],\n      powderblue: [176, 224, 230],\n      purple: [128, 0, 128],\n      rebeccapurple: [102, 51, 153],\n      red: [255, 0, 0],\n      rosybrown: [188, 143, 143],\n      royalblue: [65, 105, 225],\n      saddlebrown: [139, 69, 19],\n      salmon: [250, 128, 114],\n      sandybrown: [244, 164, 96],\n      seagreen: [46, 139, 87],\n      seashell: [255, 245, 238],\n      sienna: [160, 82, 45],\n      silver: [192, 192, 192],\n      skyblue: [135, 206, 235],\n      slateblue: [106, 90, 205],\n      slategray: [119, 128, 144],\n      slategrey: [119, 128, 144],\n      snow: [255, 255, 250],\n      springgreen: [0, 255, 127],\n      steelblue: [70, 130, 180],\n      tan: [210, 180, 140],\n      teal: [0, 128, 128],\n      thistle: [216, 191, 216],\n      transparent: [255, 255, 255, 0],\n      tomato: [255, 99, 71],\n      turquoise: [64, 224, 208],\n      violet: [238, 130, 238],\n      wheat: [245, 222, 179],\n      white: [255, 255, 255],\n      whitesmoke: [245, 245, 245],\n      yellow: [255, 255, 0],\n      yellowgreen: [154, 205, 5]\n    },\n    RGB_REGEX = /rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/;\n\n  /**\n     * @namespace Util\n     * @memberof Konva\n     */\n  Konva.Util = {\n    /*\n         * cherry-picked utilities from underscore.js\n         */\n    _isElement: function(obj) {\n      return !!(obj && obj.nodeType == 1);\n    },\n    _isFunction: function(obj) {\n      return !!(obj && obj.constructor && obj.call && obj.apply);\n    },\n    _isObject: function(obj) {\n      return !!obj && obj.constructor === Object;\n    },\n    _isArray: function(obj) {\n      return Object.prototype.toString.call(obj) === OBJECT_ARRAY;\n    },\n    _isNumber: function(obj) {\n      return Object.prototype.toString.call(obj) === OBJECT_NUMBER;\n    },\n    _isString: function(obj) {\n      return Object.prototype.toString.call(obj) === OBJECT_STRING;\n    },\n    // Returns a function, that, when invoked, will only be triggered at most once\n    // during a given window of time. Normally, the throttled function will run\n    // as much as it can, without ever going more than once per `wait` duration;\n    // but if you'd like to disable the execution on the leading edge, pass\n    // `{leading: false}`. To disable execution on the trailing edge, ditto.\n    _throttle: function(func, wait, opts) {\n      var context, args, result;\n      var timeout = null;\n      var previous = 0;\n      var options = opts || {};\n      var later = function() {\n        previous = options.leading === false ? 0 : new Date().getTime();\n        timeout = null;\n        result = func.apply(context, args);\n        context = args = null;\n      };\n      return function() {\n        var now = new Date().getTime();\n        if (!previous && options.leading === false) {\n          previous = now;\n        }\n        var remaining = wait - (now - previous);\n        context = this;\n        args = arguments;\n        if (remaining <= 0) {\n          clearTimeout(timeout);\n          timeout = null;\n          previous = now;\n          result = func.apply(context, args);\n          context = args = null;\n        } else if (!timeout && options.trailing !== false) {\n          timeout = setTimeout(later, remaining);\n        }\n        return result;\n      };\n    },\n    /*\n         * other utils\n         */\n    _hasMethods: function(obj) {\n      var names = [],\n        key;\n\n      for (key in obj) {\n        if (!obj.hasOwnProperty(key)) {\n          continue;\n        }\n        if (this._isFunction(obj[key])) {\n          names.push(key);\n        }\n      }\n      return names.length > 0;\n    },\n    isValidSelector: function(selector) {\n      if (typeof selector !== 'string') {\n        return false;\n      }\n      var firstChar = selector[0];\n      return (\n        firstChar === '#' ||\n        firstChar === '.' ||\n        firstChar === firstChar.toUpperCase()\n      );\n    },\n    createCanvasElement: function() {\n      var canvas = Konva.isBrowser\n        ? Konva.document.createElement('canvas')\n        : new Konva._nodeCanvas();\n      // on some environments canvas.style is readonly\n      try {\n        canvas.style = canvas.style || {};\n      } catch (e) {}\n      return canvas;\n    },\n    _isInDocument: function(el) {\n      while ((el = el.parentNode)) {\n        if (el == Konva.document) {\n          return true;\n        }\n      }\n      return false;\n    },\n    _simplifyArray: function(arr) {\n      var retArr = [],\n        len = arr.length,\n        util = Konva.Util,\n        n,\n        val;\n\n      for (n = 0; n < len; n++) {\n        val = arr[n];\n        if (util._isNumber(val)) {\n          val = Math.round(val * 1000) / 1000;\n        } else if (!util._isString(val)) {\n          val = val.toString();\n        }\n\n        retArr.push(val);\n      }\n\n      return retArr;\n    },\n    /*\n         * arg can be an image object or image data\n         */\n    _getImage: function(arg, callback) {\n      var imageObj, canvas;\n\n      // if arg is null or undefined\n      if (!arg) {\n        callback(null);\n      } else if (this._isElement(arg)) {\n        // if arg is already an image object\n        callback(arg);\n      } else if (this._isString(arg)) {\n        // if arg is a string, then it's a data url\n        imageObj = new Konva.window.Image();\n        imageObj.onload = function() {\n          callback(imageObj);\n        };\n        imageObj.src = arg;\n      } else if (arg.data) {\n        //if arg is an object that contains the data property, it's an image object\n        canvas = Konva.Util.createCanvasElement();\n        canvas.width = arg.width;\n        canvas.height = arg.height;\n        var _context = canvas.getContext(CONTEXT_2D);\n        _context.putImageData(arg, 0, 0);\n        this._getImage(canvas.toDataURL(), callback);\n      } else {\n        callback(null);\n      }\n    },\n    _getRGBAString: function(obj) {\n      var red = obj.red || 0,\n        green = obj.green || 0,\n        blue = obj.blue || 0,\n        alpha = obj.alpha || 1;\n\n      return ['rgba(', red, ',', green, ',', blue, ',', alpha, ')'].join(\n        EMPTY_STRING\n      );\n    },\n    _rgbToHex: function(r, g, b) {\n      return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\n    },\n    _hexToRgb: function(hex) {\n      hex = hex.replace(HASH, EMPTY_STRING);\n      var bigint = parseInt(hex, 16);\n      return {\n        r: (bigint >> 16) & 255,\n        g: (bigint >> 8) & 255,\n        b: bigint & 255\n      };\n    },\n    /**\n         * return random hex color\n         * @method\n         * @memberof Konva.Util.prototype\n         */\n    getRandomColor: function() {\n      var randColor = ((Math.random() * 0xffffff) << 0).toString(16);\n      while (randColor.length < 6) {\n        randColor = ZERO + randColor;\n      }\n      return HASH + randColor;\n    },\n    /**\n         * return value with default fallback\n         * @method\n         * @memberof Konva.Util.prototype\n         */\n    get: function(val, def) {\n      if (val === undefined) {\n        return def;\n      } else {\n        return val;\n      }\n    },\n    /**\n         * get RGB components of a color\n         * @method\n         * @memberof Konva.Util.prototype\n         * @param {String} color\n         * @example\n         * // each of the following examples return {r:0, g:0, b:255}\n         * var rgb = Konva.Util.getRGB('blue');\n         * var rgb = Konva.Util.getRGB('#0000ff');\n         * var rgb = Konva.Util.getRGB('rgb(0,0,255)');\n         */\n    getRGB: function(color) {\n      var rgb;\n      // color string\n      if (color in COLORS) {\n        rgb = COLORS[color];\n        return {\n          r: rgb[0],\n          g: rgb[1],\n          b: rgb[2]\n        };\n      } else if (color[0] === HASH) {\n        // hex\n        return this._hexToRgb(color.substring(1));\n      } else if (color.substr(0, 4) === RGB_PAREN) {\n        // rgb string\n        rgb = RGB_REGEX.exec(color.replace(/ /g, ''));\n        return {\n          r: parseInt(rgb[1], 10),\n          g: parseInt(rgb[2], 10),\n          b: parseInt(rgb[3], 10)\n        };\n      } else {\n        // default\n        return {\n          r: 0,\n          g: 0,\n          b: 0\n        };\n      }\n    },\n    // convert any color string to RGBA object\n    // from https://github.com/component/color-parser\n    colorToRGBA: function(str) {\n      str = str || 'black';\n      return (\n        Konva.Util._namedColorToRBA(str) ||\n        Konva.Util._hex3ColorToRGBA(str) ||\n        Konva.Util._hex6ColorToRGBA(str) ||\n        Konva.Util._rgbColorToRGBA(str) ||\n        Konva.Util._rgbaColorToRGBA(str)\n      );\n    },\n    // Parse named css color. Like \"green\"\n    _namedColorToRBA: function(str) {\n      var c = COLORS[str.toLowerCase()];\n      if (!c) {\n        return null;\n      }\n      return {\n        r: c[0],\n        g: c[1],\n        b: c[2],\n        a: 1\n      };\n    },\n    // Parse rgb(n, n, n)\n    _rgbColorToRGBA: function(str) {\n      if (str.indexOf('rgb(') === 0) {\n        str = str.match(/rgb\\(([^)]+)\\)/)[1];\n        var parts = str.split(/ *, */).map(Number);\n        return {\n          r: parts[0],\n          g: parts[1],\n          b: parts[2],\n          a: 1\n        };\n      }\n    },\n    // Parse rgba(n, n, n, n)\n    _rgbaColorToRGBA: function(str) {\n      if (str.indexOf('rgba(') === 0) {\n        str = str.match(/rgba\\(([^)]+)\\)/)[1];\n        var parts = str.split(/ *, */).map(Number);\n        return {\n          r: parts[0],\n          g: parts[1],\n          b: parts[2],\n          a: parts[3]\n        };\n      }\n    },\n    // Parse #nnnnnn\n    _hex6ColorToRGBA: function(str) {\n      if (str[0] === '#' && str.length === 7) {\n        return {\n          r: parseInt(str.slice(1, 3), 16),\n          g: parseInt(str.slice(3, 5), 16),\n          b: parseInt(str.slice(5, 7), 16),\n          a: 1\n        };\n      }\n    },\n    // Parse #nnn\n    _hex3ColorToRGBA: function(str) {\n      if (str[0] === '#' && str.length === 4) {\n        return {\n          r: parseInt(str[1] + str[1], 16),\n          g: parseInt(str[2] + str[2], 16),\n          b: parseInt(str[3] + str[3], 16),\n          a: 1\n        };\n      }\n    },\n    // o1 takes precedence over o2\n    _merge: function(o1, o2) {\n      var retObj = this._clone(o2);\n      for (var key in o1) {\n        if (this._isObject(o1[key])) {\n          retObj[key] = this._merge(o1[key], retObj[key]);\n        } else {\n          retObj[key] = o1[key];\n        }\n      }\n      return retObj;\n    },\n    cloneObject: function(obj) {\n      var retObj = {};\n      for (var key in obj) {\n        if (this._isObject(obj[key])) {\n          retObj[key] = this.cloneObject(obj[key]);\n        } else if (this._isArray(obj[key])) {\n          retObj[key] = this.cloneArray(obj[key]);\n        } else {\n          retObj[key] = obj[key];\n        }\n      }\n      return retObj;\n    },\n    cloneArray: function(arr) {\n      return arr.slice(0);\n    },\n    _degToRad: function(deg) {\n      return deg * PI_OVER_DEG180;\n    },\n    _radToDeg: function(rad) {\n      return rad * DEG180_OVER_PI;\n    },\n    _capitalize: function(str) {\n      return str.charAt(0).toUpperCase() + str.slice(1);\n    },\n    throw: function(str) {\n      throw new Error(KONVA_ERROR + str);\n    },\n    error: function(str) {\n      console.error(KONVA_ERROR + str);\n    },\n    warn: function(str) {\n      /*\n             * IE9 on Windows7 64bit will throw a JS error\n             * if we don't use window.console in the conditional\n             */\n      if (Konva.global.console && console.warn && Konva.showWarnings) {\n        console.warn(KONVA_WARNING + str);\n      }\n    },\n    extend: function(child, parent) {\n      function Ctor() {\n        this.constructor = child;\n      }\n      Ctor.prototype = parent.prototype;\n      var oldProto = child.prototype;\n      child.prototype = new Ctor();\n      for (var key in oldProto) {\n        if (oldProto.hasOwnProperty(key)) {\n          child.prototype[key] = oldProto[key];\n        }\n      }\n      child.__super__ = parent.prototype;\n      // create reference to parent\n      child.super = parent;\n    },\n    /**\n         * adds methods to a constructor prototype\n         * @method\n         * @memberof Konva.Util.prototype\n         * @param {Function} constructor\n         * @param {Object} methods\n         */\n    addMethods: function(constructor, methods) {\n      var key;\n\n      for (key in methods) {\n        constructor.prototype[key] = methods[key];\n      }\n    },\n    _getControlPoints: function(x0, y0, x1, y1, x2, y2, t) {\n      var d01 = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)),\n        d12 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)),\n        fa = t * d01 / (d01 + d12),\n        fb = t * d12 / (d01 + d12),\n        p1x = x1 - fa * (x2 - x0),\n        p1y = y1 - fa * (y2 - y0),\n        p2x = x1 + fb * (x2 - x0),\n        p2y = y1 + fb * (y2 - y0);\n\n      return [p1x, p1y, p2x, p2y];\n    },\n    _expandPoints: function(p, tension) {\n      var len = p.length,\n        allPoints = [],\n        n,\n        cp;\n\n      for (n = 2; n < len - 2; n += 2) {\n        cp = Konva.Util._getControlPoints(\n          p[n - 2],\n          p[n - 1],\n          p[n],\n          p[n + 1],\n          p[n + 2],\n          p[n + 3],\n          tension\n        );\n        allPoints.push(cp[0]);\n        allPoints.push(cp[1]);\n        allPoints.push(p[n]);\n        allPoints.push(p[n + 1]);\n        allPoints.push(cp[2]);\n        allPoints.push(cp[3]);\n      }\n\n      return allPoints;\n    },\n    _removeLastLetter: function(str) {\n      return str.substring(0, str.length - 1);\n    },\n    each: function(obj, func) {\n      for (var key in obj) {\n        func(key, obj[key]);\n      }\n    },\n    _getProjectionToSegment: function(x1, y1, x2, y2, x3, y3) {\n      var x, y, dist;\n\n      var pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n      if (pd2 == 0) {\n        x = x1;\n        y = y1;\n        dist = (x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2);\n      } else {\n        var u = ((x3 - x1) * (x2 - x1) + (y3 - y1) * (y2 - y1)) / pd2;\n        if (u < 0) {\n          x = x1;\n          y = y1;\n          dist = (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3);\n        } else if (u > 1.0) {\n          x = x2;\n          y = y2;\n          dist = (x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3);\n        } else {\n          x = x1 + u * (x2 - x1);\n          y = y1 + u * (y2 - y1);\n          dist = (x - x3) * (x - x3) + (y - y3) * (y - y3);\n        }\n      }\n      return [x, y, dist];\n    },\n    // line as array of points.\n    // line might be closed\n    _getProjectionToLine: function(pt, line, isClosed) {\n      var pc = Konva.Util.cloneObject(pt);\n      var dist = Number.MAX_VALUE;\n      line.forEach(function(p1, i) {\n        if (!isClosed && i === line.length - 1) {\n          return;\n        }\n        var p2 = line[(i + 1) % line.length];\n        var proj = Konva.Util._getProjectionToSegment(\n          p1.x,\n          p1.y,\n          p2.x,\n          p2.y,\n          pt.x,\n          pt.y\n        );\n        var px = proj[0],\n          py = proj[1],\n          pdist = proj[2];\n        if (pdist < dist) {\n          pc.x = px;\n          pc.y = py;\n          dist = pdist;\n        }\n      });\n      return pc;\n    },\n    _prepareArrayForTween: function(startArray, endArray, isClosed) {\n      var n,\n        start = [],\n        end = [];\n      if (startArray.length > endArray.length) {\n        var temp = endArray;\n        endArray = startArray;\n        startArray = temp;\n      }\n      for (n = 0; n < startArray.length; n += 2) {\n        start.push({\n          x: startArray[n],\n          y: startArray[n + 1]\n        });\n      }\n      for (n = 0; n < endArray.length; n += 2) {\n        end.push({\n          x: endArray[n],\n          y: endArray[n + 1]\n        });\n      }\n\n      var newStart = [];\n      end.forEach(function(point) {\n        var pr = Konva.Util._getProjectionToLine(point, start, isClosed);\n        newStart.push(pr.x);\n        newStart.push(pr.y);\n      });\n      return newStart;\n    },\n    _prepareToStringify: function(obj) {\n      var desc;\n\n      obj.visitedByCircularReferenceRemoval = true;\n\n      for (var key in obj) {\n        if (\n          !(obj.hasOwnProperty(key) && obj[key] && typeof obj[key] == 'object')\n        ) {\n          continue;\n        }\n        desc = Object.getOwnPropertyDescriptor(obj, key);\n        if (\n          obj[key].visitedByCircularReferenceRemoval ||\n          Konva.Util._isElement(obj[key])\n        ) {\n          if (desc.configurable) {\n            delete obj[key];\n          } else {\n            return null;\n          }\n        } else if (Konva.Util._prepareToStringify(obj[key]) === null) {\n          if (desc.configurable) {\n            delete obj[key];\n          } else {\n            return null;\n          }\n        }\n      }\n\n      delete obj.visitedByCircularReferenceRemoval;\n\n      return obj;\n    }\n  };\n})();\n\n(function() {\n  'use strict';\n  // calculate pixel ratio\n\n  var _pixelRatio;\n  function getDevicePixelRatio() {\n    if (_pixelRatio) {\n      return _pixelRatio;\n    }\n    var canvas = Konva.Util.createCanvasElement();\n    var context = canvas.getContext('2d');\n    _pixelRatio = (function() {\n      var devicePixelRatio = Konva.window.devicePixelRatio || 1,\n        backingStoreRatio =\n          context.webkitBackingStorePixelRatio ||\n          context.mozBackingStorePixelRatio ||\n          context.msBackingStorePixelRatio ||\n          context.oBackingStorePixelRatio ||\n          context.backingStorePixelRatio ||\n          1;\n      return devicePixelRatio / backingStoreRatio;\n    })();\n    return _pixelRatio;\n  }\n\n  /**\n     * Canvas Renderer constructor\n     * @constructor\n     * @abstract\n     * @memberof Konva\n     * @param {Object} config\n     * @param {Number} config.width\n     * @param {Number} config.height\n     * @param {Number} config.pixelRatio KonvaJS automatically handles pixel ratio adjustments in order to render crisp drawings\n     *  on all devices. Most desktops, low end tablets, and low end phones, have device pixel ratios\n     *  of 1.  Some high end tablets and phones, like iPhones and iPads (not the mini) have a device pixel ratio\n     *  of 2.  Some Macbook Pros, and iMacs also have a device pixel ratio of 2.  Some high end Android devices have pixel\n     *  ratios of 2 or 3.  Some browsers like Firefox allow you to configure the pixel ratio of the viewport.  Unless otherwise\n     *  specified, the pixel ratio will be defaulted to the actual device pixel ratio.  You can override the device pixel\n     *  ratio for special situations, or, if you don't want the pixel ratio to be taken into account, you can set it to 1.\n     */\n  Konva.Canvas = function(config) {\n    this.init(config);\n  };\n\n  Konva.Canvas.prototype = {\n    init: function(config) {\n      var conf = config || {};\n\n      var pixelRatio =\n        conf.pixelRatio || Konva.pixelRatio || getDevicePixelRatio();\n\n      this.pixelRatio = pixelRatio;\n      this._canvas = Konva.Util.createCanvasElement();\n\n      // set inline styles\n      this._canvas.style.padding = 0;\n      this._canvas.style.margin = 0;\n      this._canvas.style.border = 0;\n      this._canvas.style.background = 'transparent';\n      this._canvas.style.position = 'absolute';\n      this._canvas.style.top = 0;\n      this._canvas.style.left = 0;\n    },\n    /**\n         * get canvas context\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @returns {CanvasContext} context\n         */\n    getContext: function() {\n      return this.context;\n    },\n    /**\n         * get pixel ratio\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @returns {Number} pixel ratio\n         */\n    getPixelRatio: function() {\n      return this.pixelRatio;\n    },\n    /**\n         * get pixel ratio\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @param {Number} pixelRatio KonvaJS automatically handles pixel ratio adustments in order to render crisp drawings\n         *  on all devices. Most desktops, low end tablets, and low end phones, have device pixel ratios\n         *  of 1.  Some high end tablets and phones, like iPhones and iPads have a device pixel ratio\n         *  of 2.  Some Macbook Pros, and iMacs also have a device pixel ratio of 2.  Some high end Android devices have pixel\n         *  ratios of 2 or 3.  Some browsers like Firefox allow you to configure the pixel ratio of the viewport.  Unless otherwise\n         *  specificed, the pixel ratio will be defaulted to the actual device pixel ratio.  You can override the device pixel\n         *  ratio for special situations, or, if you don't want the pixel ratio to be taken into account, you can set it to 1.\n         */\n    setPixelRatio: function(pixelRatio) {\n      var previousRatio = this.pixelRatio;\n      this.pixelRatio = pixelRatio;\n      this.setSize(\n        this.getWidth() / previousRatio,\n        this.getHeight() / previousRatio\n      );\n    },\n    /**\n         * set width\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @param {Number} width\n         */\n    setWidth: function(width) {\n      // take into account pixel ratio\n      this.width = this._canvas.width = width * this.pixelRatio;\n      this._canvas.style.width = width + 'px';\n\n      var pixelRatio = this.pixelRatio,\n        _context = this.getContext()._context;\n      _context.scale(pixelRatio, pixelRatio);\n    },\n    /**\n         * set height\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @param {Number} height\n         */\n    setHeight: function(height) {\n      // take into account pixel ratio\n      this.height = this._canvas.height = height * this.pixelRatio;\n      this._canvas.style.height = height + 'px';\n      var pixelRatio = this.pixelRatio,\n        _context = this.getContext()._context;\n      _context.scale(pixelRatio, pixelRatio);\n    },\n    /**\n         * get width\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @returns {Number} width\n         */\n    getWidth: function() {\n      return this.width;\n    },\n    /**\n         * get height\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @returns {Number} height\n         */\n    getHeight: function() {\n      return this.height;\n    },\n    /**\n         * set size\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @param {Number} width\n         * @param {Number} height\n         */\n    setSize: function(width, height) {\n      this.setWidth(width);\n      this.setHeight(height);\n    },\n    /**\n         * to data url\n         * @method\n         * @memberof Konva.Canvas.prototype\n         * @param {String} mimeType\n         * @param {Number} quality between 0 and 1 for jpg mime types\n         * @returns {String} data url string\n         */\n    toDataURL: function(mimeType, quality) {\n      try {\n        // If this call fails (due to browser bug, like in Firefox 3.6),\n        // then revert to previous no-parameter image/png behavior\n        return this._canvas.toDataURL(mimeType, quality);\n      } catch (e) {\n        try {\n          return this._canvas.toDataURL();\n        } catch (err) {\n          Konva.Util.warn('Unable to get data URL. ' + err.message);\n          return '';\n        }\n      }\n    }\n  };\n\n  Konva.SceneCanvas = function(config) {\n    var conf = config || {};\n    var width = conf.width || 0,\n      height = conf.height || 0;\n\n    Konva.Canvas.call(this, conf);\n    this.context = new Konva.SceneContext(this);\n    this.setSize(width, height);\n  };\n\n  Konva.Util.extend(Konva.SceneCanvas, Konva.Canvas);\n\n  Konva.HitCanvas = function(config) {\n    var conf = config || {};\n    var width = conf.width || 0,\n      height = conf.height || 0;\n\n    Konva.Canvas.call(this, conf);\n    this.context = new Konva.HitContext(this);\n    this.setSize(width, height);\n    this.hitCanvas = true;\n  };\n  Konva.Util.extend(Konva.HitCanvas, Konva.Canvas);\n})();\n\n(function() {\n  'use strict';\n  var COMMA = ',',\n    OPEN_PAREN = '(',\n    CLOSE_PAREN = ')',\n    OPEN_PAREN_BRACKET = '([',\n    CLOSE_BRACKET_PAREN = '])',\n    SEMICOLON = ';',\n    DOUBLE_PAREN = '()',\n    // EMPTY_STRING = '',\n    EQUALS = '=',\n    // SET = 'set',\n    CONTEXT_METHODS = [\n      'arc',\n      'arcTo',\n      'beginPath',\n      'bezierCurveTo',\n      'clearRect',\n      'clip',\n      'closePath',\n      'createLinearGradient',\n      'createPattern',\n      'createRadialGradient',\n      'drawImage',\n      'fill',\n      'fillText',\n      'getImageData',\n      'createImageData',\n      'lineTo',\n      'moveTo',\n      'putImageData',\n      'quadraticCurveTo',\n      'rect',\n      'restore',\n      'rotate',\n      'save',\n      'scale',\n      'setLineDash',\n      'setTransform',\n      'stroke',\n      'strokeText',\n      'transform',\n      'translate'\n    ];\n\n  var CONTEXT_PROPERTIES = [\n    'fillStyle',\n    'strokeStyle',\n    'shadowColor',\n    'shadowBlur',\n    'shadowOffsetX',\n    'shadowOffsetY',\n    'lineCap',\n    'lineDashOffset',\n    'lineJoin',\n    'lineWidth',\n    'miterLimit',\n    'font',\n    'textAlign',\n    'textBaseline',\n    'globalAlpha',\n    'globalCompositeOperation'\n  ];\n\n  /**\n     * Canvas Context constructor\n     * @constructor\n     * @abstract\n     * @memberof Konva\n     */\n  Konva.Context = function(canvas) {\n    this.init(canvas);\n  };\n\n  Konva.Context.prototype = {\n    init: function(canvas) {\n      this.canvas = canvas;\n      this._context = canvas._canvas.getContext('2d');\n\n      if (Konva.enableTrace) {\n        this.traceArr = [];\n        this._enableTrace();\n      }\n    },\n    /**\n         * fill shape\n         * @method\n         * @memberof Konva.Context.prototype\n         * @param {Konva.Shape} shape\n         */\n    fillShape: function(shape) {\n      if (shape.getFillEnabled()) {\n        this._fill(shape);\n      }\n    },\n    /**\n         * stroke shape\n         * @method\n         * @memberof Konva.Context.prototype\n         * @param {Konva.Shape} shape\n         */\n    strokeShape: function(shape) {\n      if (shape.getStrokeEnabled()) {\n        this._stroke(shape);\n      }\n    },\n    /**\n         * fill then stroke\n         * @method\n         * @memberof Konva.Context.prototype\n         * @param {Konva.Shape} shape\n         */\n    fillStrokeShape: function(shape) {\n      var fillEnabled = shape.getFillEnabled();\n      if (fillEnabled) {\n        this._fill(shape);\n      }\n      if (shape.getStrokeEnabled()) {\n        this._stroke(shape);\n      }\n    },\n    /**\n         * get context trace if trace is enabled\n         * @method\n         * @memberof Konva.Context.prototype\n         * @param {Boolean} relaxed if false, return strict context trace, which includes method names, method parameters\n         *  properties, and property values.  If true, return relaxed context trace, which only returns method names and\n         *  properites.\n         * @returns {String}\n         */\n    getTrace: function(relaxed) {\n      var traceArr = this.traceArr,\n        len = traceArr.length,\n        str = '',\n        n,\n        trace,\n        method,\n        args;\n\n      for (n = 0; n < len; n++) {\n        trace = traceArr[n];\n        method = trace.method;\n\n        // methods\n        if (method) {\n          args = trace.args;\n          str += method;\n          if (relaxed) {\n            str += DOUBLE_PAREN;\n          } else {\n            if (Konva.Util._isArray(args[0])) {\n              str +=\n                OPEN_PAREN_BRACKET + args.join(COMMA) + CLOSE_BRACKET_PAREN;\n            } else {\n              str += OPEN_PAREN + args.join(COMMA) + CLOSE_PAREN;\n            }\n          }\n        } else {\n          // properties\n          str += trace.property;\n          if (!relaxed) {\n            str += EQUALS + trace.val;\n          }\n        }\n\n        str += SEMICOLON;\n      }\n\n      return str;\n    },\n    /**\n         * clear trace if trace is enabled\n         * @method\n         * @memberof Konva.Context.prototype\n         */\n    clearTrace: function() {\n      this.traceArr = [];\n    },\n    _trace: function(str) {\n      var traceArr = this.traceArr, len;\n\n      traceArr.push(str);\n      len = traceArr.length;\n\n      if (len >= Konva.traceArrMax) {\n        traceArr.shift();\n      }\n    },\n    /**\n         * reset canvas context transform\n         * @method\n         * @memberof Konva.Context.prototype\n         */\n    reset: function() {\n      var pixelRatio = this.getCanvas().getPixelRatio();\n      this.setTransform(1 * pixelRatio, 0, 0, 1 * pixelRatio, 0, 0);\n    },\n    /**\n         * get canvas\n         * @method\n         * @memberof Konva.Context.prototype\n         * @returns {Konva.Canvas}\n         */\n    getCanvas: function() {\n      return this.canvas;\n    },\n    /**\n         * clear canvas\n         * @method\n         * @memberof Konva.Context.prototype\n         * @param {Object} [bounds]\n         * @param {Number} [bounds.x]\n         * @param {Number} [bounds.y]\n         * @param {Number} [bounds.width]\n         * @param {Number} [bounds.height]\n         */\n    clear: function(bounds) {\n      var canvas = this.getCanvas();\n\n      if (bounds) {\n        this.clearRect(\n          bounds.x || 0,\n          bounds.y || 0,\n          bounds.width || 0,\n          bounds.height || 0\n        );\n      } else {\n        this.clearRect(\n          0,\n          0,\n          canvas.getWidth() / canvas.pixelRatio,\n          canvas.getHeight() / canvas.pixelRatio\n        );\n      }\n    },\n    _applyLineCap: function(shape) {\n      var lineCap = shape.getLineCap();\n      if (lineCap) {\n        this.setAttr('lineCap', lineCap);\n      }\n    },\n    _applyOpacity: function(shape) {\n      var absOpacity = shape.getAbsoluteOpacity();\n      if (absOpacity !== 1) {\n        this.setAttr('globalAlpha', absOpacity);\n      }\n    },\n    _applyLineJoin: function(shape) {\n      var lineJoin = shape.getLineJoin();\n      if (lineJoin) {\n        this.setAttr('lineJoin', lineJoin);\n      }\n    },\n    setAttr: function(attr, val) {\n      this._context[attr] = val;\n    },\n\n    // context pass through methods\n    arc: function() {\n      var a = arguments;\n      this._context.arc(a[0], a[1], a[2], a[3], a[4], a[5]);\n    },\n    beginPath: function() {\n      this._context.beginPath();\n    },\n    bezierCurveTo: function() {\n      var a = arguments;\n      this._context.bezierCurveTo(a[0], a[1], a[2], a[3], a[4], a[5]);\n    },\n    clearRect: function() {\n      var a = arguments;\n      this._context.clearRect(a[0], a[1], a[2], a[3]);\n    },\n    clip: function() {\n      this._context.clip();\n    },\n    closePath: function() {\n      this._context.closePath();\n    },\n    createImageData: function() {\n      var a = arguments;\n      if (a.length === 2) {\n        return this._context.createImageData(a[0], a[1]);\n      } else if (a.length === 1) {\n        return this._context.createImageData(a[0]);\n      }\n    },\n    createLinearGradient: function() {\n      var a = arguments;\n      return this._context.createLinearGradient(a[0], a[1], a[2], a[3]);\n    },\n    createPattern: function() {\n      var a = arguments;\n      return this._context.createPattern(a[0], a[1]);\n    },\n    createRadialGradient: function() {\n      var a = arguments;\n      return this._context.createRadialGradient(\n        a[0],\n        a[1],\n        a[2],\n        a[3],\n        a[4],\n        a[5]\n      );\n    },\n    drawImage: function() {\n      var a = arguments, _context = this._context;\n\n      if (a.length === 3) {\n        _context.drawImage(a[0], a[1], a[2]);\n      } else if (a.length === 5) {\n        _context.drawImage(a[0], a[1], a[2], a[3], a[4]);\n      } else if (a.length === 9) {\n        _context.drawImage(\n          a[0],\n          a[1],\n          a[2],\n          a[3],\n          a[4],\n          a[5],\n          a[6],\n          a[7],\n          a[8]\n        );\n      }\n    },\n    isPointInPath: function(x, y) {\n      return this._context.isPointInPath(x, y);\n    },\n    fill: function() {\n      this._context.fill();\n    },\n    fillRect: function(x, y, width, height) {\n      this._context.fillRect(x, y, width, height);\n    },\n    strokeRect: function(x, y, width, height) {\n      this._context.strokeRect(x, y, width, height);\n    },\n    fillText: function() {\n      var a = arguments;\n      this._context.fillText(a[0], a[1], a[2]);\n    },\n    measureText: function(text) {\n      return this._context.measureText(text);\n    },\n    getImageData: function() {\n      var a = arguments;\n      return this._context.getImageData(a[0], a[1], a[2], a[3]);\n    },\n    lineTo: function() {\n      var a = arguments;\n      this._context.lineTo(a[0], a[1]);\n    },\n    moveTo: function() {\n      var a = arguments;\n      this._context.moveTo(a[0], a[1]);\n    },\n    rect: function() {\n      var a = arguments;\n      this._context.rect(a[0], a[1], a[2], a[3]);\n    },\n    putImageData: function() {\n      var a = arguments;\n      this._context.putImageData(a[0], a[1], a[2]);\n    },\n    quadraticCurveTo: function() {\n      var a = arguments;\n      this._context.quadraticCurveTo(a[0], a[1], a[2], a[3]);\n    },\n    restore: function() {\n      this._context.restore();\n    },\n    rotate: function() {\n      var a = arguments;\n      this._context.rotate(a[0]);\n    },\n    save: function() {\n      this._context.save();\n    },\n    scale: function() {\n      var a = arguments;\n      this._context.scale(a[0], a[1]);\n    },\n    setLineDash: function() {\n      var a = arguments, _context = this._context;\n\n      // works for Chrome and IE11\n      if (this._context.setLineDash) {\n        _context.setLineDash(a[0]);\n      } else if ('mozDash' in _context) {\n        // verified that this works in firefox\n        _context.mozDash = a[0];\n      } else if ('webkitLineDash' in _context) {\n        // does not currently work for Safari\n        _context.webkitLineDash = a[0];\n      }\n\n      // no support for IE9 and IE10\n    },\n    getLineDash: function() {\n      return this._context.getLineDash();\n    },\n    setTransform: function() {\n      var a = arguments;\n      this._context.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]);\n    },\n    stroke: function() {\n      this._context.stroke();\n    },\n    strokeText: function() {\n      var a = arguments;\n      this._context.strokeText(a[0], a[1], a[2]);\n    },\n    transform: function() {\n      var a = arguments;\n      this._context.transform(a[0], a[1], a[2], a[3], a[4], a[5]);\n    },\n    translate: function() {\n      var a = arguments;\n      this._context.translate(a[0], a[1]);\n    },\n    _enableTrace: function() {\n      var that = this,\n        len = CONTEXT_METHODS.length,\n        _simplifyArray = Konva.Util._simplifyArray,\n        origSetter = this.setAttr,\n        n,\n        args;\n\n      // to prevent creating scope function at each loop\n      var func = function(methodName) {\n        var origMethod = that[methodName], ret;\n\n        that[methodName] = function() {\n          args = _simplifyArray(Array.prototype.slice.call(arguments, 0));\n          ret = origMethod.apply(that, arguments);\n\n          that._trace({\n            method: methodName,\n            args: args\n          });\n\n          return ret;\n        };\n      };\n      // methods\n      for (n = 0; n < len; n++) {\n        func(CONTEXT_METHODS[n]);\n      }\n\n      // attrs\n      that.setAttr = function() {\n        origSetter.apply(that, arguments);\n        var prop = arguments[0];\n        var val = arguments[1];\n        if (\n          prop === 'shadowOffsetX' ||\n          prop === 'shadowOffsetY' ||\n          prop === 'shadowBlur'\n        ) {\n          val = val / this.canvas.getPixelRatio();\n        }\n        that._trace({\n          property: prop,\n          val: val\n        });\n      };\n    }\n  };\n\n  CONTEXT_PROPERTIES.forEach(function(prop) {\n    Object.defineProperty(Konva.Context.prototype, prop, {\n      get: function() {\n        return this._context[prop];\n      },\n      set: function(val) {\n        this._context[prop] = val;\n      }\n    });\n  });\n\n  Konva.SceneContext = function(canvas) {\n    Konva.Context.call(this, canvas);\n  };\n\n  Konva.SceneContext.prototype = {\n    _fillColor: function(shape) {\n      var fill = shape.fill();\n\n      this.setAttr('fillStyle', fill);\n      shape._fillFunc(this);\n    },\n    _fillPattern: function(shape) {\n      var fillPatternX = shape.getFillPatternX(),\n        fillPatternY = shape.getFillPatternY(),\n        fillPatternScale = shape.getFillPatternScale(),\n        fillPatternRotation = Konva.getAngle(shape.getFillPatternRotation()),\n        fillPatternOffset = shape.getFillPatternOffset();\n\n      if (fillPatternX || fillPatternY) {\n        this.translate(fillPatternX || 0, fillPatternY || 0);\n      }\n      if (fillPatternRotation) {\n        this.rotate(fillPatternRotation);\n      }\n      if (fillPatternScale) {\n        this.scale(fillPatternScale.x, fillPatternScale.y);\n      }\n      if (fillPatternOffset) {\n        this.translate(-1 * fillPatternOffset.x, -1 * fillPatternOffset.y);\n      }\n\n      this.setAttr(\n        'fillStyle',\n        this.createPattern(\n          shape.getFillPatternImage(),\n          shape.getFillPatternRepeat() || 'repeat'\n        )\n      );\n      this.fill();\n    },\n    _fillLinearGradient: function(shape) {\n      var start = shape.getFillLinearGradientStartPoint(),\n        end = shape.getFillLinearGradientEndPoint(),\n        colorStops = shape.getFillLinearGradientColorStops(),\n        grd = this.createLinearGradient(start.x, start.y, end.x, end.y);\n\n      if (colorStops) {\n        // build color stops\n        for (var n = 0; n < colorStops.length; n += 2) {\n          grd.addColorStop(colorStops[n], colorStops[n + 1]);\n        }\n        this.setAttr('fillStyle', grd);\n        shape._fillFunc(this);\n      }\n    },\n    _fillRadialGradient: function(shape) {\n      var start = shape.getFillRadialGradientStartPoint(),\n        end = shape.getFillRadialGradientEndPoint(),\n        startRadius = shape.getFillRadialGradientStartRadius(),\n        endRadius = shape.getFillRadialGradientEndRadius(),\n        colorStops = shape.getFillRadialGradientColorStops(),\n        grd = this.createRadialGradient(\n          start.x,\n          start.y,\n          startRadius,\n          end.x,\n          end.y,\n          endRadius\n        );\n\n      // build color stops\n      for (var n = 0; n < colorStops.length; n += 2) {\n        grd.addColorStop(colorStops[n], colorStops[n + 1]);\n      }\n      this.setAttr('fillStyle', grd);\n      this.fill();\n    },\n    _fill: function(shape) {\n      var hasColor = shape.fill(),\n        hasPattern = shape.getFillPatternImage(),\n        hasLinearGradient = shape.getFillLinearGradientColorStops(),\n        hasRadialGradient = shape.getFillRadialGradientColorStops(),\n        fillPriority = shape.getFillPriority();\n\n      // priority fills\n      if (hasColor && fillPriority === 'color') {\n        this._fillColor(shape);\n      } else if (hasPattern && fillPriority === 'pattern') {\n        this._fillPattern(shape);\n      } else if (hasLinearGradient && fillPriority === 'linear-gradient') {\n        this._fillLinearGradient(shape);\n      } else if (hasRadialGradient && fillPriority === 'radial-gradient') {\n        this._fillRadialGradient(shape);\n      } else if (hasColor) {\n        // now just try and fill with whatever is available\n        this._fillColor(shape);\n      } else if (hasPattern) {\n        this._fillPattern(shape);\n      } else if (hasLinearGradient) {\n        this._fillLinearGradient(shape);\n      } else if (hasRadialGradient) {\n        this._fillRadialGradient(shape);\n      }\n    },\n    _stroke: function(shape) {\n      var dash = shape.dash(),\n        // ignore strokeScaleEnabled for Text\n        strokeScaleEnabled =\n          shape.getStrokeScaleEnabled() || shape instanceof Konva.Text;\n\n      if (shape.hasStroke()) {\n        if (!strokeScaleEnabled) {\n          this.save();\n          this.setTransform(1, 0, 0, 1, 0, 0);\n        }\n\n        this._applyLineCap(shape);\n        if (dash && shape.dashEnabled()) {\n          this.setLineDash(dash);\n          this.setAttr('lineDashOffset', shape.dashOffset());\n        }\n\n        this.setAttr('lineWidth', shape.strokeWidth());\n        this.setAttr('strokeStyle', shape.stroke());\n\n        if (!shape.getShadowForStrokeEnabled()) {\n          this.setAttr('shadowColor', 'rgba(0,0,0,0)');\n        }\n        shape._strokeFunc(this);\n\n        if (!strokeScaleEnabled) {\n          this.restore();\n        }\n      }\n    },\n    _applyShadow: function(shape) {\n      var util = Konva.Util,\n        color = util.get(shape.getShadowRGBA(), 'black'),\n        blur = util.get(shape.getShadowBlur(), 5),\n        offset = util.get(shape.getShadowOffset(), {\n          x: 0,\n          y: 0\n        }),\n        // TODO: get this info from transform??\n        scale = shape.getAbsoluteScale(),\n        ratio = this.canvas.getPixelRatio(),\n        scaleX = scale.x * ratio,\n        scaleY = scale.y * ratio;\n\n      this.setAttr('shadowColor', color);\n      this.setAttr(\n        'shadowBlur',\n        blur * ratio * Math.min(Math.abs(scaleX), Math.abs(scaleY))\n      );\n      this.setAttr('shadowOffsetX', offset.x * scaleX);\n      this.setAttr('shadowOffsetY', offset.y * scaleY);\n    },\n    _applyGlobalCompositeOperation: function(shape) {\n      var globalCompositeOperation = shape.getGlobalCompositeOperation();\n      if (globalCompositeOperation !== 'source-over') {\n        this.setAttr('globalCompositeOperation', globalCompositeOperation);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.SceneContext, Konva.Context);\n\n  Konva.HitContext = function(canvas) {\n    Konva.Context.call(this, canvas);\n  };\n\n  Konva.HitContext.prototype = {\n    _fill: function(shape) {\n      this.save();\n      this.setAttr('fillStyle', shape.colorKey);\n      shape._fillFuncHit(this);\n      this.restore();\n    },\n    _stroke: function(shape) {\n      if (shape.hasStroke() && shape.strokeHitEnabled()) {\n        // ignore strokeScaleEnabled for Text\n        var strokeScaleEnabled =\n          shape.getStrokeScaleEnabled() || shape instanceof Konva.Text;\n        if (!strokeScaleEnabled) {\n          this.save();\n          this.setTransform(1, 0, 0, 1, 0, 0);\n        }\n        this._applyLineCap(shape);\n        this.setAttr('lineWidth', shape.strokeWidth());\n        this.setAttr('strokeStyle', shape.colorKey);\n        shape._strokeFuncHit(this);\n        if (!strokeScaleEnabled) {\n          this.restore();\n        }\n      }\n    }\n  };\n  Konva.Util.extend(Konva.HitContext, Konva.Context);\n})();\n\n(function() {\n  'use strict';\n  // CONSTANTS\n  var GET = 'get', SET = 'set';\n\n  Konva.Factory = {\n    addGetterSetter: function(constructor, attr, def, validator, after) {\n      this.addGetter(constructor, attr, def);\n      this.addSetter(constructor, attr, validator, after);\n      this.addOverloadedGetterSetter(constructor, attr);\n    },\n    addGetter: function(constructor, attr, def) {\n      var method = GET + Konva.Util._capitalize(attr);\n\n      constructor.prototype[method] = function() {\n        var val = this.attrs[attr];\n        return val === undefined ? def : val;\n      };\n    },\n    addSetter: function(constructor, attr, validator, after) {\n      var method = SET + Konva.Util._capitalize(attr);\n\n      constructor.prototype[method] = function(val) {\n        if (validator) {\n          val = validator.call(this, val);\n        }\n\n        this._setAttr(attr, val);\n\n        if (after) {\n          after.call(this);\n        }\n\n        return this;\n      };\n    },\n    addComponentsGetterSetter: function(\n      constructor,\n      attr,\n      components,\n      validator,\n      after\n    ) {\n      var len = components.length,\n        capitalize = Konva.Util._capitalize,\n        getter = GET + capitalize(attr),\n        setter = SET + capitalize(attr),\n        n,\n        component;\n\n      // getter\n      constructor.prototype[getter] = function() {\n        var ret = {};\n\n        for (n = 0; n < len; n++) {\n          component = components[n];\n          ret[component] = this.getAttr(attr + capitalize(component));\n        }\n\n        return ret;\n      };\n\n      // setter\n      constructor.prototype[setter] = function(val) {\n        var oldVal = this.attrs[attr], key;\n\n        if (validator) {\n          val = validator.call(this, val);\n        }\n\n        for (key in val) {\n          if (!val.hasOwnProperty(key)) {\n            continue;\n          }\n          this._setAttr(attr + capitalize(key), val[key]);\n        }\n\n        this._fireChangeEvent(attr, oldVal, val);\n\n        if (after) {\n          after.call(this);\n        }\n\n        return this;\n      };\n\n      this.addOverloadedGetterSetter(constructor, attr);\n    },\n    addOverloadedGetterSetter: function(constructor, attr) {\n      var capitalizedAttr = Konva.Util._capitalize(attr),\n        setter = SET + capitalizedAttr,\n        getter = GET + capitalizedAttr;\n\n      constructor.prototype[attr] = function() {\n        // setting\n        if (arguments.length) {\n          this[setter](arguments[0]);\n          return this;\n        }\n        // getting\n        return this[getter]();\n      };\n    },\n    addDeprecatedGetterSetter: function(constructor, attr, def, validator) {\n      var method = GET + Konva.Util._capitalize(attr);\n      var message =\n        attr +\n        ' property is deprecated and will be removed soon. Look at Konva change log for more information.';\n      constructor.prototype[method] = function() {\n        Konva.Util.error(message);\n        var val = this.attrs[attr];\n        return val === undefined ? def : val;\n      };\n      this.addSetter(constructor, attr, validator, function() {\n        Konva.Util.error(message);\n      });\n      this.addOverloadedGetterSetter(constructor, attr);\n    },\n    backCompat: function(constructor, methods) {\n      Konva.Util.each(methods, function(oldMethodName, newMethodName) {\n        var method = constructor.prototype[newMethodName];\n        constructor.prototype[oldMethodName] = function() {\n          method.apply(this, arguments);\n          Konva.Util.error(\n            oldMethodName +\n              ' method is deprecated and will be removed soon. Use ' +\n              newMethodName +\n              ' instead'\n          );\n        };\n      });\n    },\n    afterSetFilter: function() {\n      this._filterUpToDate = false;\n    }\n  };\n\n  Konva.Validators = {\n    /**\n         * @return {number}\n         */\n    RGBComponent: function(val) {\n      if (val > 255) {\n        return 255;\n      } else if (val < 0) {\n        return 0;\n      }\n      return Math.round(val);\n    },\n    alphaComponent: function(val) {\n      if (val > 1) {\n        return 1;\n      } else if (val < 0.0001) {\n        // chrome does not honor alpha values of 0\n        return 0.0001;\n      }\n\n      return val;\n    }\n  };\n})();\n\n(function(Konva) {\n  'use strict';\n  // CONSTANTS\n  var ABSOLUTE_OPACITY = 'absoluteOpacity',\n    ABSOLUTE_TRANSFORM = 'absoluteTransform',\n    ABSOLUTE_SCALE = 'absoluteScale',\n    CHANGE = 'Change',\n    CHILDREN = 'children',\n    DOT = '.',\n    EMPTY_STRING = '',\n    GET = 'get',\n    ID = 'id',\n    KONVA = 'konva',\n    LISTENING = 'listening',\n    MOUSEENTER = 'mouseenter',\n    MOUSELEAVE = 'mouseleave',\n    NAME = 'name',\n    SET = 'set',\n    SHAPE = 'Shape',\n    SPACE = ' ',\n    STAGE = 'stage',\n    TRANSFORM = 'transform',\n    UPPER_STAGE = 'Stage',\n    VISIBLE = 'visible',\n    CLONE_BLACK_LIST = ['id'],\n    TRANSFORM_CHANGE_STR = [\n      'xChange.konva',\n      'yChange.konva',\n      'scaleXChange.konva',\n      'scaleYChange.konva',\n      'skewXChange.konva',\n      'skewYChange.konva',\n      'rotationChange.konva',\n      'offsetXChange.konva',\n      'offsetYChange.konva',\n      'transformsEnabledChange.konva'\n    ].join(SPACE),\n    SCALE_CHANGE_STR = ['scaleXChange.konva', 'scaleYChange.konva'].join(SPACE);\n\n  /**\n     * Node constructor. Nodes are entities that can be transformed, layered,\n     * and have bound events. The stage, layers, groups, and shapes all extend Node.\n     * @constructor\n     * @memberof Konva\n     * @abstract\n     * @param {Object} config\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     */\n  Konva.Node = function(config) {\n    this._init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Node, {\n    _init: function(config) {\n      var that = this;\n      this._id = Konva.idCounter++;\n      this.eventListeners = {};\n      this.attrs = {};\n      this._cache = {};\n      this._filterUpToDate = false;\n      this._isUnderCache = false;\n      this.setAttrs(config);\n\n      // event bindings for cache handling\n      this.on(TRANSFORM_CHANGE_STR, function() {\n        this._clearCache(TRANSFORM);\n        that._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n      });\n\n      this.on(SCALE_CHANGE_STR, function() {\n        that._clearSelfAndDescendantCache(ABSOLUTE_SCALE);\n      });\n\n      this.on('visibleChange.konva', function() {\n        that._clearSelfAndDescendantCache(VISIBLE);\n      });\n      this.on('listeningChange.konva', function() {\n        that._clearSelfAndDescendantCache(LISTENING);\n      });\n      this.on('opacityChange.konva', function() {\n        that._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n      });\n    },\n    _clearCache: function(attr) {\n      if (attr) {\n        delete this._cache[attr];\n      } else {\n        this._cache = {};\n      }\n    },\n    _getCache: function(attr, privateGetter) {\n      var cache = this._cache[attr];\n\n      // if not cached, we need to set it using the private getter method.\n      if (cache === undefined) {\n        this._cache[attr] = privateGetter.call(this);\n      }\n\n      return this._cache[attr];\n    },\n    /*\n         * when the logic for a cached result depends on ancestor propagation, use this\n         * method to clear self and children cache\n         */\n    _clearSelfAndDescendantCache: function(attr) {\n      this._clearCache(attr);\n\n      if (this.children) {\n        this.getChildren().each(function(node) {\n          node._clearSelfAndDescendantCache(attr);\n        });\n      }\n    },\n    /**\n        * clear cached canvas\n        * @method\n        * @memberof Konva.Node.prototype\n        * @returns {Konva.Node}\n        * @example\n        * node.clearCache();\n        */\n    clearCache: function() {\n      delete this._cache.canvas;\n      this._filterUpToDate = false;\n      return this;\n    },\n    /**\n        *  cache node to improve drawing performance, apply filters, or create more accurate\n        *  hit regions. For all basic shapes size of cache canvas will be automatically detected.\n        *  If you need to cache your custom `Konva.Shape` instance you have to pass shape's bounding box\n        *  properties. Look at [link to demo page](link to demo page) for more information.\n        * @method\n        * @memberof Konva.Node.prototype\n        * @param {Object} [config]\n        * @param {Number} [config.x]\n        * @param {Number} [config.y]\n        * @param {Number} [config.width]\n        * @param {Number} [config.height]\n        * @param {Number} [config.offset]  increase canvas size by `offset` pixel in all directions.\n        * @param {Boolean} [config.drawBorder] when set to true, a red border will be drawn around the cached\n        *  region for debugging purposes\n        * @param {Number} [config.pixelRatio] change quality (or pixel ratio) of cached image. pixelRatio = 2 will produce 2x sized cache.\n        * @returns {Konva.Node}\n        * @example\n        * // cache a shape with the x,y position of the bounding box at the center and\n        * // the width and height of the bounding box equal to the width and height of\n        * // the shape obtained from shape.width() and shape.height()\n        * image.cache();\n        *\n        * // cache a node and define the bounding box position and size\n        * node.cache({\n        *   x: -30,\n        *   y: -30,\n        *   width: 100,\n        *   height: 200\n        * });\n        *\n        * // cache a node and draw a red border around the bounding box\n        * // for debugging purposes\n        * node.cache({\n        *   x: -30,\n        *   y: -30,\n        *   width: 100,\n        *   height: 200,\n        *   offset : 10,\n        *   drawBorder: true\n        * });\n        */\n    cache: function(config) {\n      var conf = config || {},\n        rect = this.getClientRect({\n          skipTransform: true,\n          relativeTo: this.getParent()\n        }),\n        width = conf.width || rect.width,\n        height = conf.height || rect.height,\n        pixelRatio = conf.pixelRatio,\n        x = conf.x || rect.x,\n        y = conf.y || rect.y,\n        offset = conf.offset || 0,\n        drawBorder = conf.drawBorder || false;\n\n      if (!width || !height) {\n        // make throw async, because we don't need to stop funcion\n        setTimeout(function() {\n          Konva.Util.throw(\n            'Width or height of caching configuration equals 0. Caching is ignored.'\n          );\n        });\n        return;\n      }\n\n      width += offset * 2;\n      height += offset * 2;\n\n      x -= offset;\n      y -= offset;\n\n      var cachedSceneCanvas = new Konva.SceneCanvas({\n          pixelRatio: pixelRatio,\n          width: width,\n          height: height\n        }),\n        cachedFilterCanvas = new Konva.SceneCanvas({\n          pixelRatio: pixelRatio,\n          width: width,\n          height: height\n        }),\n        cachedHitCanvas = new Konva.HitCanvas({\n          pixelRatio: 1,\n          width: width,\n          height: height\n        }),\n        sceneContext = cachedSceneCanvas.getContext(),\n        hitContext = cachedHitCanvas.getContext();\n\n      cachedHitCanvas.isCache = true;\n\n      this.clearCache();\n\n      sceneContext.save();\n      hitContext.save();\n\n      sceneContext.translate(-x, -y);\n      hitContext.translate(-x, -y);\n\n      // extra flag to skip on getAbsolute opacity calc\n      this._isUnderCache = true;\n      this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n      this._clearSelfAndDescendantCache(ABSOLUTE_SCALE);\n\n      this.drawScene(cachedSceneCanvas, this, true);\n      this.drawHit(cachedHitCanvas, this, true);\n      this._isUnderCache = false;\n\n      sceneContext.restore();\n      hitContext.restore();\n\n      // this will draw a red border around the cached box for\n      // debugging purposes\n      if (drawBorder) {\n        sceneContext.save();\n        sceneContext.beginPath();\n        sceneContext.rect(0, 0, width, height);\n        sceneContext.closePath();\n        sceneContext.setAttr('strokeStyle', 'red');\n        sceneContext.setAttr('lineWidth', 5);\n        sceneContext.stroke();\n        sceneContext.restore();\n      }\n\n      this._cache.canvas = {\n        scene: cachedSceneCanvas,\n        filter: cachedFilterCanvas,\n        hit: cachedHitCanvas,\n        x: x,\n        y: y\n      };\n\n      return this;\n    },\n    /**\n         * Return client rectangle {x, y, width, height} of node. This rectangle also include all styling (strokes, shadows, etc).\n         * The rectangle position is relative to parent container.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} config\n         * @param {Boolean} [config.skipTransform] should we apply transform to node for calculating rect?\n         * @param {Object} [config.relativeTo] calculate client rect relative to one of the parents\n         * @returns {Object} rect with {x, y, width, height} properties\n         * @example\n         * var rect = new Konva.Rect({\n         *      width : 100,\n         *      height : 100,\n         *      x : 50,\n         *      y : 50,\n         *      strokeWidth : 4,\n         *      stroke : 'black',\n         *      offsetX : 50,\n         *      scaleY : 2\n         * });\n         *\n         * // get client rect without think off transformations (position, rotation, scale, offset, etc)\n         * rect.getClientRect({ skipTransform: true});\n         * // returns {\n         * //     x : -2,   // two pixels for stroke / 2\n         * //     y : -2,\n         * //     width : 104, // increased by 4 for stroke\n         * //     height : 104\n         * //}\n         *\n         * // get client rect with transformation applied\n         * rect.getClientRect();\n         * // returns Object {x: -2, y: 46, width: 104, height: 208}\n         */\n    getClientRect: function() {\n      // abstract method\n      // redefine in Container and Shape\n      throw new Error('abstract \"getClientRect\" method call');\n    },\n    _transformedRect: function(rect, top) {\n      var points = [\n        { x: rect.x, y: rect.y },\n        { x: rect.x + rect.width, y: rect.y },\n        { x: rect.x + rect.width, y: rect.y + rect.height },\n        { x: rect.x, y: rect.y + rect.height }\n      ];\n      var minX, minY, maxX, maxY;\n      var trans = this.getAbsoluteTransform(top);\n      points.forEach(function(point) {\n        var transformed = trans.point(point);\n        if (minX === undefined) {\n          minX = maxX = transformed.x;\n          minY = maxY = transformed.y;\n        }\n        minX = Math.min(minX, transformed.x);\n        minY = Math.min(minY, transformed.y);\n        maxX = Math.max(maxX, transformed.x);\n        maxY = Math.max(maxY, transformed.y);\n      });\n      return {\n        x: minX,\n        y: minY,\n        width: maxX - minX,\n        height: maxY - minY\n      };\n    },\n    _drawCachedSceneCanvas: function(context) {\n      context.save();\n      context._applyOpacity(this);\n      context._applyGlobalCompositeOperation(this);\n      context.translate(this._cache.canvas.x, this._cache.canvas.y);\n\n      var cacheCanvas = this._getCachedSceneCanvas();\n      var ratio = cacheCanvas.pixelRatio;\n\n      context.drawImage(\n        cacheCanvas._canvas,\n        0,\n        0,\n        cacheCanvas.width / ratio,\n        cacheCanvas.height / ratio\n      );\n      context.restore();\n    },\n    _drawCachedHitCanvas: function(context) {\n      var cachedCanvas = this._cache.canvas,\n        hitCanvas = cachedCanvas.hit;\n      context.save();\n      context.translate(this._cache.canvas.x, this._cache.canvas.y);\n      context.drawImage(hitCanvas._canvas, 0, 0);\n      context.restore();\n    },\n    _getCachedSceneCanvas: function() {\n      var filters = this.filters(),\n        cachedCanvas = this._cache.canvas,\n        sceneCanvas = cachedCanvas.scene,\n        filterCanvas = cachedCanvas.filter,\n        filterContext = filterCanvas.getContext(),\n        len,\n        imageData,\n        n,\n        filter;\n\n      if (filters) {\n        if (!this._filterUpToDate) {\n          var ratio = sceneCanvas.pixelRatio;\n\n          try {\n            len = filters.length;\n            filterContext.clear();\n\n            // copy cached canvas onto filter context\n            filterContext.drawImage(\n              sceneCanvas._canvas,\n              0,\n              0,\n              sceneCanvas.getWidth() / ratio,\n              sceneCanvas.getHeight() / ratio\n            );\n            imageData = filterContext.getImageData(\n              0,\n              0,\n              filterCanvas.getWidth(),\n              filterCanvas.getHeight()\n            );\n\n            // apply filters to filter context\n            for (n = 0; n < len; n++) {\n              filter = filters[n];\n              if (typeof filter !== 'function') {\n                Konva.Util.error(\n                  'Filter should be type of function, but got ' +\n                    typeof filter +\n                    ' insted. Please check correct filters'\n                );\n                continue;\n              }\n              filter.call(this, imageData);\n              filterContext.putImageData(imageData, 0, 0);\n            }\n          } catch (e) {\n            Konva.Util.error('Unable to apply filter. ' + e.message);\n          }\n\n          this._filterUpToDate = true;\n        }\n\n        return filterCanvas;\n      }\n      return sceneCanvas;\n    },\n    /**\n         * bind events to the node. KonvaJS supports mouseover, mousemove,\n         *  mouseout, mouseenter, mouseleave, mousedown, mouseup, wheel, click, dblclick, touchstart, touchmove,\n         *  touchend, tap, dbltap, dragstart, dragmove, and dragend events. The Konva Stage supports\n         *  contentMouseover, contentMousemove, contentMouseout, contentMousedown, contentMouseup, contentWheel, contentContextmenu\n         *  contentClick, contentDblclick, contentTouchstart, contentTouchmove, contentTouchend, contentTap,\n         *  and contentDblTap.  Pass in a string of events delimmited by a space to bind multiple events at once\n         *  such as 'mousedown mouseup mousemove'. Include a namespace to bind an\n         *  event by name such as 'click.foobar'.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} evtStr e.g. 'click', 'mousedown touchstart', 'mousedown.foo touchstart.foo'\n         * @param {Function} handler The handler function is passed an event object\n         * @returns {Konva.Node}\n         * @example\n         * // add click listener\n         * node.on('click', function() {\n         *   console.log('you clicked me!');\n         * });\n         *\n         * // get the target node\n         * node.on('click', function(evt) {\n         *   console.log(evt.target);\n         * });\n         *\n         * // stop event propagation\n         * node.on('click', function(evt) {\n         *   evt.cancelBubble = true;\n         * });\n         *\n         * // bind multiple listeners\n         * node.on('click touchstart', function() {\n         *   console.log('you clicked/touched me!');\n         * });\n         *\n         * // namespace listener\n         * node.on('click.foo', function() {\n         *   console.log('you clicked/touched me!');\n         * });\n         *\n         * // get the event type\n         * node.on('click tap', function(evt) {\n         *   var eventType = evt.type;\n         * });\n         *\n         * // get native event object\n         * node.on('click tap', function(evt) {\n         *   var nativeEvent = evt.evt;\n         * });\n         *\n         * // for change events, get the old and new val\n         * node.on('xChange', function(evt) {\n         *   var oldVal = evt.oldVal;\n         *   var newVal = evt.newVal;\n         * });\n         *\n         * // get event targets\n         * // with event delegations\n         * layer.on('click', 'Group', function(evt) {\n         *   var shape = evt.target;\n         *   var group = evtn.currentTarger;\n         * });\n         */\n    on: function(evtStr, handler) {\n      if (arguments.length === 3) {\n        return this._delegate.apply(this, arguments);\n      }\n      var events = evtStr.split(SPACE),\n        len = events.length,\n        n,\n        event,\n        parts,\n        baseEvent,\n        name;\n\n      /*\n             * loop through types and attach event listeners to\n             * each one.  eg. 'click mouseover.namespace mouseout'\n             * will create three event bindings\n             */\n      for (n = 0; n < len; n++) {\n        event = events[n];\n        parts = event.split(DOT);\n        baseEvent = parts[0];\n        name = parts[1] || EMPTY_STRING;\n\n        // create events array if it doesn't exist\n        if (!this.eventListeners[baseEvent]) {\n          this.eventListeners[baseEvent] = [];\n        }\n\n        this.eventListeners[baseEvent].push({\n          name: name,\n          handler: handler\n        });\n      }\n\n      return this;\n    },\n    /**\n         * remove event bindings from the node. Pass in a string of\n         *  event types delimmited by a space to remove multiple event\n         *  bindings at once such as 'mousedown mouseup mousemove'.\n         *  include a namespace to remove an event binding by name\n         *  such as 'click.foobar'. If you only give a name like '.foobar',\n         *  all events in that namespace will be removed.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} evtStr e.g. 'click', 'mousedown touchstart', '.foobar'\n         * @returns {Konva.Node}\n         * @example\n         * // remove listener\n         * node.off('click');\n         *\n         * // remove multiple listeners\n         * node.off('click touchstart');\n         *\n         * // remove listener by name\n         * node.off('click.foo');\n         */\n    off: function(evtStr) {\n      var events = (evtStr || '').split(SPACE),\n        len = events.length,\n        n,\n        t,\n        event,\n        parts,\n        baseEvent,\n        name;\n\n      if (!evtStr) {\n        // remove all events\n        for (t in this.eventListeners) {\n          this._off(t);\n        }\n      }\n      for (n = 0; n < len; n++) {\n        event = events[n];\n        parts = event.split(DOT);\n        baseEvent = parts[0];\n        name = parts[1];\n\n        if (baseEvent) {\n          if (this.eventListeners[baseEvent]) {\n            this._off(baseEvent, name);\n          }\n        } else {\n          for (t in this.eventListeners) {\n            this._off(t, name);\n          }\n        }\n      }\n      return this;\n    },\n    // some event aliases for third party integration like HammerJS\n    dispatchEvent: function(evt) {\n      var e = {\n        target: this,\n        type: evt.type,\n        evt: evt\n      };\n      this.fire(evt.type, e);\n      return this;\n    },\n    addEventListener: function(type, handler) {\n      // we have to pass native event to handler\n      this.on(type, function(evt) {\n        handler.call(this, evt.evt);\n      });\n      return this;\n    },\n    removeEventListener: function(type) {\n      this.off(type);\n      return this;\n    },\n    // like node.on\n    _delegate: function(event, selector, handler) {\n      var stopNode = this;\n      this.on(event, function(evt) {\n        var targets = evt.target.findAncestors(selector, true, stopNode);\n        for (var i = 0; i < targets.length; i++) {\n          evt = Konva.Util.cloneObject(evt);\n          evt.currentTarget = targets[i];\n          handler.call(targets[i], evt);\n        }\n      });\n    },\n    /**\n         * remove self from parent, but don't destroy\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Node}\n         * @example\n         * node.remove();\n         */\n    remove: function() {\n      var parent = this.getParent();\n\n      if (parent && parent.children) {\n        parent.children.splice(this.index, 1);\n        parent._setChildrenIndices();\n        delete this.parent;\n      }\n\n      // every cached attr that is calculated via node tree\n      // traversal must be cleared when removing a node\n      this._clearSelfAndDescendantCache(STAGE);\n      this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n      this._clearSelfAndDescendantCache(VISIBLE);\n      this._clearSelfAndDescendantCache(LISTENING);\n      this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n\n      return this;\n    },\n    /**\n         * remove and destroy self\n         * @method\n         * @memberof Konva.Node.prototype\n         * @example\n         * node.destroy();\n         */\n    destroy: function() {\n      // remove from ids and names hashes\n      Konva._removeId(this.getId());\n\n      // remove all names\n      var names = (this.getName() || '').split(/\\s/g);\n      for (var i = 0; i < names.length; i++) {\n        var subname = names[i];\n        Konva._removeName(subname, this._id);\n      }\n\n      this.remove();\n      return this;\n    },\n    /**\n         * get attr\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} attr\n         * @returns {Integer|String|Object|Array}\n         * @example\n         * var x = node.getAttr('x');\n         */\n    getAttr: function(attr) {\n      var method = GET + Konva.Util._capitalize(attr);\n      if (Konva.Util._isFunction(this[method])) {\n        return this[method]();\n      }\n      // otherwise get directly\n      return this.attrs[attr];\n    },\n    /**\n        * get ancestors\n        * @method\n        * @memberof Konva.Node.prototype\n        * @returns {Konva.Collection}\n        * @example\n        * shape.getAncestors().each(function(node) {\n        *   console.log(node.getId());\n        * })\n        */\n    getAncestors: function() {\n      var parent = this.getParent(),\n        ancestors = new Konva.Collection();\n\n      while (parent) {\n        ancestors.push(parent);\n        parent = parent.getParent();\n      }\n\n      return ancestors;\n    },\n    /**\n         * get attrs object literal\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Object}\n         */\n    getAttrs: function() {\n      return this.attrs || {};\n    },\n    /**\n         * set multiple attrs at once using an object literal\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} config object containing key value pairs\n         * @returns {Konva.Node}\n         * @example\n         * node.setAttrs({\n         *   x: 5,\n         *   fill: 'red'\n         * });\n         */\n    setAttrs: function(config) {\n      var key, method;\n\n      if (!config) {\n        return this;\n      }\n      for (key in config) {\n        if (key === CHILDREN) {\n          continue;\n        }\n        method = SET + Konva.Util._capitalize(key);\n        // use setter if available\n        if (Konva.Util._isFunction(this[method])) {\n          this[method](config[key]);\n        } else {\n          // otherwise set directly\n          this._setAttr(key, config[key]);\n        }\n      }\n      return this;\n    },\n    /**\n         * determine if node is listening for events by taking into account ancestors.\n         *\n         * Parent    | Self      | isListening\n         * listening | listening |\n         * ----------+-----------+------------\n         * T         | T         | T\n         * T         | F         | F\n         * F         | T         | T\n         * F         | F         | F\n         * ----------+-----------+------------\n         * T         | I         | T\n         * F         | I         | F\n         * I         | I         | T\n         *\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    isListening: function() {\n      return this._getCache(LISTENING, this._isListening);\n    },\n    _isListening: function() {\n      var listening = this.getListening(),\n        parent = this.getParent();\n\n      // the following conditions are a simplification of the truth table above.\n      // please modify carefully\n      if (listening === 'inherit') {\n        if (parent) {\n          return parent.isListening();\n        } else {\n          return true;\n        }\n      } else {\n        return listening;\n      }\n    },\n    /**\n         * determine if node is visible by taking into account ancestors.\n         *\n         * Parent    | Self      | isVisible\n         * visible   | visible   |\n         * ----------+-----------+------------\n         * T         | T         | T\n         * T         | F         | F\n         * F         | T         | T\n         * F         | F         | F\n         * ----------+-----------+------------\n         * T         | I         | T\n         * F         | I         | F\n         * I         | I         | T\n\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    isVisible: function() {\n      return this._getCache(VISIBLE, this._isVisible);\n    },\n    _isVisible: function() {\n      var visible = this.getVisible(),\n        parent = this.getParent();\n\n      // the following conditions are a simplification of the truth table above.\n      // please modify carefully\n      if (visible === 'inherit') {\n        if (parent) {\n          return parent.isVisible();\n        } else {\n          return true;\n        }\n      } else {\n        return visible;\n      }\n    },\n    /**\n         * determine if listening is enabled by taking into account descendants.  If self or any children\n         * have _isListeningEnabled set to true, then self also has listening enabled.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    shouldDrawHit: function(canvas) {\n      var layer = this.getLayer();\n      return (\n        (canvas && canvas.isCache) ||\n        (layer &&\n          layer.hitGraphEnabled() &&\n          this.isListening() &&\n          this.isVisible())\n      );\n    },\n    /**\n         * show node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Node}\n         */\n    show: function() {\n      this.setVisible(true);\n      return this;\n    },\n    /**\n         * hide node.  Hidden nodes are no longer detectable\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Node}\n         */\n    hide: function() {\n      this.setVisible(false);\n      return this;\n    },\n    /**\n         * get zIndex relative to the node's siblings who share the same parent\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Integer}\n         */\n    getZIndex: function() {\n      return this.index || 0;\n    },\n    /**\n         * get absolute z-index which takes into account sibling\n         *  and ancestor indices\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Integer}\n         */\n    getAbsoluteZIndex: function() {\n      var depth = this.getDepth(),\n        that = this,\n        index = 0,\n        nodes,\n        len,\n        n,\n        child;\n\n      function addChildren(children) {\n        nodes = [];\n        len = children.length;\n        for (n = 0; n < len; n++) {\n          child = children[n];\n          index++;\n\n          if (child.nodeType !== SHAPE) {\n            nodes = nodes.concat(child.getChildren().toArray());\n          }\n\n          if (child._id === that._id) {\n            n = len;\n          }\n        }\n\n        if (nodes.length > 0 && nodes[0].getDepth() <= depth) {\n          addChildren(nodes);\n        }\n      }\n      if (that.nodeType !== UPPER_STAGE) {\n        addChildren(that.getStage().getChildren());\n      }\n\n      return index;\n    },\n    /**\n         * get node depth in node tree.  Returns an integer.\n         *  e.g. Stage depth will always be 0.  Layers will always be 1.  Groups and Shapes will always\n         *  be >= 2\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Integer}\n         */\n    getDepth: function() {\n      var depth = 0,\n        parent = this.parent;\n\n      while (parent) {\n        depth++;\n        parent = parent.parent;\n      }\n      return depth;\n    },\n    setPosition: function(pos) {\n      this.setX(pos.x);\n      this.setY(pos.y);\n      return this;\n    },\n    getPosition: function() {\n      return {\n        x: this.getX(),\n        y: this.getY()\n      };\n    },\n    /**\n         * get absolute position relative to the top left corner of the stage container div\n         * or relative to passed node\n         * @method\n         * @param {Object} [top] optional parent node\n         * @memberof Konva.Node.prototype\n         * @returns {Object}\n         */\n    getAbsolutePosition: function(top) {\n      var absoluteMatrix = this.getAbsoluteTransform(top).getMatrix(),\n        absoluteTransform = new Konva.Transform(),\n        offset = this.offset();\n\n      // clone the matrix array\n      absoluteTransform.m = absoluteMatrix.slice();\n      absoluteTransform.translate(offset.x, offset.y);\n\n      return absoluteTransform.getTranslation();\n    },\n    /**\n         * set absolute position\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} pos\n         * @param {Number} pos.x\n         * @param {Number} pos.y\n         * @returns {Konva.Node}\n         */\n    setAbsolutePosition: function(pos) {\n      var origTrans = this._clearTransform(),\n        it;\n\n      // don't clear translation\n      this.attrs.x = origTrans.x;\n      this.attrs.y = origTrans.y;\n      delete origTrans.x;\n      delete origTrans.y;\n\n      // unravel transform\n      it = this.getAbsoluteTransform();\n\n      it.invert();\n      it.translate(pos.x, pos.y);\n      pos = {\n        x: this.attrs.x + it.getTranslation().x,\n        y: this.attrs.y + it.getTranslation().y\n      };\n\n      this.setPosition({ x: pos.x, y: pos.y });\n      this._setTransform(origTrans);\n\n      return this;\n    },\n    _setTransform: function(trans) {\n      var key;\n\n      for (key in trans) {\n        this.attrs[key] = trans[key];\n      }\n\n      this._clearCache(TRANSFORM);\n      this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n    },\n    _clearTransform: function() {\n      var trans = {\n        x: this.getX(),\n        y: this.getY(),\n        rotation: this.getRotation(),\n        scaleX: this.getScaleX(),\n        scaleY: this.getScaleY(),\n        offsetX: this.getOffsetX(),\n        offsetY: this.getOffsetY(),\n        skewX: this.getSkewX(),\n        skewY: this.getSkewY()\n      };\n\n      this.attrs.x = 0;\n      this.attrs.y = 0;\n      this.attrs.rotation = 0;\n      this.attrs.scaleX = 1;\n      this.attrs.scaleY = 1;\n      this.attrs.offsetX = 0;\n      this.attrs.offsetY = 0;\n      this.attrs.skewX = 0;\n      this.attrs.skewY = 0;\n\n      this._clearCache(TRANSFORM);\n      this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n\n      // return original transform\n      return trans;\n    },\n    /**\n         * move node by an amount relative to its current position\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} change\n         * @param {Number} change.x\n         * @param {Number} change.y\n         * @returns {Konva.Node}\n         * @example\n         * // move node in x direction by 1px and y direction by 2px\n         * node.move({\n         *   x: 1,\n         *   y: 2)\n         * });\n         */\n    move: function(change) {\n      var changeX = change.x,\n        changeY = change.y,\n        x = this.getX(),\n        y = this.getY();\n\n      if (changeX !== undefined) {\n        x += changeX;\n      }\n\n      if (changeY !== undefined) {\n        y += changeY;\n      }\n\n      this.setPosition({ x: x, y: y });\n      return this;\n    },\n    _eachAncestorReverse: function(func, top) {\n      var family = [],\n        parent = this.getParent(),\n        len,\n        n;\n\n      // if top node is defined, and this node is top node,\n      // there's no need to build a family tree.  just execute\n      // func with this because it will be the only node\n      if (top && top._id === this._id) {\n        func(this);\n        return true;\n      }\n\n      family.unshift(this);\n\n      while (parent && (!top || parent._id !== top._id)) {\n        family.unshift(parent);\n        parent = parent.parent;\n      }\n\n      len = family.length;\n      for (n = 0; n < len; n++) {\n        func(family[n]);\n      }\n    },\n    /**\n         * rotate node by an amount in degrees relative to its current rotation\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Number} theta\n         * @returns {Konva.Node}\n         */\n    rotate: function(theta) {\n      this.setRotation(this.getRotation() + theta);\n      return this;\n    },\n    /**\n         * move node to the top of its siblings\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    moveToTop: function() {\n      if (!this.parent) {\n        Konva.Util.warn('Node has no parent. moveToTop function is ignored.');\n        return false;\n      }\n      var index = this.index;\n      this.parent.children.splice(index, 1);\n      this.parent.children.push(this);\n      this.parent._setChildrenIndices();\n      return true;\n    },\n    /**\n         * move node up\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean} flag is moved or not\n         */\n    moveUp: function() {\n      if (!this.parent) {\n        Konva.Util.warn('Node has no parent. moveUp function is ignored.');\n        return false;\n      }\n      var index = this.index,\n        len = this.parent.getChildren().length;\n      if (index < len - 1) {\n        this.parent.children.splice(index, 1);\n        this.parent.children.splice(index + 1, 0, this);\n        this.parent._setChildrenIndices();\n        return true;\n      }\n      return false;\n    },\n    /**\n         * move node down\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    moveDown: function() {\n      if (!this.parent) {\n        Konva.Util.warn('Node has no parent. moveDown function is ignored.');\n        return false;\n      }\n      var index = this.index;\n      if (index > 0) {\n        this.parent.children.splice(index, 1);\n        this.parent.children.splice(index - 1, 0, this);\n        this.parent._setChildrenIndices();\n        return true;\n      }\n      return false;\n    },\n    /**\n         * move node to the bottom of its siblings\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Boolean}\n         */\n    moveToBottom: function() {\n      if (!this.parent) {\n        Konva.Util.warn(\n          'Node has no parent. moveToBottom function is ignored.'\n        );\n        return false;\n      }\n      var index = this.index;\n      if (index > 0) {\n        this.parent.children.splice(index, 1);\n        this.parent.children.unshift(this);\n        this.parent._setChildrenIndices();\n        return true;\n      }\n      return false;\n    },\n    /**\n         * set zIndex relative to siblings\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Integer} zIndex\n         * @returns {Konva.Node}\n         */\n    setZIndex: function(zIndex) {\n      if (!this.parent) {\n        Konva.Util.warn('Node has no parent. zIndex parameter is ignored.');\n        return false;\n      }\n      var index = this.index;\n      this.parent.children.splice(index, 1);\n      this.parent.children.splice(zIndex, 0, this);\n      this.parent._setChildrenIndices();\n      return this;\n    },\n    /**\n         * get absolute opacity\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Number}\n         */\n    getAbsoluteOpacity: function() {\n      return this._getCache(ABSOLUTE_OPACITY, this._getAbsoluteOpacity);\n    },\n    _getAbsoluteOpacity: function() {\n      var absOpacity = this.getOpacity();\n      var parent = this.getParent();\n      if (parent && !parent._isUnderCache) {\n        absOpacity *= this.getParent().getAbsoluteOpacity();\n      }\n      return absOpacity;\n    },\n    /**\n         * move node to another container\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Container} newContainer\n         * @returns {Konva.Node}\n         * @example\n         * // move node from current layer into layer2\n         * node.moveTo(layer2);\n         */\n    moveTo: function(newContainer) {\n      // do nothing if new container is already parent\n      if (this.getParent() !== newContainer) {\n        // this.remove my be overrided by drag and drop\n        // buy we need original\n        (this.__originalRemove || this.remove).call(this);\n        newContainer.add(this);\n      }\n      return this;\n    },\n    /**\n         * convert Node into an object for serialization.  Returns an object.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Object}\n         */\n    toObject: function() {\n      var obj = {},\n        attrs = this.getAttrs(),\n        key,\n        val,\n        getter,\n        defaultValue;\n\n      obj.attrs = {};\n\n      for (key in attrs) {\n        val = attrs[key];\n        getter = this[key];\n        // remove attr value so that we can extract the default value from the getter\n        delete attrs[key];\n        defaultValue = getter ? getter.call(this) : null;\n        // restore attr value\n        attrs[key] = val;\n        if (defaultValue !== val) {\n          obj.attrs[key] = val;\n        }\n      }\n\n      obj.className = this.getClassName();\n      return Konva.Util._prepareToStringify(obj);\n    },\n    /**\n         * convert Node into a JSON string.  Returns a JSON string.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {String}}\n         */\n    toJSON: function() {\n      return JSON.stringify(this.toObject());\n    },\n    /**\n         * get parent container\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Node}\n         */\n    getParent: function() {\n      return this.parent;\n    },\n    /**\n         * get all ancestros (parent then parent of the parent, etc) of the node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} [selector] selector for search\n         * @param {Boolean} [includeSelf] show we think that node is ancestro itself?\n         * @param {Konva.Node} [stopNode] optional node where we need to stop searching (one of ancestors)\n         * @returns {Array} [ancestors]\n         * @example\n         * // get one of the parent group\n         * var parentGroups = node.findAncestors('Group');\n         */\n    findAncestors: function(selector, includeSelf, stopNode) {\n      var res = [];\n\n      if (includeSelf && this._isMatch(selector)) {\n        res.push(this);\n      }\n      var ancestor = this.parent;\n      while (ancestor) {\n        if (ancestor === stopNode) {\n          return res;\n        }\n        if (ancestor._isMatch(selector)) {\n          res.push(ancestor);\n        }\n        ancestor = ancestor.parent;\n      }\n      return res;\n    },\n    /**\n         * get ancestor (parent or parent of the parent, etc) of the node that match passed selector\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} [selector] selector for search\n         * @param {Boolean} [includeSelf] show we think that node is ancestro itself?\n         * @param {Konva.Node} [stopNode] optional node where we need to stop searching (one of ancestors)\n         * @returns {Konva.Node} ancestor\n         * @example\n         * // get one of the parent group\n         * var group = node.findAncestors('.mygroup');\n         */\n    findAncestor: function(selector, includeSelf, stopNode) {\n      return this.findAncestors(selector, includeSelf, stopNode)[0];\n    },\n    // is current node match passed selector?\n    _isMatch: function(selector) {\n      if (!selector) {\n        return false;\n      }\n      var selectorArr = selector.replace(/ /g, '').split(','),\n        len = selectorArr.length,\n        n,\n        sel;\n\n      for (n = 0; n < len; n++) {\n        sel = selectorArr[n];\n        if (!Konva.Util.isValidSelector(sel)) {\n          Konva.Util.warn(\n            'Selector \"' +\n              sel +\n              '\" is invalid. Allowed selectors examples are \"#foo\", \".bar\" or \"Group\".'\n          );\n          Konva.Util.warn(\n            'If you have a custom shape with such className, please change it to start with upper letter like \"Triangle\".'\n          );\n          Konva.Util.warn('Konva is awesome, right?');\n        }\n        // id selector\n        if (sel.charAt(0) === '#') {\n          if (this.id() === sel.slice(1)) {\n            return true;\n          }\n        } else if (sel.charAt(0) === '.') {\n          // name selector\n          if (this.hasName(sel.slice(1))) {\n            return true;\n          }\n        } else if (this._get(sel).length !== 0) {\n          return true;\n        }\n      }\n      return false;\n    },\n    /**\n         * get layer ancestor\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Layer}\n         */\n    getLayer: function() {\n      var parent = this.getParent();\n      return parent ? parent.getLayer() : null;\n    },\n    /**\n         * get stage ancestor\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Stage}\n         */\n    getStage: function() {\n      return this._getCache(STAGE, this._getStage);\n    },\n    _getStage: function() {\n      var parent = this.getParent();\n      if (parent) {\n        return parent.getStage();\n      } else {\n        return undefined;\n      }\n    },\n    /**\n         * fire event\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} eventType event type.  can be a regular event, like click, mouseover, or mouseout, or it can be a custom event, like myCustomEvent\n         * @param {Event} [evt] event object\n         * @param {Boolean} [bubble] setting the value to false, or leaving it undefined, will result in the event\n         *  not bubbling.  Setting the value to true will result in the event bubbling.\n         * @returns {Konva.Node}\n         * @example\n         * // manually fire click event\n         * node.fire('click');\n         *\n         * // fire custom event\n         * node.fire('foo');\n         *\n         * // fire custom event with custom event object\n         * node.fire('foo', {\n         *   bar: 10\n         * });\n         *\n         * // fire click event that bubbles\n         * node.fire('click', null, true);\n         */\n    fire: function(eventType, evt, bubble) {\n      evt = evt || {};\n      evt.target = evt.target || this;\n      // bubble\n      if (bubble) {\n        this._fireAndBubble(eventType, evt);\n      } else {\n        // no bubble\n        this._fire(eventType, evt);\n      }\n      return this;\n    },\n    /**\n         * get absolute transform of the node which takes into\n         *  account its ancestor transforms\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Transform}\n         */\n    getAbsoluteTransform: function(top) {\n      // if using an argument, we can't cache the result.\n      if (top) {\n        return this._getAbsoluteTransform(top);\n      } else {\n        // if no argument, we can cache the result\n        return this._getCache(ABSOLUTE_TRANSFORM, this._getAbsoluteTransform);\n      }\n    },\n    _getAbsoluteTransform: function(top) {\n      var at = new Konva.Transform(),\n        transformsEnabled,\n        trans;\n\n      // start with stage and traverse downwards to self\n      this._eachAncestorReverse(function(node) {\n        transformsEnabled = node.transformsEnabled();\n        trans = node.getTransform();\n\n        if (transformsEnabled === 'all') {\n          at.multiply(trans);\n        } else if (transformsEnabled === 'position') {\n          at.translate(node.x(), node.y());\n        }\n      }, top);\n      return at;\n    },\n    /**\n         * get absolute scale of the node which takes into\n         *  account its ancestor scales\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Transform}\n         */\n    getAbsoluteScale: function(top) {\n      // if using an argument, we can't cache the result.\n      if (top) {\n        return this._getAbsoluteScale(top);\n      } else {\n        // if no argument, we can cache the result\n        return this._getCache(ABSOLUTE_SCALE, this._getAbsoluteScale);\n      }\n    },\n    _getAbsoluteScale: function(top) {\n      // this is special logic for caching with some shapes with shadow\n      var parent = this;\n      while (parent) {\n        if (parent._isUnderCache) {\n          top = parent;\n        }\n        parent = parent.getParent();\n      }\n\n      var scaleX = 1,\n        scaleY = 1;\n\n      // start with stage and traverse downwards to self\n      this._eachAncestorReverse(function(node) {\n        scaleX *= node.scaleX();\n        scaleY *= node.scaleY();\n      }, top);\n      return {\n        x: scaleX,\n        y: scaleY\n      };\n    },\n    /**\n         * get transform of the node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Transform}\n         */\n    getTransform: function() {\n      return this._getCache(TRANSFORM, this._getTransform);\n    },\n    _getTransform: function() {\n      var m = new Konva.Transform(),\n        x = this.getX(),\n        y = this.getY(),\n        rotation = Konva.getAngle(this.getRotation()),\n        scaleX = this.getScaleX(),\n        scaleY = this.getScaleY(),\n        skewX = this.getSkewX(),\n        skewY = this.getSkewY(),\n        offsetX = this.getOffsetX(),\n        offsetY = this.getOffsetY();\n\n      if (x !== 0 || y !== 0) {\n        m.translate(x, y);\n      }\n      if (rotation !== 0) {\n        m.rotate(rotation);\n      }\n      if (skewX !== 0 || skewY !== 0) {\n        m.skew(skewX, skewY);\n      }\n      if (scaleX !== 1 || scaleY !== 1) {\n        m.scale(scaleX, scaleY);\n      }\n      if (offsetX !== 0 || offsetY !== 0) {\n        m.translate(-1 * offsetX, -1 * offsetY);\n      }\n\n      return m;\n    },\n    /**\n         * clone node.  Returns a new Node instance with identical attributes.  You can also override\n         *  the node properties with an object literal, enabling you to use an existing node as a template\n         *  for another node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} obj override attrs\n         * @returns {Konva.Node}\n         * @example\n         * // simple clone\n         * var clone = node.clone();\n         *\n         * // clone a node and override the x position\n         * var clone = rect.clone({\n         *   x: 5\n         * });\n         */\n    clone: function(obj) {\n      // instantiate new node\n      var attrs = Konva.Util.cloneObject(this.attrs),\n        key,\n        allListeners,\n        len,\n        n,\n        listener;\n      // filter black attrs\n      for (var i in CLONE_BLACK_LIST) {\n        var blockAttr = CLONE_BLACK_LIST[i];\n        delete attrs[blockAttr];\n      }\n      // apply attr overrides\n      for (key in obj) {\n        attrs[key] = obj[key];\n      }\n\n      var node = new this.constructor(attrs);\n      // copy over listeners\n      for (key in this.eventListeners) {\n        allListeners = this.eventListeners[key];\n        len = allListeners.length;\n        for (n = 0; n < len; n++) {\n          listener = allListeners[n];\n          /*\n                     * don't include konva namespaced listeners because\n                     *  these are generated by the constructors\n                     */\n          if (listener.name.indexOf(KONVA) < 0) {\n            // if listeners array doesn't exist, then create it\n            if (!node.eventListeners[key]) {\n              node.eventListeners[key] = [];\n            }\n            node.eventListeners[key].push(listener);\n          }\n        }\n      }\n      return node;\n    },\n    _toKonvaCanvas: function(config) {\n      config = config || {};\n\n      var stage = this.getStage(),\n        x = config.x || 0,\n        y = config.y || 0,\n        pixelRatio = config.pixelRatio || 1,\n        canvas = new Konva.SceneCanvas({\n          width:\n            config.width || this.getWidth() || (stage ? stage.getWidth() : 0),\n          height:\n            config.height ||\n            this.getHeight() ||\n            (stage ? stage.getHeight() : 0),\n          pixelRatio: pixelRatio\n        }),\n        context = canvas.getContext();\n\n      context.save();\n\n      if (x || y) {\n        context.translate(-1 * x, -1 * y);\n      }\n\n      this.drawScene(canvas);\n      context.restore();\n\n      return canvas;\n    },\n    /**\n         * converts node into an canvas element.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} config\n         * @param {Function} config.callback function executed when the composite has completed\n         * @param {Number} [config.x] x position of canvas section\n         * @param {Number} [config.y] y position of canvas section\n         * @param {Number} [config.width] width of canvas section\n         * @param {Number} [config.height] height of canvas section\n         * @paremt {Number} [config.pixelRatio] pixelRatio of ouput image.  Default is 1.\n         * @example\n         * var canvas = node.toCanvas();\n         */\n    toCanvas: function(config) {\n      return this._toKonvaCanvas(config)._canvas;\n    },\n    /**\n         * Creates a composite data URL. If MIME type is not\n         * specified, then \"image/png\" will result. For \"image/jpeg\", specify a quality\n         * level as quality (range 0.0 - 1.0)\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} config\n         * @param {String} [config.mimeType] can be \"image/png\" or \"image/jpeg\".\n         *  \"image/png\" is the default\n         * @param {Number} [config.x] x position of canvas section\n         * @param {Number} [config.y] y position of canvas section\n         * @param {Number} [config.width] width of canvas section\n         * @param {Number} [config.height] height of canvas section\n         * @param {Number} [config.quality] jpeg quality.  If using an \"image/jpeg\" mimeType,\n         *  you can specify the quality from 0 to 1, where 0 is very poor quality and 1\n         *  is very high quality\n         * @paremt {Number} [config.pixelRatio] pixelRatio of ouput image url. Default is 1\n         * @returns {String}\n         */\n    toDataURL: function(config) {\n      config = config || {};\n      var mimeType = config.mimeType || null,\n        quality = config.quality || null;\n      return this._toKonvaCanvas(config).toDataURL(mimeType, quality);\n    },\n    /**\n         * converts node into an image.  Since the toImage\n         *  method is asynchronous, a callback is required.  toImage is most commonly used\n         *  to cache complex drawings as an image so that they don't have to constantly be redrawn\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {Object} config\n         * @param {Function} config.callback function executed when the composite has completed\n         * @param {String} [config.mimeType] can be \"image/png\" or \"image/jpeg\".\n         *  \"image/png\" is the default\n         * @param {Number} [config.x] x position of canvas section\n         * @param {Number} [config.y] y position of canvas section\n         * @param {Number} [config.width] width of canvas section\n         * @param {Number} [config.height] height of canvas section\n         * @param {Number} [config.quality] jpeg quality.  If using an \"image/jpeg\" mimeType,\n         *  you can specify the quality from 0 to 1, where 0 is very poor quality and 1\n         *  is very high quality\n         * @paremt {Number} [config.pixelRatio] pixelRatio of ouput image.  Default is 1.\n         * @example\n         * var image = node.toImage({\n         *   callback: function(img) {\n         *     // do stuff with img\n         *   }\n         * });\n         */\n    toImage: function(config) {\n      if (!config || !config.callback) {\n        throw 'callback required for toImage method config argument';\n      }\n      Konva.Util._getImage(this.toDataURL(config), function(img) {\n        config.callback(img);\n      });\n    },\n    setSize: function(size) {\n      this.setWidth(size.width);\n      this.setHeight(size.height);\n      return this;\n    },\n    getSize: function() {\n      return {\n        width: this.getWidth(),\n        height: this.getHeight()\n      };\n    },\n    getWidth: function() {\n      return this.attrs.width || 0;\n    },\n    getHeight: function() {\n      return this.attrs.height || 0;\n    },\n    /**\n         * get class name, which may return Stage, Layer, Group, or shape class names like Rect, Circle, Text, etc.\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {String}\n         */\n    getClassName: function() {\n      return this.className || this.nodeType;\n    },\n    /**\n         * get the node type, which may return Stage, Layer, Group, or Node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {String}\n         */\n    getType: function() {\n      return this.nodeType;\n    },\n    getDragDistance: function() {\n      // compare with undefined because we need to track 0 value\n      if (this.attrs.dragDistance !== undefined) {\n        return this.attrs.dragDistance;\n      } else if (this.parent) {\n        return this.parent.getDragDistance();\n      } else {\n        return Konva.dragDistance;\n      }\n    },\n    _get: function(selector) {\n      return this.className === selector || this.nodeType === selector\n        ? [this]\n        : [];\n    },\n    _off: function(type, name) {\n      var evtListeners = this.eventListeners[type],\n        i,\n        evtName;\n\n      for (i = 0; i < evtListeners.length; i++) {\n        evtName = evtListeners[i].name;\n        // the following two conditions must be true in order to remove a handler:\n        // 1) the current event name cannot be konva unless the event name is konva\n        //    this enables developers to force remove a konva specific listener for whatever reason\n        // 2) an event name is not specified, or if one is specified, it matches the current event name\n        if (\n          (evtName !== 'konva' || name === 'konva') &&\n          (!name || evtName === name)\n        ) {\n          evtListeners.splice(i, 1);\n          if (evtListeners.length === 0) {\n            delete this.eventListeners[type];\n            break;\n          }\n          i--;\n        }\n      }\n    },\n    _fireChangeEvent: function(attr, oldVal, newVal) {\n      this._fire(attr + CHANGE, {\n        oldVal: oldVal,\n        newVal: newVal\n      });\n    },\n    setId: function(id) {\n      var oldId = this.getId();\n\n      Konva._removeId(oldId);\n      Konva._addId(this, id);\n      this._setAttr(ID, id);\n      return this;\n    },\n    setName: function(name) {\n      var oldNames = (this.getName() || '').split(/\\s/g);\n      var newNames = (name || '').split(/\\s/g);\n      var subname, i;\n      // remove all subnames\n      for (i = 0; i < oldNames.length; i++) {\n        subname = oldNames[i];\n        if (newNames.indexOf(subname) === -1 && subname) {\n          Konva._removeName(subname, this._id);\n        }\n      }\n\n      // add new names\n      for (i = 0; i < newNames.length; i++) {\n        subname = newNames[i];\n        if (oldNames.indexOf(subname) === -1 && subname) {\n          Konva._addName(this, subname);\n        }\n      }\n\n      this._setAttr(NAME, name);\n      return this;\n    },\n    // naming methods\n    /**\n         * add name to node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} name\n         * @returns {Konva.Node}\n         * @example\n         * node.name('red');\n         * node.addName('selected');\n         * node.name(); // return 'red selected'\n         */\n    addName: function(name) {\n      if (!this.hasName(name)) {\n        var oldName = this.name();\n        var newName = oldName ? oldName + ' ' + name : name;\n        this.setName(newName);\n      }\n      return this;\n    },\n    /**\n         * check is node has name\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} name\n         * @returns {Boolean}\n         * @example\n         * node.name('red');\n         * node.hasName('red');   // return true\n         * node.hasName('selected'); // return false\n         */\n    hasName: function(name) {\n      var names = (this.name() || '').split(/\\s/g);\n      return names.indexOf(name) !== -1;\n    },\n    /**\n         * remove name from node\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} name\n         * @returns {Konva.Node}\n         * @example\n         * node.name('red selected');\n         * node.removeName('selected');\n         * node.hasName('selected'); // return false\n         * node.name(); // return 'red'\n         */\n    removeName: function(name) {\n      var names = (this.name() || '').split(/\\s/g);\n      var index = names.indexOf(name);\n      if (index !== -1) {\n        names.splice(index, 1);\n        this.setName(names.join(' '));\n      }\n      return this;\n    },\n    /**\n         * set attr\n         * @method\n         * @memberof Konva.Node.prototype\n         * @param {String} attr\n         * @param {*} val\n         * @returns {Konva.Node}\n         * @example\n         * node.setAttr('x', 5);\n         */\n    setAttr: function(attr, val) {\n      var method = SET + Konva.Util._capitalize(attr),\n        func = this[method];\n\n      if (Konva.Util._isFunction(func)) {\n        func.call(this, val);\n      } else {\n        // otherwise set directly\n        this._setAttr(attr, val);\n      }\n      return this;\n    },\n    _setAttr: function(key, val) {\n      var oldVal;\n      oldVal = this.attrs[key];\n      if (oldVal === val) {\n        return;\n      }\n      if (val === undefined || val === null) {\n        delete this.attrs[key];\n      } else {\n        this.attrs[key] = val;\n      }\n      this._fireChangeEvent(key, oldVal, val);\n    },\n    _setComponentAttr: function(key, component, val) {\n      var oldVal;\n      if (val !== undefined) {\n        oldVal = this.attrs[key];\n\n        if (!oldVal) {\n          // set value to default value using getAttr\n          this.attrs[key] = this.getAttr(key);\n        }\n\n        this.attrs[key][component] = val;\n        this._fireChangeEvent(key, oldVal, val);\n      }\n    },\n    _fireAndBubble: function(eventType, evt, compareShape) {\n      var okayToRun = true;\n\n      if (evt && this.nodeType === SHAPE) {\n        evt.target = this;\n      }\n\n      if (\n        eventType === MOUSEENTER &&\n        compareShape &&\n        (this._id === compareShape._id ||\n          (this.isAncestorOf && this.isAncestorOf(compareShape)))\n      ) {\n        okayToRun = false;\n      } else if (\n        eventType === MOUSELEAVE &&\n        compareShape &&\n        (this._id === compareShape._id ||\n          (this.isAncestorOf && this.isAncestorOf(compareShape)))\n      ) {\n        okayToRun = false;\n      }\n      if (okayToRun) {\n        this._fire(eventType, evt);\n\n        // simulate event bubbling\n        var stopBubble =\n          (eventType === MOUSEENTER || eventType === MOUSELEAVE) &&\n          (compareShape &&\n            compareShape.isAncestorOf &&\n            compareShape.isAncestorOf(this) &&\n            !compareShape.isAncestorOf(this.parent));\n        if (\n          ((evt && !evt.cancelBubble) || !evt) &&\n          this.parent &&\n          this.parent.isListening() &&\n          !stopBubble\n        ) {\n          if (compareShape && compareShape.parent) {\n            this._fireAndBubble.call(\n              this.parent,\n              eventType,\n              evt,\n              compareShape.parent\n            );\n          } else {\n            this._fireAndBubble.call(this.parent, eventType, evt);\n          }\n        }\n      }\n    },\n    _fire: function(eventType, evt) {\n      var events = this.eventListeners[eventType],\n        i;\n\n      evt = evt || {};\n      evt.currentTarget = this;\n      evt.type = eventType;\n\n      if (events) {\n        for (i = 0; i < events.length; i++) {\n          events[i].handler.call(this, evt);\n        }\n      }\n    },\n    /**\n         * draw both scene and hit graphs.  If the node being drawn is the stage, all of the layers will be cleared and redrawn\n         * @method\n         * @memberof Konva.Node.prototype\n         * @returns {Konva.Node}\n         */\n    draw: function() {\n      this.drawScene();\n      this.drawHit();\n      return this;\n    }\n  });\n\n  /**\n     * create node with JSON string or an Object.  De-serializtion does not generate custom\n     *  shape drawing functions, images, or event handlers (this would make the\n     *  serialized object huge).  If your app uses custom shapes, images, and\n     *  event handlers (it probably does), then you need to select the appropriate\n     *  shapes after loading the stage and set these properties via on(), setDrawFunc(),\n     *  and setImage() methods\n     * @method\n     * @memberof Konva.Node\n     * @param {String|Object} json string or object\n     * @param {Element} [container] optional container dom element used only if you're\n     *  creating a stage node\n     */\n  Konva.Node.create = function(data, container) {\n    if (Konva.Util._isString(data)) {\n      data = JSON.parse(data);\n    }\n    return this._createNode(data, container);\n  };\n  Konva.Node._createNode = function(obj, container) {\n    var className = Konva.Node.prototype.getClassName.call(obj),\n      children = obj.children,\n      no,\n      len,\n      n;\n\n    // if container was passed in, add it to attrs\n    if (container) {\n      obj.attrs.container = container;\n    }\n\n    no = new Konva[className](obj.attrs);\n    if (children) {\n      len = children.length;\n      for (n = 0; n < len; n++) {\n        no.add(this._createNode(children[n]));\n      }\n    }\n\n    return no;\n  };\n\n  // =========================== add getters setters ===========================\n\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'position');\n  /**\n     * get/set node position relative to parent\n     * @name position\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Object} pos\n     * @param {Number} pos.x\n     * @param {Number} pos.y\n     * @returns {Object}\n     * @example\n     * // get position\n     * var position = node.position();\n     *\n     * // set position\n     * node.position({\n     *   x: 5\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'x', 0);\n\n  /**\n     * get/set x position\n     * @name x\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} x\n     * @returns {Object}\n     * @example\n     * // get x\n     * var x = node.x();\n     *\n     * // set x\n     * node.x(5);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'y', 0);\n\n  /**\n     * get/set y position\n     * @name y\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} y\n     * @returns {Integer}\n     * @example\n     * // get y\n     * var y = node.y();\n     *\n     * // set y\n     * node.y(5);\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'globalCompositeOperation',\n    'source-over'\n  );\n\n  /**\n     * get/set globalCompositeOperation of a shape\n     * @name globalCompositeOperation\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} blur\n     * @returns {Number}\n     * @example\n     * // get shadow blur\n     * var globalCompositeOperation = shape.globalCompositeOperation();\n     *\n     * // set shadow blur\n     * shape.globalCompositeOperation('source-in');\n     */\n  Konva.Factory.addGetterSetter(Konva.Node, 'opacity', 1);\n\n  /**\n     * get/set opacity.  Opacity values range from 0 to 1.\n     *  A node with an opacity of 0 is fully transparent, and a node\n     *  with an opacity of 1 is fully opaque\n     * @name opacity\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Object} opacity\n     * @returns {Number}\n     * @example\n     * // get opacity\n     * var opacity = node.opacity();\n     *\n     * // set opacity\n     * node.opacity(0.5);\n     */\n\n  Konva.Factory.addGetter(Konva.Node, 'name');\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'name');\n\n  /**\n     * get/set name\n     * @name name\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {String} name\n     * @returns {String}\n     * @example\n     * // get name\n     * var name = node.name();\n     *\n     * // set name\n     * node.name('foo');\n     *\n     * // also node may have multiple names (as css classes)\n     * node.name('foo bar');\n     */\n\n  Konva.Factory.addGetter(Konva.Node, 'id');\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'id');\n\n  /**\n     * get/set id. Id is global for whole page.\n     * @name id\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {String} id\n     * @returns {String}\n     * @example\n     * // get id\n     * var name = node.id();\n     *\n     * // set id\n     * node.id('foo');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'rotation', 0);\n\n  /**\n     * get/set rotation in degrees\n     * @name rotation\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} rotation\n     * @returns {Number}\n     * @example\n     * // get rotation in degrees\n     * var rotation = node.rotation();\n     *\n     * // set rotation in degrees\n     * node.rotation(45);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Node, 'scale', ['x', 'y']);\n\n  /**\n     * get/set scale\n     * @name scale\n     * @param {Object} scale\n     * @param {Number} scale.x\n     * @param {Number} scale.y\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Object}\n     * @example\n     * // get scale\n     * var scale = node.scale();\n     *\n     * // set scale\n     * shape.scale({\n     *   x: 2\n     *   y: 3\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'scaleX', 1);\n\n  /**\n     * get/set scale x\n     * @name scaleX\n     * @param {Number} x\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Number}\n     * @example\n     * // get scale x\n     * var scaleX = node.scaleX();\n     *\n     * // set scale x\n     * node.scaleX(2);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'scaleY', 1);\n\n  /**\n     * get/set scale y\n     * @name scaleY\n     * @param {Number} y\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Number}\n     * @example\n     * // get scale y\n     * var scaleY = node.scaleY();\n     *\n     * // set scale y\n     * node.scaleY(2);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Node, 'skew', ['x', 'y']);\n\n  /**\n     * get/set skew\n     * @name skew\n     * @param {Object} skew\n     * @param {Number} skew.x\n     * @param {Number} skew.y\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Object}\n     * @example\n     * // get skew\n     * var skew = node.skew();\n     *\n     * // set skew\n     * node.skew({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'skewX', 0);\n\n  /**\n     * get/set skew x\n     * @name skewX\n     * @param {Number} x\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Number}\n     * @example\n     * // get skew x\n     * var skewX = node.skewX();\n     *\n     * // set skew x\n     * node.skewX(3);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'skewY', 0);\n\n  /**\n     * get/set skew y\n     * @name skewY\n     * @param {Number} y\n     * @method\n     * @memberof Konva.Node.prototype\n     * @returns {Number}\n     * @example\n     * // get skew y\n     * var skewY = node.skewY();\n     *\n     * // set skew y\n     * node.skewY(3);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Node, 'offset', ['x', 'y']);\n\n  /**\n     * get/set offset.  Offsets the default position and rotation point\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Object} offset\n     * @param {Number} offset.x\n     * @param {Number} offset.y\n     * @returns {Object}\n     * @example\n     * // get offset\n     * var offset = node.offset();\n     *\n     * // set offset\n     * node.offset({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'offsetX', 0);\n\n  /**\n     * get/set offset x\n     * @name offsetX\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get offset x\n     * var offsetX = node.offsetX();\n     *\n     * // set offset x\n     * node.offsetX(3);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'offsetY', 0);\n\n  /**\n     * get/set offset y\n     * @name offsetY\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get offset y\n     * var offsetY = node.offsetY();\n     *\n     * // set offset y\n     * node.offsetY(3);\n     */\n\n  Konva.Factory.addSetter(Konva.Node, 'dragDistance');\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'dragDistance');\n\n  /**\n     * get/set drag distance\n     * @name dragDistance\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} distance\n     * @returns {Number}\n     * @example\n     * // get drag distance\n     * var dragDistance = node.dragDistance();\n     *\n     * // set distance\n     * // node starts dragging only if pointer moved more then 3 pixels\n     * node.dragDistance(3);\n     * // or set globally\n     * Konva.dragDistance = 3;\n     */\n\n  Konva.Factory.addSetter(Konva.Node, 'width', 0);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'width');\n  /**\n     * get/set width\n     * @name width\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} width\n     * @returns {Number}\n     * @example\n     * // get width\n     * var width = node.width();\n     *\n     * // set width\n     * node.width(100);\n     */\n\n  Konva.Factory.addSetter(Konva.Node, 'height', 0);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'height');\n  /**\n     * get/set height\n     * @name height\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Number} height\n     * @returns {Number}\n     * @example\n     * // get height\n     * var height = node.height();\n     *\n     * // set height\n     * node.height(100);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'listening', 'inherit');\n  /**\n     * get/set listenig attr.  If you need to determine if a node is listening or not\n     *   by taking into account its parents, use the isListening() method\n     * @name listening\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Boolean|String} listening Can be \"inherit\", true, or false.  The default is \"inherit\".\n     * @returns {Boolean|String}\n     * @example\n     * // get listening attr\n     * var listening = node.listening();\n     *\n     * // stop listening for events\n     * node.listening(false);\n     *\n     * // listen for events\n     * node.listening(true);\n     *\n     * // listen to events according to the parent\n     * node.listening('inherit');\n     */\n\n  /**\n      * get/set preventDefault\n      * By default all shapes will prevent default behaviour\n      * of a browser on a pointer move or tap.\n      * that will prevent native scrolling when you are trying to drag&drop a node\n      * but sometimes you may need to enable default actions\n      * in that case you can set the property to false\n      * @name preventDefault\n      * @method\n      * @memberof Konva.Node.prototype\n      * @param {Number} preventDefault\n      * @returns {Number}\n      * @example\n      * // get preventDefault\n      * var shouldPrevent = shape.preventDefault();\n      *\n      * // set preventDefault\n      * shape.preventDefault(false);\n      */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'preventDefault', true);\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'filters', undefined, function(\n    val\n  ) {\n    this._filterUpToDate = false;\n    return val;\n  });\n  /**\n     * get/set filters.  Filters are applied to cached canvases\n     * @name filters\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Array} filters array of filters\n     * @returns {Array}\n     * @example\n     * // get filters\n     * var filters = node.filters();\n     *\n     * // set a single filter\n     * node.cache();\n     * node.filters([Konva.Filters.Blur]);\n     *\n     * // set multiple filters\n     * node.cache();\n     * node.filters([\n     *   Konva.Filters.Blur,\n     *   Konva.Filters.Sepia,\n     *   Konva.Filters.Invert\n     * ]);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'visible', 'inherit');\n  /**\n     * get/set visible attr.  Can be \"inherit\", true, or false.  The default is \"inherit\".\n     *   If you need to determine if a node is visible or not\n     *   by taking into account its parents, use the isVisible() method\n     * @name visible\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Boolean|String} visible\n     * @returns {Boolean|String}\n     * @example\n     * // get visible attr\n     * var visible = node.visible();\n     *\n     * // make invisible\n     * node.visible(false);\n     *\n     * // make visible\n     * node.visible(true);\n     *\n     * // make visible according to the parent\n     * node.visible('inherit');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'transformsEnabled', 'all');\n\n  /**\n     * get/set transforms that are enabled.  Can be \"all\", \"none\", or \"position\".  The default\n     *  is \"all\"\n     * @name transformsEnabled\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {String} enabled\n     * @returns {String}\n     * @example\n     * // enable position transform only to improve draw performance\n     * node.transformsEnabled('position');\n     *\n     * // enable all transforms\n     * node.transformsEnabled('all');\n     */\n\n  /**\n     * get/set node size\n     * @name size\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Object} size\n     * @param {Number} size.width\n     * @param {Number} size.height\n     * @returns {Object}\n     * @example\n     * // get node size\n     * var size = node.size();\n     * var x = size.x;\n     * var y = size.y;\n     *\n     * // set size\n     * node.size({\n     *   width: 100,\n     *   height: 200\n     * });\n     */\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'size');\n\n  Konva.Factory.backCompat(Konva.Node, {\n    rotateDeg: 'rotate',\n    setRotationDeg: 'setRotation',\n    getRotationDeg: 'getRotation'\n  });\n\n  Konva.Collection.mapMethods(Konva.Node);\n})(Konva);\n\n(function() {\r\n  'use strict';\r\n  /**\r\n    * Grayscale Filter\r\n    * @function\r\n    * @memberof Konva.Filters\r\n    * @param {Object} imageData\r\n    * @example\r\n    * node.cache();\r\n    * node.filters([Konva.Filters.Grayscale]);\r\n    */\r\n  Konva.Filters.Grayscale = function(imageData) {\r\n    var data = imageData.data, len = data.length, i, brightness;\r\n\r\n    for (i = 0; i < len; i += 4) {\r\n      brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2];\r\n      // red\r\n      data[i] = brightness;\r\n      // green\r\n      data[i + 1] = brightness;\r\n      // blue\r\n      data[i + 2] = brightness;\r\n    }\r\n  };\r\n})();\r\n\n(function(Konva) {\n  'use strict';\n  /**\n     * Brighten Filter.\n     * @function\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Brighten]);\n     * node.brightness(0.8);\n     */\n  Konva.Filters.Brighten = function(imageData) {\n    var brightness = this.brightness() * 255,\n      data = imageData.data,\n      len = data.length,\n      i;\n\n    for (i = 0; i < len; i += 4) {\n      // red\n      data[i] += brightness;\n      // green\n      data[i + 1] += brightness;\n      // blue\n      data[i + 2] += brightness;\n    }\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'brightness',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set filter brightness.  The brightness is a number between -1 and 1.&nbsp; Positive values\n    *  brighten the pixels and negative values darken them. Use with {@link Konva.Filters.Brighten} filter.\n    * @name brightness\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} brightness value between -1 and 1\n    * @returns {Number}\n    */\n})(Konva);\n\n(function() {\r\n  'use strict';\r\n  /**\r\n    * Invert Filter\r\n    * @function\r\n    * @memberof Konva.Filters\r\n    * @param {Object} imageData\r\n    * @example\r\n    * node.cache();\r\n    * node.filters([Konva.Filters.Invert]);\r\n    */\r\n  Konva.Filters.Invert = function(imageData) {\r\n    var data = imageData.data, len = data.length, i;\r\n\r\n    for (i = 0; i < len; i += 4) {\r\n      // red\r\n      data[i] = 255 - data[i];\r\n      // green\r\n      data[i + 1] = 255 - data[i + 1];\r\n      // blue\r\n      data[i + 2] = 255 - data[i + 2];\r\n    }\r\n  };\r\n})();\r\n\n/*\n the Gauss filter\n master repo: https://github.com/pavelpower/kineticjsGaussFilter\n*/\n(function(Konva) {\n  'use strict';\n  /*\n\n     StackBlur - a fast almost Gaussian Blur For Canvas\n\n     Version:   0.5\n     Author:    Mario Klingemann\n     Contact:   mario@quasimondo.com\n     Website:   http://www.quasimondo.com/StackBlurForCanvas\n     Twitter:   @quasimondo\n\n     In case you find this class useful - especially in commercial projects -\n     I am not totally unhappy for a small donation to my PayPal account\n     mario@quasimondo.de\n\n     Or support me on flattr:\n     https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript\n\n     Copyright (c) 2010 Mario Klingemann\n\n     Permission is hereby granted, free of charge, to any person\n     obtaining a copy of this software and associated documentation\n     files (the \"Software\"), to deal in the Software without\n     restriction, including without limitation the rights to use,\n     copy, modify, merge, publish, distribute, sublicense, and/or sell\n     copies of the Software, and to permit persons to whom the\n     Software is furnished to do so, subject to the following\n     conditions:\n\n     The above copyright notice and this permission notice shall be\n     included in all copies or substantial portions of the Software.\n\n     THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n     OTHER DEALINGS IN THE SOFTWARE.\n     */\n\n  function BlurStack() {\n    this.r = 0;\n    this.g = 0;\n    this.b = 0;\n    this.a = 0;\n    this.next = null;\n  }\n\n  var mul_table = [\n    512,\n    512,\n    456,\n    512,\n    328,\n    456,\n    335,\n    512,\n    405,\n    328,\n    271,\n    456,\n    388,\n    335,\n    292,\n    512,\n    454,\n    405,\n    364,\n    328,\n    298,\n    271,\n    496,\n    456,\n    420,\n    388,\n    360,\n    335,\n    312,\n    292,\n    273,\n    512,\n    482,\n    454,\n    428,\n    405,\n    383,\n    364,\n    345,\n    328,\n    312,\n    298,\n    284,\n    271,\n    259,\n    496,\n    475,\n    456,\n    437,\n    420,\n    404,\n    388,\n    374,\n    360,\n    347,\n    335,\n    323,\n    312,\n    302,\n    292,\n    282,\n    273,\n    265,\n    512,\n    497,\n    482,\n    468,\n    454,\n    441,\n    428,\n    417,\n    405,\n    394,\n    383,\n    373,\n    364,\n    354,\n    345,\n    337,\n    328,\n    320,\n    312,\n    305,\n    298,\n    291,\n    284,\n    278,\n    271,\n    265,\n    259,\n    507,\n    496,\n    485,\n    475,\n    465,\n    456,\n    446,\n    437,\n    428,\n    420,\n    412,\n    404,\n    396,\n    388,\n    381,\n    374,\n    367,\n    360,\n    354,\n    347,\n    341,\n    335,\n    329,\n    323,\n    318,\n    312,\n    307,\n    302,\n    297,\n    292,\n    287,\n    282,\n    278,\n    273,\n    269,\n    265,\n    261,\n    512,\n    505,\n    497,\n    489,\n    482,\n    475,\n    468,\n    461,\n    454,\n    447,\n    441,\n    435,\n    428,\n    422,\n    417,\n    411,\n    405,\n    399,\n    394,\n    389,\n    383,\n    378,\n    373,\n    368,\n    364,\n    359,\n    354,\n    350,\n    345,\n    341,\n    337,\n    332,\n    328,\n    324,\n    320,\n    316,\n    312,\n    309,\n    305,\n    301,\n    298,\n    294,\n    291,\n    287,\n    284,\n    281,\n    278,\n    274,\n    271,\n    268,\n    265,\n    262,\n    259,\n    257,\n    507,\n    501,\n    496,\n    491,\n    485,\n    480,\n    475,\n    470,\n    465,\n    460,\n    456,\n    451,\n    446,\n    442,\n    437,\n    433,\n    428,\n    424,\n    420,\n    416,\n    412,\n    408,\n    404,\n    400,\n    396,\n    392,\n    388,\n    385,\n    381,\n    377,\n    374,\n    370,\n    367,\n    363,\n    360,\n    357,\n    354,\n    350,\n    347,\n    344,\n    341,\n    338,\n    335,\n    332,\n    329,\n    326,\n    323,\n    320,\n    318,\n    315,\n    312,\n    310,\n    307,\n    304,\n    302,\n    299,\n    297,\n    294,\n    292,\n    289,\n    287,\n    285,\n    282,\n    280,\n    278,\n    275,\n    273,\n    271,\n    269,\n    267,\n    265,\n    263,\n    261,\n    259\n  ];\n\n  var shg_table = [\n    9,\n    11,\n    12,\n    13,\n    13,\n    14,\n    14,\n    15,\n    15,\n    15,\n    15,\n    16,\n    16,\n    16,\n    16,\n    17,\n    17,\n    17,\n    17,\n    17,\n    17,\n    17,\n    18,\n    18,\n    18,\n    18,\n    18,\n    18,\n    18,\n    18,\n    18,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    19,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    20,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    21,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    22,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    23,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24,\n    24\n  ];\n\n  function filterGaussBlurRGBA(imageData, radius) {\n    var pixels = imageData.data,\n      width = imageData.width,\n      height = imageData.height;\n\n    var x,\n      y,\n      i,\n      p,\n      yp,\n      yi,\n      yw,\n      r_sum,\n      g_sum,\n      b_sum,\n      a_sum,\n      r_out_sum,\n      g_out_sum,\n      b_out_sum,\n      a_out_sum,\n      r_in_sum,\n      g_in_sum,\n      b_in_sum,\n      a_in_sum,\n      pr,\n      pg,\n      pb,\n      pa,\n      rbs;\n\n    var div = radius + radius + 1,\n      widthMinus1 = width - 1,\n      heightMinus1 = height - 1,\n      radiusPlus1 = radius + 1,\n      sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2,\n      stackStart = new BlurStack(),\n      stackEnd = null,\n      stack = stackStart,\n      stackIn = null,\n      stackOut = null,\n      mul_sum = mul_table[radius],\n      shg_sum = shg_table[radius];\n\n    for (i = 1; i < div; i++) {\n      stack = stack.next = new BlurStack();\n      if (i === radiusPlus1) {\n        stackEnd = stack;\n      }\n    }\n\n    stack.next = stackStart;\n\n    yw = yi = 0;\n\n    for (y = 0; y < height; y++) {\n      r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;\n\n      r_out_sum = radiusPlus1 * (pr = pixels[yi]);\n      g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);\n      b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);\n      a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);\n\n      r_sum += sumFactor * pr;\n      g_sum += sumFactor * pg;\n      b_sum += sumFactor * pb;\n      a_sum += sumFactor * pa;\n\n      stack = stackStart;\n\n      for (i = 0; i < radiusPlus1; i++) {\n        stack.r = pr;\n        stack.g = pg;\n        stack.b = pb;\n        stack.a = pa;\n        stack = stack.next;\n      }\n\n      for (i = 1; i < radiusPlus1; i++) {\n        p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);\n        r_sum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i);\n        g_sum += (stack.g = pg = pixels[p + 1]) * rbs;\n        b_sum += (stack.b = pb = pixels[p + 2]) * rbs;\n        a_sum += (stack.a = pa = pixels[p + 3]) * rbs;\n\n        r_in_sum += pr;\n        g_in_sum += pg;\n        b_in_sum += pb;\n        a_in_sum += pa;\n\n        stack = stack.next;\n      }\n\n      stackIn = stackStart;\n      stackOut = stackEnd;\n      for (x = 0; x < width; x++) {\n        pixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;\n        if (pa !== 0) {\n          pa = 255 / pa;\n          pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;\n          pixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;\n          pixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;\n        } else {\n          pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;\n        }\n\n        r_sum -= r_out_sum;\n        g_sum -= g_out_sum;\n        b_sum -= b_out_sum;\n        a_sum -= a_out_sum;\n\n        r_out_sum -= stackIn.r;\n        g_out_sum -= stackIn.g;\n        b_out_sum -= stackIn.b;\n        a_out_sum -= stackIn.a;\n\n        p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;\n\n        r_in_sum += stackIn.r = pixels[p];\n        g_in_sum += stackIn.g = pixels[p + 1];\n        b_in_sum += stackIn.b = pixels[p + 2];\n        a_in_sum += stackIn.a = pixels[p + 3];\n\n        r_sum += r_in_sum;\n        g_sum += g_in_sum;\n        b_sum += b_in_sum;\n        a_sum += a_in_sum;\n\n        stackIn = stackIn.next;\n\n        r_out_sum += pr = stackOut.r;\n        g_out_sum += pg = stackOut.g;\n        b_out_sum += pb = stackOut.b;\n        a_out_sum += pa = stackOut.a;\n\n        r_in_sum -= pr;\n        g_in_sum -= pg;\n        b_in_sum -= pb;\n        a_in_sum -= pa;\n\n        stackOut = stackOut.next;\n\n        yi += 4;\n      }\n      yw += width;\n    }\n\n    for (x = 0; x < width; x++) {\n      g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;\n\n      yi = x << 2;\n      r_out_sum = radiusPlus1 * (pr = pixels[yi]);\n      g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);\n      b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);\n      a_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);\n\n      r_sum += sumFactor * pr;\n      g_sum += sumFactor * pg;\n      b_sum += sumFactor * pb;\n      a_sum += sumFactor * pa;\n\n      stack = stackStart;\n\n      for (i = 0; i < radiusPlus1; i++) {\n        stack.r = pr;\n        stack.g = pg;\n        stack.b = pb;\n        stack.a = pa;\n        stack = stack.next;\n      }\n\n      yp = width;\n\n      for (i = 1; i <= radius; i++) {\n        yi = (yp + x) << 2;\n\n        r_sum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i);\n        g_sum += (stack.g = pg = pixels[yi + 1]) * rbs;\n        b_sum += (stack.b = pb = pixels[yi + 2]) * rbs;\n        a_sum += (stack.a = pa = pixels[yi + 3]) * rbs;\n\n        r_in_sum += pr;\n        g_in_sum += pg;\n        b_in_sum += pb;\n        a_in_sum += pa;\n\n        stack = stack.next;\n\n        if (i < heightMinus1) {\n          yp += width;\n        }\n      }\n\n      yi = x;\n      stackIn = stackStart;\n      stackOut = stackEnd;\n      for (y = 0; y < height; y++) {\n        p = yi << 2;\n        pixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;\n        if (pa > 0) {\n          pa = 255 / pa;\n          pixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;\n          pixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;\n          pixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;\n        } else {\n          pixels[p] = pixels[p + 1] = pixels[p + 2] = 0;\n        }\n\n        r_sum -= r_out_sum;\n        g_sum -= g_out_sum;\n        b_sum -= b_out_sum;\n        a_sum -= a_out_sum;\n\n        r_out_sum -= stackIn.r;\n        g_out_sum -= stackIn.g;\n        b_out_sum -= stackIn.b;\n        a_out_sum -= stackIn.a;\n\n        p =\n          (x +\n            ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) *\n              width) <<\n          2;\n\n        r_sum += r_in_sum += stackIn.r = pixels[p];\n        g_sum += g_in_sum += stackIn.g = pixels[p + 1];\n        b_sum += b_in_sum += stackIn.b = pixels[p + 2];\n        a_sum += a_in_sum += stackIn.a = pixels[p + 3];\n\n        stackIn = stackIn.next;\n\n        r_out_sum += pr = stackOut.r;\n        g_out_sum += pg = stackOut.g;\n        b_out_sum += pb = stackOut.b;\n        a_out_sum += pa = stackOut.a;\n\n        r_in_sum -= pr;\n        g_in_sum -= pg;\n        b_in_sum -= pb;\n        a_in_sum -= pa;\n\n        stackOut = stackOut.next;\n\n        yi += width;\n      }\n    }\n  }\n\n  /**\n     * Blur Filter\n     * @function\n     * @name Blur\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Blur]);\n     * node.blurRadius(10);\n     */\n  Konva.Filters.Blur = function Blur(imageData) {\n    var radius = Math.round(this.blurRadius());\n\n    if (radius > 0) {\n      filterGaussBlurRGBA(imageData, radius);\n    }\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'blurRadius',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n\n  /**\n    * get/set blur radius. Use with {@link Konva.Filters.Blur} filter\n    * @name blurRadius\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} radius\n    * @returns {Integer}\n    */\n})(Konva);\n\n/*eslint-disable  max-depth */\n(function() {\n  'use strict';\n  function pixelAt(idata, x, y) {\n    var idx = (y * idata.width + x) * 4;\n    var d = [];\n    d.push(\n      idata.data[idx++],\n      idata.data[idx++],\n      idata.data[idx++],\n      idata.data[idx++]\n    );\n    return d;\n  }\n\n  function rgbDistance(p1, p2) {\n    return Math.sqrt(\n      Math.pow(p1[0] - p2[0], 2) +\n        Math.pow(p1[1] - p2[1], 2) +\n        Math.pow(p1[2] - p2[2], 2)\n    );\n  }\n\n  function rgbMean(pTab) {\n    var m = [0, 0, 0];\n\n    for (var i = 0; i < pTab.length; i++) {\n      m[0] += pTab[i][0];\n      m[1] += pTab[i][1];\n      m[2] += pTab[i][2];\n    }\n\n    m[0] /= pTab.length;\n    m[1] /= pTab.length;\n    m[2] /= pTab.length;\n\n    return m;\n  }\n\n  function backgroundMask(idata, threshold) {\n    var rgbv_no = pixelAt(idata, 0, 0);\n    var rgbv_ne = pixelAt(idata, idata.width - 1, 0);\n    var rgbv_so = pixelAt(idata, 0, idata.height - 1);\n    var rgbv_se = pixelAt(idata, idata.width - 1, idata.height - 1);\n\n    var thres = threshold || 10;\n    if (\n      rgbDistance(rgbv_no, rgbv_ne) < thres &&\n      rgbDistance(rgbv_ne, rgbv_se) < thres &&\n      rgbDistance(rgbv_se, rgbv_so) < thres &&\n      rgbDistance(rgbv_so, rgbv_no) < thres\n    ) {\n      // Mean color\n      var mean = rgbMean([rgbv_ne, rgbv_no, rgbv_se, rgbv_so]);\n\n      // Mask based on color distance\n      var mask = [];\n      for (var i = 0; i < idata.width * idata.height; i++) {\n        var d = rgbDistance(mean, [\n          idata.data[i * 4],\n          idata.data[i * 4 + 1],\n          idata.data[i * 4 + 2]\n        ]);\n        mask[i] = d < thres ? 0 : 255;\n      }\n\n      return mask;\n    }\n  }\n\n  function applyMask(idata, mask) {\n    for (var i = 0; i < idata.width * idata.height; i++) {\n      idata.data[4 * i + 3] = mask[i];\n    }\n  }\n\n  function erodeMask(mask, sw, sh) {\n    var weights = [1, 1, 1, 1, 0, 1, 1, 1, 1];\n    var side = Math.round(Math.sqrt(weights.length));\n    var halfSide = Math.floor(side / 2);\n\n    var maskResult = [];\n    for (var y = 0; y < sh; y++) {\n      for (var x = 0; x < sw; x++) {\n        var so = y * sw + x;\n        var a = 0;\n        for (var cy = 0; cy < side; cy++) {\n          for (var cx = 0; cx < side; cx++) {\n            var scy = y + cy - halfSide;\n            var scx = x + cx - halfSide;\n\n            if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) {\n              var srcOff = scy * sw + scx;\n              var wt = weights[cy * side + cx];\n\n              a += mask[srcOff] * wt;\n            }\n          }\n        }\n\n        maskResult[so] = a === 255 * 8 ? 255 : 0;\n      }\n    }\n\n    return maskResult;\n  }\n\n  function dilateMask(mask, sw, sh) {\n    var weights = [1, 1, 1, 1, 1, 1, 1, 1, 1];\n    var side = Math.round(Math.sqrt(weights.length));\n    var halfSide = Math.floor(side / 2);\n\n    var maskResult = [];\n    for (var y = 0; y < sh; y++) {\n      for (var x = 0; x < sw; x++) {\n        var so = y * sw + x;\n        var a = 0;\n        for (var cy = 0; cy < side; cy++) {\n          for (var cx = 0; cx < side; cx++) {\n            var scy = y + cy - halfSide;\n            var scx = x + cx - halfSide;\n\n            if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) {\n              var srcOff = scy * sw + scx;\n              var wt = weights[cy * side + cx];\n\n              a += mask[srcOff] * wt;\n            }\n          }\n        }\n\n        maskResult[so] = a >= 255 * 4 ? 255 : 0;\n      }\n    }\n\n    return maskResult;\n  }\n\n  function smoothEdgeMask(mask, sw, sh) {\n    var weights = [\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9,\n      1 / 9\n    ];\n    var side = Math.round(Math.sqrt(weights.length));\n    var halfSide = Math.floor(side / 2);\n\n    var maskResult = [];\n    for (var y = 0; y < sh; y++) {\n      for (var x = 0; x < sw; x++) {\n        var so = y * sw + x;\n        var a = 0;\n        for (var cy = 0; cy < side; cy++) {\n          for (var cx = 0; cx < side; cx++) {\n            var scy = y + cy - halfSide;\n            var scx = x + cx - halfSide;\n\n            if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) {\n              var srcOff = scy * sw + scx;\n              var wt = weights[cy * side + cx];\n\n              a += mask[srcOff] * wt;\n            }\n          }\n        }\n\n        maskResult[so] = a;\n      }\n    }\n\n    return maskResult;\n  }\n\n  /**\n\t * Mask Filter\n\t * @function\n\t * @name Mask\n\t * @memberof Konva.Filters\n\t * @param {Object} imageData\n\t * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Mask]);\n     * node.threshold(200);\n\t */\n  Konva.Filters.Mask = function(imageData) {\n    // Detect pixels close to the background color\n    var threshold = this.threshold(),\n      mask = backgroundMask(imageData, threshold);\n    if (mask) {\n      // Erode\n      mask = erodeMask(mask, imageData.width, imageData.height);\n\n      // Dilate\n      mask = dilateMask(mask, imageData.width, imageData.height);\n\n      // Gradient\n      mask = smoothEdgeMask(mask, imageData.width, imageData.height);\n\n      // Apply mask\n      applyMask(imageData, mask);\n\n      // todo : Update hit region function according to mask\n    }\n\n    return imageData;\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'threshold',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n})();\n\n(function() {\n  'use strict';\n  /**\n     * RGB Filter\n     * @function\n     * @name RGB\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @author ippo615\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.RGB]);\n     * node.blue(120);\n     * node.green(200);\n     */\n  Konva.Filters.RGB = function(imageData) {\n    var data = imageData.data,\n      nPixels = data.length,\n      red = this.red(),\n      green = this.green(),\n      blue = this.blue(),\n      i,\n      brightness;\n\n    for (i = 0; i < nPixels; i += 4) {\n      brightness =\n        (0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2]) / 255;\n      data[i] = brightness * red; // r\n      data[i + 1] = brightness * green; // g\n      data[i + 2] = brightness * blue; // b\n      data[i + 3] = data[i + 3]; // alpha\n    }\n  };\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'red', 0, function(val) {\n    this._filterUpToDate = false;\n    if (val > 255) {\n      return 255;\n    } else if (val < 0) {\n      return 0;\n    } else {\n      return Math.round(val);\n    }\n  });\n  /**\n    * get/set filter red value. Use with {@link Konva.Filters.RGB} filter.\n    * @name red\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} red value between 0 and 255\n    * @returns {Integer}\n    */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'green', 0, function(val) {\n    this._filterUpToDate = false;\n    if (val > 255) {\n      return 255;\n    } else if (val < 0) {\n      return 0;\n    } else {\n      return Math.round(val);\n    }\n  });\n  /**\n    * get/set filter green value. Use with {@link Konva.Filters.RGB} filter.\n    * @name green\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} green value between 0 and 255\n    * @returns {Integer}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'blue',\n    0,\n    Konva.Validators.RGBComponent,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set filter blue value. Use with {@link Konva.Filters.RGB} filter.\n    * @name blue\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} blue value between 0 and 255\n    * @returns {Integer}\n    */\n})();\n\n(function() {\n  'use strict';\n  /**\n     * RGBA Filter\n     * @function\n     * @name RGBA\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @author codefo\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.RGBA]);\n     * node.blue(120);\n     * node.green(200);\n     * node.alpha(0.3);\n     */\n  Konva.Filters.RGBA = function(imageData) {\n    var data = imageData.data,\n      nPixels = data.length,\n      red = this.red(),\n      green = this.green(),\n      blue = this.blue(),\n      alpha = this.alpha(),\n      i,\n      ia;\n\n    for (i = 0; i < nPixels; i += 4) {\n      ia = 1 - alpha;\n\n      data[i] = red * alpha + data[i] * ia; // r\n      data[i + 1] = green * alpha + data[i + 1] * ia; // g\n      data[i + 2] = blue * alpha + data[i + 2] * ia; // b\n    }\n  };\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'red', 0, function(val) {\n    this._filterUpToDate = false;\n    if (val > 255) {\n      return 255;\n    } else if (val < 0) {\n      return 0;\n    } else {\n      return Math.round(val);\n    }\n  });\n  /**\n    * get/set filter red value. Use with {@link Konva.Filters.RGBA} filter.\n    * @name red\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} red value between 0 and 255\n    * @returns {Integer}\n    */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'green', 0, function(val) {\n    this._filterUpToDate = false;\n    if (val > 255) {\n      return 255;\n    } else if (val < 0) {\n      return 0;\n    } else {\n      return Math.round(val);\n    }\n  });\n  /**\n    * get/set filter green value. Use with {@link Konva.Filters.RGBA} filter.\n    * @name green\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} green value between 0 and 255\n    * @returns {Integer}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'blue',\n    0,\n    Konva.Validators.RGBComponent,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set filter blue value. Use with {@link Konva.Filters.RGBA} filter.\n    * @name blue\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} blue value between 0 and 255\n    * @returns {Integer}\n    */\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'alpha', 1, function(val) {\n    this._filterUpToDate = false;\n    if (val > 1) {\n      return 1;\n    } else if (val < 0) {\n      return 0;\n    } else {\n      return val;\n    }\n  });\n  /**\n     * get/set filter alpha value. Use with {@link Konva.Filters.RGBA} filter.\n     * @name alpha\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Float} alpha value between 0 and 1\n     * @returns {Float}\n     */\n})();\n\n(function() {\n  'use strict';\n  /**\n    * HSV Filter. Adjusts the hue, saturation and value\n    * @function\n    * @name HSV\n    * @memberof Konva.Filters\n    * @param {Object} imageData\n    * @author ippo615\n    * @example\n    * image.filters([Konva.Filters.HSV]);\n    * image.value(200);\n    */\n\n  Konva.Filters.HSV = function(imageData) {\n    var data = imageData.data,\n      nPixels = data.length,\n      v = Math.pow(2, this.value()),\n      s = Math.pow(2, this.saturation()),\n      h = Math.abs(this.hue() + 360) % 360,\n      i;\n\n    // Basis for the technique used:\n    // http://beesbuzz.biz/code/hsv_color_transforms.php\n    // V is the value multiplier (1 for none, 2 for double, 0.5 for half)\n    // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half)\n    // H is the hue shift in degrees (0 to 360)\n    // vsu = V*S*cos(H*PI/180);\n    // vsw = V*S*sin(H*PI/180);\n    //[ .299V+.701vsu+.168vsw    .587V-.587vsu+.330vsw    .114V-.114vsu-.497vsw ] [R]\n    //[ .299V-.299vsu-.328vsw    .587V+.413vsu+.035vsw    .114V-.114vsu+.292vsw ]*[G]\n    //[ .299V-.300vsu+1.25vsw    .587V-.588vsu-1.05vsw    .114V+.886vsu-.203vsw ] [B]\n\n    // Precompute the values in the matrix:\n    var vsu = v * s * Math.cos(h * Math.PI / 180),\n      vsw = v * s * Math.sin(h * Math.PI / 180);\n    // (result spot)(source spot)\n    var rr = 0.299 * v + 0.701 * vsu + 0.167 * vsw,\n      rg = 0.587 * v - 0.587 * vsu + 0.330 * vsw,\n      rb = 0.114 * v - 0.114 * vsu - 0.497 * vsw;\n    var gr = 0.299 * v - 0.299 * vsu - 0.328 * vsw,\n      gg = 0.587 * v + 0.413 * vsu + 0.035 * vsw,\n      gb = 0.114 * v - 0.114 * vsu + 0.293 * vsw;\n    var br = 0.299 * v - 0.300 * vsu + 1.250 * vsw,\n      bg = 0.587 * v - 0.586 * vsu - 1.050 * vsw,\n      bb = 0.114 * v + 0.886 * vsu - 0.200 * vsw;\n\n    var r, g, b, a;\n\n    for (i = 0; i < nPixels; i += 4) {\n      r = data[i + 0];\n      g = data[i + 1];\n      b = data[i + 2];\n      a = data[i + 3];\n\n      data[i + 0] = rr * r + rg * g + rb * b;\n      data[i + 1] = gr * r + gg * g + gb * b;\n      data[i + 2] = br * r + bg * g + bb * b;\n      data[i + 3] = a; // alpha\n    }\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'hue',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsv hue in degrees. Use with {@link Konva.Filters.HSV} or {@link Konva.Filters.HSL} filter.\n    * @name hue\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} hue value between 0 and 359\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'saturation',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsv saturation. Use with {@link Konva.Filters.HSV} or {@link Konva.Filters.HSL} filter.\n    * @name saturation\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc..\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'value',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsv value. Use with {@link Konva.Filters.HSV} filter.\n    * @name value\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc..\n    * @returns {Number}\n    */\n})();\n\n(function() {\n  'use strict';\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'hue',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsv hue in degrees. Use with {@link Konva.Filters.HSV} or {@link Konva.Filters.HSL} filter.\n    * @name hue\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} hue value between 0 and 359\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'saturation',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsv saturation. Use with {@link Konva.Filters.HSV} or {@link Konva.Filters.HSL} filter.\n    * @name saturation\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc..\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'luminance',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set hsl luminance. Use with {@link Konva.Filters.HSL} filter.\n    * @name value\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc..\n    * @returns {Number}\n    */\n\n  /**\n    * HSL Filter. Adjusts the hue, saturation and luminance (or lightness)\n    * @function\n    * @memberof Konva.Filters\n    * @param {Object} imageData\n    * @author ippo615\n    * @example\n    * image.filters([Konva.Filters.HSL]);\n    * image.luminance(200);\n    */\n\n  Konva.Filters.HSL = function(imageData) {\n    var data = imageData.data,\n      nPixels = data.length,\n      v = 1,\n      s = Math.pow(2, this.saturation()),\n      h = Math.abs(this.hue() + 360) % 360,\n      l = this.luminance() * 127,\n      i;\n\n    // Basis for the technique used:\n    // http://beesbuzz.biz/code/hsv_color_transforms.php\n    // V is the value multiplier (1 for none, 2 for double, 0.5 for half)\n    // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half)\n    // H is the hue shift in degrees (0 to 360)\n    // vsu = V*S*cos(H*PI/180);\n    // vsw = V*S*sin(H*PI/180);\n    //[ .299V+.701vsu+.168vsw    .587V-.587vsu+.330vsw    .114V-.114vsu-.497vsw ] [R]\n    //[ .299V-.299vsu-.328vsw    .587V+.413vsu+.035vsw    .114V-.114vsu+.292vsw ]*[G]\n    //[ .299V-.300vsu+1.25vsw    .587V-.588vsu-1.05vsw    .114V+.886vsu-.203vsw ] [B]\n\n    // Precompute the values in the matrix:\n    var vsu = v * s * Math.cos(h * Math.PI / 180),\n      vsw = v * s * Math.sin(h * Math.PI / 180);\n    // (result spot)(source spot)\n    var rr = 0.299 * v + 0.701 * vsu + 0.167 * vsw,\n      rg = 0.587 * v - 0.587 * vsu + 0.330 * vsw,\n      rb = 0.114 * v - 0.114 * vsu - 0.497 * vsw;\n    var gr = 0.299 * v - 0.299 * vsu - 0.328 * vsw,\n      gg = 0.587 * v + 0.413 * vsu + 0.035 * vsw,\n      gb = 0.114 * v - 0.114 * vsu + 0.293 * vsw;\n    var br = 0.299 * v - 0.300 * vsu + 1.250 * vsw,\n      bg = 0.587 * v - 0.586 * vsu - 1.050 * vsw,\n      bb = 0.114 * v + 0.886 * vsu - 0.200 * vsw;\n\n    var r, g, b, a;\n\n    for (i = 0; i < nPixels; i += 4) {\n      r = data[i + 0];\n      g = data[i + 1];\n      b = data[i + 2];\n      a = data[i + 3];\n\n      data[i + 0] = rr * r + rg * g + rb * b + l;\n      data[i + 1] = gr * r + gg * g + gb * b + l;\n      data[i + 2] = br * r + bg * g + bb * b + l;\n      data[i + 3] = a; // alpha\n    }\n  };\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Emboss Filter.\n     * Pixastic Lib - Emboss filter - v0.1.0\n     * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/\n     * License: [http://www.pixastic.com/lib/license.txt]\n     * @function\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Emboss]);\n     * node.embossStrength(0.8);\n     * node.embossWhiteLevel(0.3);\n     * node.embossDirection('right');\n     * node.embossBlend(true);\n     */\n  Konva.Filters.Emboss = function(imageData) {\n    // pixastic strength is between 0 and 10.  I want it between 0 and 1\n    // pixastic greyLevel is between 0 and 255.  I want it between 0 and 1.  Also,\n    // a max value of greyLevel yields a white emboss, and the min value yields a black\n    // emboss.  Therefore, I changed greyLevel to whiteLevel\n    var strength = this.embossStrength() * 10,\n      greyLevel = this.embossWhiteLevel() * 255,\n      direction = this.embossDirection(),\n      blend = this.embossBlend(),\n      dirY = 0,\n      dirX = 0,\n      data = imageData.data,\n      w = imageData.width,\n      h = imageData.height,\n      w4 = w * 4,\n      y = h;\n\n    switch (direction) {\n      case 'top-left':\n        dirY = -1;\n        dirX = -1;\n        break;\n      case 'top':\n        dirY = -1;\n        dirX = 0;\n        break;\n      case 'top-right':\n        dirY = -1;\n        dirX = 1;\n        break;\n      case 'right':\n        dirY = 0;\n        dirX = 1;\n        break;\n      case 'bottom-right':\n        dirY = 1;\n        dirX = 1;\n        break;\n      case 'bottom':\n        dirY = 1;\n        dirX = 0;\n        break;\n      case 'bottom-left':\n        dirY = 1;\n        dirX = -1;\n        break;\n      case 'left':\n        dirY = 0;\n        dirX = -1;\n        break;\n      default:\n        Konva.Util.error('Unknown emboss direction: ' + direction);\n    }\n\n    do {\n      var offsetY = (y - 1) * w4;\n\n      var otherY = dirY;\n      if (y + otherY < 1) {\n        otherY = 0;\n      }\n      if (y + otherY > h) {\n        otherY = 0;\n      }\n\n      var offsetYOther = (y - 1 + otherY) * w * 4;\n\n      var x = w;\n      do {\n        var offset = offsetY + (x - 1) * 4;\n\n        var otherX = dirX;\n        if (x + otherX < 1) {\n          otherX = 0;\n        }\n        if (x + otherX > w) {\n          otherX = 0;\n        }\n\n        var offsetOther = offsetYOther + (x - 1 + otherX) * 4;\n\n        var dR = data[offset] - data[offsetOther];\n        var dG = data[offset + 1] - data[offsetOther + 1];\n        var dB = data[offset + 2] - data[offsetOther + 2];\n\n        var dif = dR;\n        var absDif = dif > 0 ? dif : -dif;\n\n        var absG = dG > 0 ? dG : -dG;\n        var absB = dB > 0 ? dB : -dB;\n\n        if (absG > absDif) {\n          dif = dG;\n        }\n        if (absB > absDif) {\n          dif = dB;\n        }\n\n        dif *= strength;\n\n        if (blend) {\n          var r = data[offset] + dif;\n          var g = data[offset + 1] + dif;\n          var b = data[offset + 2] + dif;\n\n          data[offset] = r > 255 ? 255 : r < 0 ? 0 : r;\n          data[offset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;\n          data[offset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;\n        } else {\n          var grey = greyLevel - dif;\n          if (grey < 0) {\n            grey = 0;\n          } else if (grey > 255) {\n            grey = 255;\n          }\n\n          data[offset] = data[offset + 1] = data[offset + 2] = grey;\n        }\n      } while (--x);\n    } while (--y);\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'embossStrength',\n    0.5,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set emboss strength. Use with {@link Konva.Filters.Emboss} filter.\n    * @name embossStrength\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} level between 0 and 1.  Default is 0.5\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'embossWhiteLevel',\n    0.5,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set emboss white level. Use with {@link Konva.Filters.Emboss} filter.\n    * @name embossWhiteLevel\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} embossWhiteLevel between 0 and 1.  Default is 0.5\n    * @returns {Number}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'embossDirection',\n    'top-left',\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set emboss direction. Use with {@link Konva.Filters.Emboss} filter.\n    * @name embossDirection\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {String} embossDirection can be top-left, top, top-right, right, bottom-right, bottom, bottom-left or left\n    *   The default is top-left\n    * @returns {String}\n    */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'embossBlend',\n    false,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n  /**\n    * get/set emboss blend. Use with {@link Konva.Filters.Emboss} filter.\n    * @name embossBlend\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Boolean} embossBlend\n    * @returns {Boolean}\n    */\n})();\n\n(function() {\n  'use strict';\n  function remap(fromValue, fromMin, fromMax, toMin, toMax) {\n    // Compute the range of the data\n    var fromRange = fromMax - fromMin, toRange = toMax - toMin, toValue;\n\n    // If either range is 0, then the value can only be mapped to 1 value\n    if (fromRange === 0) {\n      return toMin + toRange / 2;\n    }\n    if (toRange === 0) {\n      return toMin;\n    }\n\n    // (1) untranslate, (2) unscale, (3) rescale, (4) retranslate\n    toValue = (fromValue - fromMin) / fromRange;\n    toValue = toRange * toValue + toMin;\n\n    return toValue;\n  }\n\n  /**\n    * Enhance Filter. Adjusts the colors so that they span the widest\n    *  possible range (ie 0-255). Performs w*h pixel reads and w*h pixel\n    *  writes.\n    * @function\n    * @name Enhance\n    * @memberof Konva.Filters\n    * @param {Object} imageData\n    * @author ippo615\n    * @example\n    * node.cache();\n    * node.filters([Konva.Filters.Enhance]);\n    * node.enhance(0.4);\n    */\n  Konva.Filters.Enhance = function(imageData) {\n    var data = imageData.data,\n      nSubPixels = data.length,\n      rMin = data[0],\n      rMax = rMin,\n      r,\n      gMin = data[1],\n      gMax = gMin,\n      g,\n      bMin = data[2],\n      bMax = bMin,\n      b,\n      i;\n\n    // If we are not enhancing anything - don't do any computation\n    var enhanceAmount = this.enhance();\n    if (enhanceAmount === 0) {\n      return;\n    }\n\n    // 1st Pass - find the min and max for each channel:\n    for (i = 0; i < nSubPixels; i += 4) {\n      r = data[i + 0];\n      if (r < rMin) {\n        rMin = r;\n      } else if (r > rMax) {\n        rMax = r;\n      }\n      g = data[i + 1];\n      if (g < gMin) {\n        gMin = g;\n      } else if (g > gMax) {\n        gMax = g;\n      }\n      b = data[i + 2];\n      if (b < bMin) {\n        bMin = b;\n      } else if (b > bMax) {\n        bMax = b;\n      }\n      //a = data[i + 3];\n      //if (a < aMin) { aMin = a; } else\n      //if (a > aMax) { aMax = a; }\n    }\n\n    // If there is only 1 level - don't remap\n    if (rMax === rMin) {\n      rMax = 255;\n      rMin = 0;\n    }\n    if (gMax === gMin) {\n      gMax = 255;\n      gMin = 0;\n    }\n    if (bMax === bMin) {\n      bMax = 255;\n      bMin = 0;\n    }\n\n    var rMid,\n      rGoalMax,\n      rGoalMin,\n      gMid,\n      gGoalMax,\n      gGoalMin,\n      bMid,\n      bGoalMax,\n      bGoalMin;\n\n    // If the enhancement is positive - stretch the histogram\n    if (enhanceAmount > 0) {\n      rGoalMax = rMax + enhanceAmount * (255 - rMax);\n      rGoalMin = rMin - enhanceAmount * (rMin - 0);\n      gGoalMax = gMax + enhanceAmount * (255 - gMax);\n      gGoalMin = gMin - enhanceAmount * (gMin - 0);\n      bGoalMax = bMax + enhanceAmount * (255 - bMax);\n      bGoalMin = bMin - enhanceAmount * (bMin - 0);\n      // If the enhancement is negative -   compress the histogram\n    } else {\n      rMid = (rMax + rMin) * 0.5;\n      rGoalMax = rMax + enhanceAmount * (rMax - rMid);\n      rGoalMin = rMin + enhanceAmount * (rMin - rMid);\n      gMid = (gMax + gMin) * 0.5;\n      gGoalMax = gMax + enhanceAmount * (gMax - gMid);\n      gGoalMin = gMin + enhanceAmount * (gMin - gMid);\n      bMid = (bMax + bMin) * 0.5;\n      bGoalMax = bMax + enhanceAmount * (bMax - bMid);\n      bGoalMin = bMin + enhanceAmount * (bMin - bMid);\n    }\n\n    // Pass 2 - remap everything, except the alpha\n    for (i = 0; i < nSubPixels; i += 4) {\n      data[i + 0] = remap(data[i + 0], rMin, rMax, rGoalMin, rGoalMax);\n      data[i + 1] = remap(data[i + 1], gMin, gMax, gGoalMin, gGoalMax);\n      data[i + 2] = remap(data[i + 2], bMin, bMax, bGoalMin, bGoalMax);\n      //data[i + 3] = remap(data[i + 3], aMin, aMax, aGoalMin, aGoalMax);\n    }\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'enhance',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n\n  /**\n    * get/set enhance. Use with {@link Konva.Filters.Enhance} filter.\n    * @name enhance\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Float} amount\n    * @returns {Float}\n    */\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Posterize Filter. Adjusts the channels so that there are no more\n     *  than n different values for that channel. This is also applied\n     *  to the alpha channel.\n     * @function\n     * @name Posterize\n     * @author ippo615\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Posterize]);\n     * node.levels(0.8); // between 0 and 1\n     */\n\n  Konva.Filters.Posterize = function(imageData) {\n    // level must be between 1 and 255\n    var levels = Math.round(this.levels() * 254) + 1,\n      data = imageData.data,\n      len = data.length,\n      scale = 255 / levels,\n      i;\n\n    for (i = 0; i < len; i += 1) {\n      data[i] = Math.floor(data[i] / scale) * scale;\n    }\n  };\n\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'levels',\n    0.5,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n\n  /**\n    * get/set levels.  Must be a number between 0 and 1.  Use with {@link Konva.Filters.Posterize} filter.\n    * @name levels\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Number} level between 0 and 1\n    * @returns {Number}\n    */\n})();\n\n(function() {\r\n  'use strict';\r\n  /**\r\n     * Noise Filter. Randomly adds or substracts to the color channels\r\n     * @function\r\n     * @name Noise\r\n     * @memberof Konva.Filters\r\n     * @param {Object} imageData\r\n     * @author ippo615\r\n     * @example\r\n     * node.cache();\r\n     * node.filters([Konva.Filters.Noise]);\r\n     * node.noise(0.8);\r\n     */\r\n  Konva.Filters.Noise = function(imageData) {\r\n    var amount = this.noise() * 255,\r\n      data = imageData.data,\r\n      nPixels = data.length,\r\n      half = amount / 2,\r\n      i;\r\n\r\n    for (i = 0; i < nPixels; i += 4) {\r\n      data[i + 0] += half - 2 * half * Math.random();\r\n      data[i + 1] += half - 2 * half * Math.random();\r\n      data[i + 2] += half - 2 * half * Math.random();\r\n    }\r\n  };\r\n\r\n  Konva.Factory.addGetterSetter(\r\n    Konva.Node,\r\n    'noise',\r\n    0.2,\r\n    null,\r\n    Konva.Factory.afterSetFilter\r\n  );\r\n  /**\r\n    * get/set noise amount.  Must be a value between 0 and 1. Use with {@link Konva.Filters.Noise} filter.\r\n    * @name noise\r\n    * @method\r\n    * @memberof Konva.Node.prototype\r\n    * @param {Number} noise\r\n    * @returns {Number}\r\n    */\r\n})();\r\n\n/*eslint-disable max-depth */\r\n(function() {\r\n  'use strict';\r\n  /**\r\n     * Pixelate Filter. Averages groups of pixels and redraws\r\n     *  them as larger pixels\r\n     * @function\r\n     * @name Pixelate\r\n     * @memberof Konva.Filters\r\n     * @param {Object} imageData\r\n     * @author ippo615\r\n     * @example\r\n     * node.cache();\r\n     * node.filters([Konva.Filters.Pixelate]);\r\n     * node.pixelSize(10);\r\n     */\r\n\r\n  Konva.Filters.Pixelate = function(imageData) {\r\n    var pixelSize = Math.ceil(this.pixelSize()),\r\n      width = imageData.width,\r\n      height = imageData.height,\r\n      x,\r\n      y,\r\n      i,\r\n      //pixelsPerBin = pixelSize * pixelSize,\r\n      red,\r\n      green,\r\n      blue,\r\n      alpha,\r\n      nBinsX = Math.ceil(width / pixelSize),\r\n      nBinsY = Math.ceil(height / pixelSize),\r\n      xBinStart,\r\n      xBinEnd,\r\n      yBinStart,\r\n      yBinEnd,\r\n      xBin,\r\n      yBin,\r\n      pixelsInBin;\r\n    imageData = imageData.data;\r\n\r\n    if (pixelSize <= 0) {\r\n      Konva.Util.error('pixelSize value can not be <= 0');\r\n      return;\r\n    }\r\n\r\n    for (xBin = 0; xBin < nBinsX; xBin += 1) {\r\n      for (yBin = 0; yBin < nBinsY; yBin += 1) {\r\n        // Initialize the color accumlators to 0\r\n        red = 0;\r\n        green = 0;\r\n        blue = 0;\r\n        alpha = 0;\r\n\r\n        // Determine which pixels are included in this bin\r\n        xBinStart = xBin * pixelSize;\r\n        xBinEnd = xBinStart + pixelSize;\r\n        yBinStart = yBin * pixelSize;\r\n        yBinEnd = yBinStart + pixelSize;\r\n\r\n        // Add all of the pixels to this bin!\r\n        pixelsInBin = 0;\r\n        for (x = xBinStart; x < xBinEnd; x += 1) {\r\n          if (x >= width) {\r\n            continue;\r\n          }\r\n          for (y = yBinStart; y < yBinEnd; y += 1) {\r\n            if (y >= height) {\r\n              continue;\r\n            }\r\n            i = (width * y + x) * 4;\r\n            red += imageData[i + 0];\r\n            green += imageData[i + 1];\r\n            blue += imageData[i + 2];\r\n            alpha += imageData[i + 3];\r\n            pixelsInBin += 1;\r\n          }\r\n        }\r\n\r\n        // Make sure the channels are between 0-255\r\n        red = red / pixelsInBin;\r\n        green = green / pixelsInBin;\r\n        blue = blue / pixelsInBin;\r\n\r\n        // Draw this bin\r\n        for (x = xBinStart; x < xBinEnd; x += 1) {\r\n          if (x >= width) {\r\n            continue;\r\n          }\r\n          for (y = yBinStart; y < yBinEnd; y += 1) {\r\n            if (y >= height) {\r\n              continue;\r\n            }\r\n            i = (width * y + x) * 4;\r\n            imageData[i + 0] = red;\r\n            imageData[i + 1] = green;\r\n            imageData[i + 2] = blue;\r\n            imageData[i + 3] = alpha;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n  Konva.Factory.addGetterSetter(\r\n    Konva.Node,\r\n    'pixelSize',\r\n    8,\r\n    null,\r\n    Konva.Factory.afterSetFilter\r\n  );\r\n  /**\r\n    * get/set pixel size. Use with {@link Konva.Filters.Pixelate} filter.\r\n    * @name pixelSize\r\n    * @method\r\n    * @memberof Konva.Node.prototype\r\n    * @param {Integer} pixelSize\r\n    * @returns {Integer}\r\n    */\r\n})();\r\n\n(function() {\r\n  'use strict';\r\n  /**\r\n     * Threshold Filter. Pushes any value above the mid point to\r\n     *  the max and any value below the mid point to the min.\r\n     *  This affects the alpha channel.\r\n     * @function\r\n     * @name Threshold\r\n     * @memberof Konva.Filters\r\n     * @param {Object} imageData\r\n     * @author ippo615\r\n     * @example\r\n     * node.cache();\r\n     * node.filters([Konva.Filters.Threshold]);\r\n     * node.threshold(0.1);\r\n     */\r\n\r\n  Konva.Filters.Threshold = function(imageData) {\r\n    var level = this.threshold() * 255,\r\n      data = imageData.data,\r\n      len = data.length,\r\n      i;\r\n\r\n    for (i = 0; i < len; i += 1) {\r\n      data[i] = data[i] < level ? 0 : 255;\r\n    }\r\n  };\r\n\r\n  Konva.Factory.addGetterSetter(\r\n    Konva.Node,\r\n    'threshold',\r\n    0.5,\r\n    null,\r\n    Konva.Factory.afterSetFilter\r\n  );\r\n  /**\r\n    * get/set threshold.  Must be a value between 0 and 1. Use with {@link Konva.Filters.Threshold} or {@link Konva.Filters.Mask} filter.\r\n    * @name threshold\r\n    * @method\r\n    * @memberof Konva.Node.prototype\r\n    * @param {Number} threshold\r\n    * @returns {Number}\r\n    */\r\n})();\r\n\n(function() {\n  'use strict';\n  /**\n     * Sepia Filter\n     * Based on: Pixastic Lib - Sepia filter - v0.1.0\n     * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/\n     * @function\n     * @name Sepia\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @author Jacob Seidelin <jseidelin@nihilogic.dk>\n     * @license MPL v1.1 [http://www.pixastic.com/lib/license.txt]\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Sepia]);\n     */\n  Konva.Filters.Sepia = function(imageData) {\n    var data = imageData.data,\n      w = imageData.width,\n      y = imageData.height,\n      w4 = w * 4,\n      offsetY,\n      x,\n      offset,\n      or,\n      og,\n      ob,\n      r,\n      g,\n      b;\n\n    do {\n      offsetY = (y - 1) * w4;\n      x = w;\n      do {\n        offset = offsetY + (x - 1) * 4;\n\n        or = data[offset];\n        og = data[offset + 1];\n        ob = data[offset + 2];\n\n        r = or * 0.393 + og * 0.769 + ob * 0.189;\n        g = or * 0.349 + og * 0.686 + ob * 0.168;\n        b = or * 0.272 + og * 0.534 + ob * 0.131;\n\n        data[offset] = r > 255 ? 255 : r;\n        data[offset + 1] = g > 255 ? 255 : g;\n        data[offset + 2] = b > 255 ? 255 : b;\n        data[offset + 3] = data[offset + 3];\n      } while (--x);\n    } while (--y);\n  };\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Solarize Filter\n     * Pixastic Lib - Solarize filter - v0.1.0\n     * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/\n     * License: [http://www.pixastic.com/lib/license.txt]\n     * @function\n     * @name Solarize\n     * @memberof Konva.Filters\n     * @param {Object} imageData\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Solarize]);\n     */\n  Konva.Filters.Solarize = function(imageData) {\n    var data = imageData.data,\n      w = imageData.width,\n      h = imageData.height,\n      w4 = w * 4,\n      y = h;\n\n    do {\n      var offsetY = (y - 1) * w4;\n      var x = w;\n      do {\n        var offset = offsetY + (x - 1) * 4;\n        var r = data[offset];\n        var g = data[offset + 1];\n        var b = data[offset + 2];\n\n        if (r > 127) {\n          r = 255 - r;\n        }\n        if (g > 127) {\n          g = 255 - g;\n        }\n        if (b > 127) {\n          b = 255 - b;\n        }\n\n        data[offset] = r;\n        data[offset + 1] = g;\n        data[offset + 2] = b;\n      } while (--x);\n    } while (--y);\n  };\n})();\n\n(function() {\n  'use strict';\n  /*\n   * ToPolar Filter. Converts image data to polar coordinates. Performs\n   *  w*h*4 pixel reads and w*h pixel writes. The r axis is placed along\n   *  what would be the y axis and the theta axis along the x axis.\n   * @function\n   * @author ippo615\n   * @memberof Konva.Filters\n   * @param {ImageData} src, the source image data (what will be transformed)\n   * @param {ImageData} dst, the destination image data (where it will be saved)\n   * @param {Object} opt\n   * @param {Number} [opt.polarCenterX] horizontal location for the center of the circle,\n   *  default is in the middle\n   * @param {Number} [opt.polarCenterY] vertical location for the center of the circle,\n   *  default is in the middle\n   */\n\n  var ToPolar = function(src, dst, opt) {\n    var srcPixels = src.data,\n      dstPixels = dst.data,\n      xSize = src.width,\n      ySize = src.height,\n      xMid = opt.polarCenterX || xSize / 2,\n      yMid = opt.polarCenterY || ySize / 2,\n      i,\n      x,\n      y,\n      r = 0,\n      g = 0,\n      b = 0,\n      a = 0;\n\n    // Find the largest radius\n    var rad,\n      rMax = Math.sqrt(xMid * xMid + yMid * yMid);\n    x = xSize - xMid;\n    y = ySize - yMid;\n    rad = Math.sqrt(x * x + y * y);\n    rMax = rad > rMax ? rad : rMax;\n\n    // We'll be uisng y as the radius, and x as the angle (theta=t)\n    var rSize = ySize,\n      tSize = xSize,\n      radius,\n      theta;\n\n    // We want to cover all angles (0-360) and we need to convert to\n    // radians (*PI/180)\n    var conversion = 360 / tSize * Math.PI / 180,\n      sin,\n      cos;\n\n    // var x1, x2, x1i, x2i, y1, y2, y1i, y2i, scale;\n\n    for (theta = 0; theta < tSize; theta += 1) {\n      sin = Math.sin(theta * conversion);\n      cos = Math.cos(theta * conversion);\n      for (radius = 0; radius < rSize; radius += 1) {\n        x = Math.floor(xMid + rMax * radius / rSize * cos);\n        y = Math.floor(yMid + rMax * radius / rSize * sin);\n        i = (y * xSize + x) * 4;\n        r = srcPixels[i + 0];\n        g = srcPixels[i + 1];\n        b = srcPixels[i + 2];\n        a = srcPixels[i + 3];\n\n        // Store it\n        //i = (theta * xSize  +  radius) * 4;\n        i = (theta + radius * xSize) * 4;\n        dstPixels[i + 0] = r;\n        dstPixels[i + 1] = g;\n        dstPixels[i + 2] = b;\n        dstPixels[i + 3] = a;\n      }\n    }\n  };\n\n  /*\n     * FromPolar Filter. Converts image data from polar coordinates back to rectangular.\n     *  Performs w*h*4 pixel reads and w*h pixel writes.\n     * @function\n     * @author ippo615\n     * @memberof Konva.Filters\n     * @param {ImageData} src, the source image data (what will be transformed)\n     * @param {ImageData} dst, the destination image data (where it will be saved)\n     * @param {Object} opt\n     * @param {Number} [opt.polarCenterX] horizontal location for the center of the circle,\n     *  default is in the middle\n     * @param {Number} [opt.polarCenterY] vertical location for the center of the circle,\n     *  default is in the middle\n     * @param {Number} [opt.polarRotation] amount to rotate the image counterclockwis,\n     *  0 is no rotation, 360 degrees is a full rotation\n     */\n\n  var FromPolar = function(src, dst, opt) {\n    var srcPixels = src.data,\n      dstPixels = dst.data,\n      xSize = src.width,\n      ySize = src.height,\n      xMid = opt.polarCenterX || xSize / 2,\n      yMid = opt.polarCenterY || ySize / 2,\n      i,\n      x,\n      y,\n      dx,\n      dy,\n      r = 0,\n      g = 0,\n      b = 0,\n      a = 0;\n\n    // Find the largest radius\n    var rad,\n      rMax = Math.sqrt(xMid * xMid + yMid * yMid);\n    x = xSize - xMid;\n    y = ySize - yMid;\n    rad = Math.sqrt(x * x + y * y);\n    rMax = rad > rMax ? rad : rMax;\n\n    // We'll be uisng x as the radius, and y as the angle (theta=t)\n    var rSize = ySize,\n      tSize = xSize,\n      radius,\n      theta,\n      phaseShift = opt.polarRotation || 0;\n\n    // We need to convert to degrees and we need to make sure\n    // it's between (0-360)\n    // var conversion = tSize/360*180/Math.PI;\n    //var conversion = tSize/360*180/Math.PI;\n\n    var x1, y1;\n\n    for (x = 0; x < xSize; x += 1) {\n      for (y = 0; y < ySize; y += 1) {\n        dx = x - xMid;\n        dy = y - yMid;\n        radius = Math.sqrt(dx * dx + dy * dy) * rSize / rMax;\n        theta = (Math.atan2(dy, dx) * 180 / Math.PI + 360 + phaseShift) % 360;\n        theta = theta * tSize / 360;\n        x1 = Math.floor(theta);\n        y1 = Math.floor(radius);\n        i = (y1 * xSize + x1) * 4;\n        r = srcPixels[i + 0];\n        g = srcPixels[i + 1];\n        b = srcPixels[i + 2];\n        a = srcPixels[i + 3];\n\n        // Store it\n        i = (y * xSize + x) * 4;\n        dstPixels[i + 0] = r;\n        dstPixels[i + 1] = g;\n        dstPixels[i + 2] = b;\n        dstPixels[i + 3] = a;\n      }\n    }\n  };\n\n  //Konva.Filters.ToPolar = Konva.Util._FilterWrapDoubleBuffer(ToPolar);\n  //Konva.Filters.FromPolar = Konva.Util._FilterWrapDoubleBuffer(FromPolar);\n\n  // create a temporary canvas for working - shared between multiple calls\n\n  /*\n     * Kaleidoscope Filter.\n     * @function\n     * @name Kaleidoscope\n     * @author ippo615\n     * @memberof Konva.Filters\n     * @example\n     * node.cache();\n     * node.filters([Konva.Filters.Kaleidoscope]);\n     * node.kaleidoscopePower(3);\n     * node.kaleidoscopeAngle(45);\n     */\n  Konva.Filters.Kaleidoscope = function(imageData) {\n    var xSize = imageData.width,\n      ySize = imageData.height;\n\n    var x, y, xoff, i, r, g, b, a, srcPos, dstPos;\n    var power = Math.round(this.kaleidoscopePower());\n    var angle = Math.round(this.kaleidoscopeAngle());\n    var offset = Math.floor(xSize * (angle % 360) / 360);\n\n    if (power < 1) {\n      return;\n    }\n\n    // Work with our shared buffer canvas\n    var tempCanvas = Konva.Util.createCanvasElement();\n    tempCanvas.width = xSize;\n    tempCanvas.height = ySize;\n    var scratchData = tempCanvas\n      .getContext('2d')\n      .getImageData(0, 0, xSize, ySize);\n\n    // Convert thhe original to polar coordinates\n    ToPolar(imageData, scratchData, {\n      polarCenterX: xSize / 2,\n      polarCenterY: ySize / 2\n    });\n\n    // Determine how big each section will be, if it's too small\n    // make it bigger\n    var minSectionSize = xSize / Math.pow(2, power);\n    while (minSectionSize <= 8) {\n      minSectionSize = minSectionSize * 2;\n      power -= 1;\n    }\n    minSectionSize = Math.ceil(minSectionSize);\n    var sectionSize = minSectionSize;\n\n    // Copy the offset region to 0\n    // Depending on the size of filter and location of the offset we may need\n    // to copy the section backwards to prevent it from rewriting itself\n    var xStart = 0,\n      xEnd = sectionSize,\n      xDelta = 1;\n    if (offset + minSectionSize > xSize) {\n      xStart = sectionSize;\n      xEnd = 0;\n      xDelta = -1;\n    }\n    for (y = 0; y < ySize; y += 1) {\n      for (x = xStart; x !== xEnd; x += xDelta) {\n        xoff = Math.round(x + offset) % xSize;\n        srcPos = (xSize * y + xoff) * 4;\n        r = scratchData.data[srcPos + 0];\n        g = scratchData.data[srcPos + 1];\n        b = scratchData.data[srcPos + 2];\n        a = scratchData.data[srcPos + 3];\n        dstPos = (xSize * y + x) * 4;\n        scratchData.data[dstPos + 0] = r;\n        scratchData.data[dstPos + 1] = g;\n        scratchData.data[dstPos + 2] = b;\n        scratchData.data[dstPos + 3] = a;\n      }\n    }\n\n    // Perform the actual effect\n    for (y = 0; y < ySize; y += 1) {\n      sectionSize = Math.floor(minSectionSize);\n      for (i = 0; i < power; i += 1) {\n        for (x = 0; x < sectionSize + 1; x += 1) {\n          srcPos = (xSize * y + x) * 4;\n          r = scratchData.data[srcPos + 0];\n          g = scratchData.data[srcPos + 1];\n          b = scratchData.data[srcPos + 2];\n          a = scratchData.data[srcPos + 3];\n          dstPos = (xSize * y + sectionSize * 2 - x - 1) * 4;\n          scratchData.data[dstPos + 0] = r;\n          scratchData.data[dstPos + 1] = g;\n          scratchData.data[dstPos + 2] = b;\n          scratchData.data[dstPos + 3] = a;\n        }\n        sectionSize *= 2;\n      }\n    }\n\n    // Convert back from polar coordinates\n    FromPolar(scratchData, imageData, { polarRotation: 0 });\n  };\n\n  /**\n    * get/set kaleidoscope power. Use with {@link Konva.Filters.Kaleidoscope} filter.\n    * @name kaleidoscopePower\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} power of kaleidoscope\n    * @returns {Integer}\n    */\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'kaleidoscopePower',\n    2,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n\n  /**\n    * get/set kaleidoscope angle. Use with {@link Konva.Filters.Kaleidoscope} filter.\n    * @name kaleidoscopeAngle\n    * @method\n    * @memberof Konva.Node.prototype\n    * @param {Integer} degrees\n    * @returns {Integer}\n    */\n  Konva.Factory.addGetterSetter(\n    Konva.Node,\n    'kaleidoscopeAngle',\n    0,\n    null,\n    Konva.Factory.afterSetFilter\n  );\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Container constructor.&nbsp; Containers are used to contain nodes or other containers\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Node\n     * @abstract\n     * @param {Object} config\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * * @param {Object} [config.clip] set clip\n     * @param {Number} [config.clipX] set clip x\n     * @param {Number} [config.clipY] set clip y\n     * @param {Number} [config.clipWidth] set clip width\n     * @param {Number} [config.clipHeight] set clip height\n     * @param {Function} [config.clipFunc] set clip func\n\n     */\n  Konva.Container = function(config) {\n    this.__init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Container, {\n    __init: function(config) {\n      this.children = new Konva.Collection();\n      Konva.Node.call(this, config);\n    },\n    /**\n         * returns a {@link Konva.Collection} of direct descendant nodes\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {Function} [filterFunc] filter function\n         * @returns {Konva.Collection}\n         * @example\n         * // get all children\n         * var children = layer.getChildren();\n         *\n         * // get only circles\n         * var circles = layer.getChildren(function(node){\n         *    return node.getClassName() === 'Circle';\n         * });\n         */\n    getChildren: function(filterFunc) {\n      if (!filterFunc) {\n        return this.children;\n      }\n\n      var results = new Konva.Collection();\n      this.children.each(function(child) {\n        if (filterFunc(child)) {\n          results.push(child);\n        }\n      });\n      return results;\n    },\n    /**\n         * determine if node has children\n         * @method\n         * @memberof Konva.Container.prototype\n         * @returns {Boolean}\n         */\n    hasChildren: function() {\n      return this.getChildren().length > 0;\n    },\n    /**\n         * remove all children\n         * @method\n         * @memberof Konva.Container.prototype\n         */\n    removeChildren: function() {\n      var children = Konva.Collection.toCollection(this.children);\n      var child;\n      for (var i = 0; i < children.length; i++) {\n        child = children[i];\n        // reset parent to prevent many _setChildrenIndices calls\n        delete child.parent;\n        child.index = 0;\n        child.remove();\n      }\n      children = null;\n      this.children = new Konva.Collection();\n      return this;\n    },\n    /**\n         * destroy all children\n         * @method\n         * @memberof Konva.Container.prototype\n         */\n    destroyChildren: function() {\n      var children = Konva.Collection.toCollection(this.children);\n      var child;\n      for (var i = 0; i < children.length; i++) {\n        child = children[i];\n        // reset parent to prevent many _setChildrenIndices calls\n        delete child.parent;\n        child.index = 0;\n        child.destroy();\n      }\n      children = null;\n      this.children = new Konva.Collection();\n      return this;\n    },\n    /**\n         * Add node or nodes to container.\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {...Konva.Node} child\n         * @returns {Container}\n         * @example\n         * layer.add(shape1, shape2, shape3);\n         */\n    add: function(child) {\n      if (arguments.length > 1) {\n        for (var i = 0; i < arguments.length; i++) {\n          this.add(arguments[i]);\n        }\n        return this;\n      }\n      if (child.getParent()) {\n        child.moveTo(this);\n        return this;\n      }\n      var children = this.children;\n      this._validateAdd(child);\n      child.index = children.length;\n      child.parent = this;\n      children.push(child);\n      this._fire('add', {\n        child: child\n      });\n\n      // if node under drag we need to update drag animation\n      if (Konva.DD && child.isDragging()) {\n        Konva.DD.anim.setLayers(child.getLayer());\n      }\n\n      // chainable\n      return this;\n    },\n    destroy: function() {\n      // destroy children\n      if (this.hasChildren()) {\n        this.destroyChildren();\n      }\n      // then destroy self\n      Konva.Node.prototype.destroy.call(this);\n      return this;\n    },\n    /**\n         * return a {@link Konva.Collection} of nodes that match the selector.  Use '#' for id selections\n         * and '.' for name selections.  You can also select by type or class name. Pass multiple selectors\n         * separated by a space.\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {String} selector\n         * @returns {Collection}\n         * @example\n         * // select node with id foo\n         * var node = stage.find('#foo');\n         *\n         * // select nodes with name bar inside layer\n         * var nodes = layer.find('.bar');\n         *\n         * // select all groups inside layer\n         * var nodes = layer.find('Group');\n         *\n         * // select all rectangles inside layer\n         * var nodes = layer.find('Rect');\n         *\n         * // select node with an id of foo or a name of bar inside layer\n         * var nodes = layer.find('#foo, .bar');\n         */\n    find: function(selector) {\n      var retArr = [],\n        selectorArr = selector.replace(/ /g, '').split(','),\n        len = selectorArr.length,\n        n,\n        i,\n        sel,\n        arr,\n        node,\n        children,\n        clen;\n\n      for (n = 0; n < len; n++) {\n        sel = selectorArr[n];\n        if (!Konva.Util.isValidSelector(sel)) {\n          Konva.Util.warn(\n            'Selector \"' +\n              sel +\n              '\" is invalid. Allowed selectors examples are \"#foo\", \".bar\" or \"Group\".'\n          );\n          Konva.Util.warn(\n            'If you have a custom shape with such className, please change it to start with upper letter like \"Triangle\".'\n          );\n          Konva.Util.warn('Konva is awesome, right?');\n        }\n        // id selector\n        if (sel.charAt(0) === '#') {\n          node = this._getNodeById(sel.slice(1));\n          if (node) {\n            retArr.push(node);\n          }\n        } else if (sel.charAt(0) === '.') {\n          // name selector\n          arr = this._getNodesByName(sel.slice(1));\n          retArr = retArr.concat(arr);\n        } else {\n          // unrecognized selector, pass to children\n          children = this.getChildren();\n          clen = children.length;\n          for (i = 0; i < clen; i++) {\n            retArr = retArr.concat(children[i]._get(sel));\n          }\n        }\n      }\n\n      return Konva.Collection.toCollection(retArr);\n    },\n    /**\n         * return a first node from `find` method\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {String} selector\n         * @returns {Konva.Node}\n         * @example\n         * // select node with id foo\n         * var node = stage.findOne('#foo');\n         *\n         * // select node with name bar inside layer\n         * var nodes = layer.findOne('.bar');\n         */\n    findOne: function(selector) {\n      return this.find(selector)[0];\n    },\n    _getNodeById: function(key) {\n      var node = Konva.ids[key];\n\n      if (node !== undefined && this.isAncestorOf(node)) {\n        return node;\n      }\n      return null;\n    },\n    _getNodesByName: function(key) {\n      var arr = Konva.names[key] || [];\n      return this._getDescendants(arr);\n    },\n    _get: function(selector) {\n      var retArr = Konva.Node.prototype._get.call(this, selector);\n      var children = this.getChildren();\n      var len = children.length;\n      for (var n = 0; n < len; n++) {\n        retArr = retArr.concat(children[n]._get(selector));\n      }\n      return retArr;\n    },\n    // extenders\n    toObject: function() {\n      var obj = Konva.Node.prototype.toObject.call(this);\n\n      obj.children = [];\n\n      var children = this.getChildren();\n      var len = children.length;\n      for (var n = 0; n < len; n++) {\n        var child = children[n];\n        obj.children.push(child.toObject());\n      }\n\n      return obj;\n    },\n    _getDescendants: function(arr) {\n      var retArr = [];\n      var len = arr.length;\n      for (var n = 0; n < len; n++) {\n        var node = arr[n];\n        if (this.isAncestorOf(node)) {\n          retArr.push(node);\n        }\n      }\n\n      return retArr;\n    },\n    /**\n         * determine if node is an ancestor\n         * of descendant\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {Konva.Node} node\n         */\n    isAncestorOf: function(node) {\n      var parent = node.getParent();\n      while (parent) {\n        if (parent._id === this._id) {\n          return true;\n        }\n        parent = parent.getParent();\n      }\n\n      return false;\n    },\n    clone: function(obj) {\n      // call super method\n      var node = Konva.Node.prototype.clone.call(this, obj);\n\n      this.getChildren().each(function(no) {\n        node.add(no.clone());\n      });\n      return node;\n    },\n    /**\n         * get all shapes that intersect a point.  Note: because this method must clear a temporary\n         * canvas and redraw every shape inside the container, it should only be used for special sitations\n         * because it performs very poorly.  Please use the {@link Konva.Stage#getIntersection} method if at all possible\n         * because it performs much better\n         * @method\n         * @memberof Konva.Container.prototype\n         * @param {Object} pos\n         * @param {Number} pos.x\n         * @param {Number} pos.y\n         * @returns {Array} array of shapes\n         */\n    getAllIntersections: function(pos) {\n      var arr = [];\n\n      this.find('Shape').each(function(shape) {\n        if (shape.isVisible() && shape.intersects(pos)) {\n          arr.push(shape);\n        }\n      });\n\n      return arr;\n    },\n    _setChildrenIndices: function() {\n      this.children.each(function(child, n) {\n        child.index = n;\n      });\n    },\n    drawScene: function(can, top, caching) {\n      var layer = this.getLayer(),\n        canvas = can || (layer && layer.getCanvas()),\n        context = canvas && canvas.getContext(),\n        cachedCanvas = this._cache.canvas,\n        cachedSceneCanvas = cachedCanvas && cachedCanvas.scene;\n\n      if (this.isVisible()) {\n        if (!caching && cachedSceneCanvas) {\n          context.save();\n          layer._applyTransform(this, context, top);\n          this._drawCachedSceneCanvas(context);\n          context.restore();\n        } else {\n          this._drawChildren(canvas, 'drawScene', top, false, caching);\n        }\n      }\n      return this;\n    },\n    drawHit: function(can, top, caching) {\n      var layer = this.getLayer(),\n        canvas = can || (layer && layer.hitCanvas),\n        context = canvas && canvas.getContext(),\n        cachedCanvas = this._cache.canvas,\n        cachedHitCanvas = cachedCanvas && cachedCanvas.hit;\n\n      if (this.shouldDrawHit(canvas)) {\n        if (layer) {\n          layer.clearHitCache();\n        }\n        if (!caching && cachedHitCanvas) {\n          context.save();\n          layer._applyTransform(this, context, top);\n          this._drawCachedHitCanvas(context);\n          context.restore();\n        } else {\n          this._drawChildren(canvas, 'drawHit', top);\n        }\n      }\n      return this;\n    },\n    _drawChildren: function(canvas, drawMethod, top, caching, skipBuffer) {\n      var layer = this.getLayer(),\n        context = canvas && canvas.getContext(),\n        clipWidth = this.getClipWidth(),\n        clipHeight = this.getClipHeight(),\n        clipFunc = this.getClipFunc(),\n        hasClip = (clipWidth && clipHeight) || clipFunc,\n        clipX,\n        clipY;\n\n      if (hasClip && layer) {\n        context.save();\n        var transform = this.getAbsoluteTransform(top);\n        var m = transform.getMatrix();\n        context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n        context.beginPath();\n        if (clipFunc) {\n          clipFunc.call(this, context, this);\n        } else {\n          clipX = this.getClipX();\n          clipY = this.getClipY();\n          context.rect(clipX, clipY, clipWidth, clipHeight);\n        }\n        context.clip();\n        m = transform.copy().invert().getMatrix();\n        context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n      }\n\n      this.children.each(function(child) {\n        child[drawMethod](canvas, top, caching, skipBuffer);\n      });\n\n      if (hasClip) {\n        context.restore();\n      }\n    },\n    shouldDrawHit: function(canvas) {\n      var layer = this.getLayer();\n      var dd = Konva.DD;\n      var layerUnderDrag =\n        dd &&\n        Konva.isDragging() &&\n        Konva.DD.anim.getLayers().indexOf(layer) !== -1;\n      return (\n        (canvas && canvas.isCache) ||\n        (layer &&\n          layer.hitGraphEnabled() &&\n          this.isVisible() &&\n          !layerUnderDrag)\n      );\n    },\n    getClientRect: function(attrs) {\n      attrs = attrs || {};\n      var skipTransform = attrs.skipTransform;\n      var relativeTo = attrs.relativeTo;\n\n      var minX, minY, maxX, maxY;\n      var selfRect = {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0\n      };\n      var that = this;\n      this.children.each(function(child) {\n        // skip invisible children\n        if (!child.isVisible()) {\n          return;\n        }\n        var rect = child.getClientRect({ relativeTo: that });\n\n        // skip invisible children (like empty groups)\n        // or don't skip... hmmm...\n        // if (rect.width === 0 && rect.height === 0) {\n        //     return;\n        // }\n\n        if (minX === undefined) {\n          // initial value for first child\n          minX = rect.x;\n          minY = rect.y;\n          maxX = rect.x + rect.width;\n          maxY = rect.y + rect.height;\n        } else {\n          minX = Math.min(minX, rect.x);\n          minY = Math.min(minY, rect.y);\n          maxX = Math.max(maxX, rect.x + rect.width);\n          maxY = Math.max(maxY, rect.y + rect.height);\n        }\n      });\n\n      if (this.children.length !== 0) {\n        selfRect = {\n          x: minX,\n          y: minY,\n          width: maxX - minX,\n          height: maxY - minY\n        };\n      }\n\n      if (!skipTransform) {\n        return this._transformedRect(selfRect, relativeTo);\n      }\n      return selfRect;\n    }\n  });\n\n  Konva.Util.extend(Konva.Container, Konva.Node);\n  // deprecated methods\n  Konva.Container.prototype.get = Konva.Container.prototype.find;\n\n  // add getters setters\n  Konva.Factory.addComponentsGetterSetter(Konva.Container, 'clip', [\n    'x',\n    'y',\n    'width',\n    'height'\n  ]);\n  /**\n     * get/set clip\n     * @method\n     * @name clip\n     * @memberof Konva.Container.prototype\n     * @param {Object} clip\n     * @param {Number} clip.x\n     * @param {Number} clip.y\n     * @param {Number} clip.width\n     * @param {Number} clip.height\n     * @returns {Object}\n     * @example\n     * // get clip\n     * var clip = container.clip();\n     *\n     * // set clip\n     * container.setClip({\n     *   x: 20,\n     *   y: 20,\n     *   width: 20,\n     *   height: 20\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Container, 'clipX');\n  /**\n     * get/set clip x\n     * @name clipX\n     * @method\n     * @memberof Konva.Container.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get clip x\n     * var clipX = container.clipX();\n     *\n     * // set clip x\n     * container.clipX(10);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Container, 'clipY');\n  /**\n     * get/set clip y\n     * @name clipY\n     * @method\n     * @memberof Konva.Container.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get clip y\n     * var clipY = container.clipY();\n     *\n     * // set clip y\n     * container.clipY(10);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Container, 'clipWidth');\n  /**\n     * get/set clip width\n     * @name clipWidth\n     * @method\n     * @memberof Konva.Container.prototype\n     * @param {Number} width\n     * @returns {Number}\n     * @example\n     * // get clip width\n     * var clipWidth = container.clipWidth();\n     *\n     * // set clip width\n     * container.clipWidth(100);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Container, 'clipHeight');\n  /**\n     * get/set clip height\n     * @name clipHeight\n     * @method\n     * @memberof Konva.Container.prototype\n     * @param {Number} height\n     * @returns {Number}\n     * @example\n     * // get clip height\n     * var clipHeight = container.clipHeight();\n     *\n     * // set clip height\n     * container.clipHeight(100);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Container, 'clipFunc');\n  /**\n      * get/set clip function\n      * @name clipFunc\n      * @method\n      * @memberof Konva.Container.prototype\n      * @param {Function} function\n      * @returns {Function}\n      * @example\n      * // get clip function\n      * var clipFunction = container.clipFunc();\n      *\n      * // set clip height\n      * container.clipFunc(function(ctx) {\n      *   ctx.rect(0, 0, 100, 100);\n      * });\n      */\n\n  Konva.Collection.mapMethods(Konva.Container);\n})();\n\n(function(Konva) {\n  'use strict';\n  var HAS_SHADOW = 'hasShadow';\n  var SHADOW_RGBA = 'shadowRGBA';\n\n  function _fillFunc(context) {\n    context.fill();\n  }\n  function _strokeFunc(context) {\n    context.stroke();\n  }\n  function _fillFuncHit(context) {\n    context.fill();\n  }\n  function _strokeFuncHit(context) {\n    context.stroke();\n  }\n\n  function _clearHasShadowCache() {\n    this._clearCache(HAS_SHADOW);\n  }\n\n  function _clearGetShadowRGBACache() {\n    this._clearCache(SHADOW_RGBA);\n  }\n\n  /**\n     * Shape constructor.  Shapes are primitive objects such as rectangles,\n     *  circles, text, lines, etc.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Node\n     * @param {Object} config\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var customShape = new Konva.Shape({\n         *   x: 5,\n         *   y: 10,\n         *   fill: 'red',\n         *   // a Konva.Canvas renderer is passed into the drawFunc function\n         *   drawFunc: function(context) {\n         *     context.beginPath();\n         *     context.moveTo(200, 50);\n         *     context.lineTo(420, 80);\n         *     context.quadraticCurveTo(300, 100, 260, 170);\n         *     context.closePath();\n         *     context.fillStrokeShape(this);\n         *   }\n         *});\n     */\n  Konva.Shape = function(config) {\n    this.__init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Shape, {\n    __init: function(config) {\n      this.nodeType = 'Shape';\n      this._fillFunc = _fillFunc;\n      this._strokeFunc = _strokeFunc;\n      this._fillFuncHit = _fillFuncHit;\n      this._strokeFuncHit = _strokeFuncHit;\n\n      // set colorKey\n      var shapes = Konva.shapes;\n      var key;\n\n      while (true) {\n        key = Konva.Util.getRandomColor();\n        if (key && !(key in shapes)) {\n          break;\n        }\n      }\n\n      this.colorKey = key;\n      shapes[key] = this;\n\n      // call super constructor\n      Konva.Node.call(this, config);\n\n      this.on(\n        'shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva',\n        _clearHasShadowCache\n      );\n\n      this.on(\n        'shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva',\n        _clearGetShadowRGBACache\n      );\n    },\n    hasChildren: function() {\n      return false;\n    },\n    getChildren: function() {\n      return [];\n    },\n    /**\n         * get canvas context tied to the layer\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Konva.Context}\n         */\n    getContext: function() {\n      return this.getLayer().getContext();\n    },\n    /**\n         * get canvas renderer tied to the layer.  Note that this returns a canvas renderer, not a canvas element\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Konva.Canvas}\n         */\n    getCanvas: function() {\n      return this.getLayer().getCanvas();\n    },\n    /**\n         * returns whether or not a shadow will be rendered\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Boolean}\n         */\n    hasShadow: function() {\n      return this._getCache(HAS_SHADOW, this._hasShadow);\n    },\n    _hasShadow: function() {\n      return (\n        this.getShadowEnabled() &&\n        (this.getShadowOpacity() !== 0 &&\n          !!(this.getShadowColor() ||\n            this.getShadowBlur() ||\n            this.getShadowOffsetX() ||\n            this.getShadowOffsetY()))\n      );\n    },\n    getShadowRGBA: function() {\n      return this._getCache(SHADOW_RGBA, this._getShadowRGBA);\n    },\n    _getShadowRGBA: function() {\n      if (this.hasShadow()) {\n        var rgba = Konva.Util.colorToRGBA(this.shadowColor());\n        return (\n          'rgba(' +\n          rgba.r +\n          ',' +\n          rgba.g +\n          ',' +\n          rgba.b +\n          ',' +\n          rgba.a * (this.getShadowOpacity() || 1) +\n          ')'\n        );\n      }\n    },\n    /**\n         * returns whether or not the shape will be filled\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Boolean}\n         */\n    hasFill: function() {\n      return !!(this.getFill() ||\n        this.getFillPatternImage() ||\n        this.getFillLinearGradientColorStops() ||\n        this.getFillRadialGradientColorStops());\n    },\n    /**\n         * returns whether or not the shape will be stroked\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Boolean}\n         */\n    hasStroke: function() {\n      return this.strokeEnabled() && !!this.stroke();\n    },\n    /**\n         * determines if point is in the shape, regardless if other shapes are on top of it.  Note: because\n         *  this method clears a temporary canvas and then redraws the shape, it performs very poorly if executed many times\n         *  consecutively.  Please use the {@link Konva.Stage#getIntersection} method if at all possible\n         *  because it performs much better\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @param {Object} point\n         * @param {Number} point.x\n         * @param {Number} point.y\n         * @returns {Boolean}\n         */\n    intersects: function(point) {\n      var stage = this.getStage(), bufferHitCanvas = stage.bufferHitCanvas, p;\n\n      bufferHitCanvas.getContext().clear();\n      this.drawHit(bufferHitCanvas);\n      p = bufferHitCanvas.context.getImageData(\n        Math.round(point.x),\n        Math.round(point.y),\n        1,\n        1\n      ).data;\n      return p[3] > 0;\n    },\n    // extends Node.prototype.destroy\n    destroy: function() {\n      Konva.Node.prototype.destroy.call(this);\n      delete Konva.shapes[this.colorKey];\n      return this;\n    },\n    _useBufferCanvas: function(caching) {\n      return (\n        (!caching &&\n          (this.perfectDrawEnabled() &&\n            this.getAbsoluteOpacity() !== 1 &&\n            this.hasFill() &&\n            this.hasStroke() &&\n            this.getStage())) ||\n        (this.perfectDrawEnabled() &&\n          this.hasShadow() &&\n          this.getAbsoluteOpacity() !== 1 &&\n          this.hasFill() &&\n          this.hasStroke() &&\n          this.getStage())\n      );\n    },\n    /**\n         * return self rectangle (x, y, width, height) of shape.\n         * This method are not taken into account transformation and styles.\n         * @method\n         * @memberof Konva.Shape.prototype\n         * @returns {Object} rect with {x, y, width, height} properties\n         * @example\n         *\n         * rect.getSelfRect();  // return {x:0, y:0, width:rect.width(), height:rect.height()}\n         * circle.getSelfRect();  // return {x: - circle.width() / 2, y: - circle.height() / 2, width:circle.width(), height:circle.height()}\n         *\n         */\n    getSelfRect: function() {\n      var size = this.getSize();\n      return {\n        x: this._centroid ? Math.round(-size.width / 2) : 0,\n        y: this._centroid ? Math.round(-size.height / 2) : 0,\n        width: size.width,\n        height: size.height\n      };\n    },\n    getClientRect: function(attrs) {\n      attrs = attrs || {};\n      var skipTransform = attrs.skipTransform;\n      var relativeTo = attrs.relativeTo;\n\n      var fillRect = this.getSelfRect();\n\n      var strokeWidth = (this.hasStroke() && this.strokeWidth()) || 0;\n      var fillAndStrokeWidth = fillRect.width + strokeWidth;\n      var fillAndStrokeHeight = fillRect.height + strokeWidth;\n\n      var shadowOffsetX = this.hasShadow() ? this.shadowOffsetX() : 0;\n      var shadowOffsetY = this.hasShadow() ? this.shadowOffsetY() : 0;\n\n      var preWidth = fillAndStrokeWidth + Math.abs(shadowOffsetX);\n      var preHeight = fillAndStrokeHeight + Math.abs(shadowOffsetY);\n\n      var blurRadius = (this.hasShadow() && this.shadowBlur()) || 0;\n\n      var width = preWidth + blurRadius * 2;\n      var height = preHeight + blurRadius * 2;\n\n      // if stroke, for example = 3\n      // we need to set x to 1.5, but after Math.round it will be 2\n      // as we have additional offset we need to increase width and height by 1 pixel\n      var roundingOffset = 0;\n      if (Math.round(strokeWidth / 2) !== strokeWidth / 2) {\n        roundingOffset = 1;\n      }\n      var rect = {\n        width: width + roundingOffset,\n        height: height + roundingOffset,\n        x: -Math.round(strokeWidth / 2 + blurRadius) +\n          Math.min(shadowOffsetX, 0) +\n          fillRect.x,\n        y: -Math.round(strokeWidth / 2 + blurRadius) +\n          Math.min(shadowOffsetY, 0) +\n          fillRect.y\n      };\n      if (!skipTransform) {\n        return this._transformedRect(rect, relativeTo);\n      }\n      return rect;\n    },\n    drawScene: function(can, top, caching, skipBuffer) {\n      var layer = this.getLayer(),\n        canvas = can || layer.getCanvas(),\n        context = canvas.getContext(),\n        cachedCanvas = this._cache.canvas,\n        drawFunc = this.sceneFunc(),\n        hasShadow = this.hasShadow(),\n        hasStroke = this.hasStroke(),\n        stage,\n        bufferCanvas,\n        bufferContext;\n\n      if (!this.isVisible()) {\n        return this;\n      }\n      if (cachedCanvas) {\n        context.save();\n        layer._applyTransform(this, context, top);\n        this._drawCachedSceneCanvas(context);\n        context.restore();\n        return this;\n      }\n      if (!drawFunc) {\n        return this;\n      }\n      context.save();\n      // if buffer canvas is needed\n      if (this._useBufferCanvas(caching) && !skipBuffer) {\n        stage = this.getStage();\n        bufferCanvas = stage.bufferCanvas;\n        bufferContext = bufferCanvas.getContext();\n        bufferContext.clear();\n        bufferContext.save();\n        bufferContext._applyLineJoin(this);\n        // layer might be undefined if we are using cache before adding to layer\n        if (!caching) {\n          if (layer) {\n            layer._applyTransform(this, bufferContext, top);\n          } else {\n            var m = this.getAbsoluteTransform(top).getMatrix();\n            context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n          }\n        }\n\n        drawFunc.call(this, bufferContext);\n        bufferContext.restore();\n\n        var ratio = bufferCanvas.pixelRatio;\n        if (hasShadow && !canvas.hitCanvas) {\n          context.save();\n\n          context._applyShadow(this);\n          context._applyOpacity(this);\n          context._applyGlobalCompositeOperation(this);\n          context.drawImage(\n            bufferCanvas._canvas,\n            0,\n            0,\n            bufferCanvas.width / ratio,\n            bufferCanvas.height / ratio\n          );\n          context.restore();\n        } else {\n          context._applyOpacity(this);\n          context._applyGlobalCompositeOperation(this);\n          context.drawImage(\n            bufferCanvas._canvas,\n            0,\n            0,\n            bufferCanvas.width / ratio,\n            bufferCanvas.height / ratio\n          );\n        }\n      } else {\n        // if buffer canvas is not needed\n        context._applyLineJoin(this);\n        // layer might be undefined if we are using cache before adding to layer\n        if (!caching) {\n          if (layer) {\n            layer._applyTransform(this, context, top);\n          } else {\n            var o = this.getAbsoluteTransform(top).getMatrix();\n            context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);\n          }\n        }\n\n        if (hasShadow && hasStroke && !canvas.hitCanvas) {\n          context.save();\n          // apply shadow\n          if (!caching) {\n            context._applyOpacity(this);\n            context._applyGlobalCompositeOperation(this);\n          }\n          context._applyShadow(this);\n\n          drawFunc.call(this, context);\n          context.restore();\n          // if shape has stroke we need to redraw shape\n          // otherwise we will see a shadow under stroke (and over fill)\n          // but I think this is unexpected behavior\n          if (this.hasFill() && this.getShadowForStrokeEnabled()) {\n            drawFunc.call(this, context);\n          }\n        } else if (hasShadow && !canvas.hitCanvas) {\n          context.save();\n          if (!caching) {\n            context._applyOpacity(this);\n            context._applyGlobalCompositeOperation(this);\n          }\n          context._applyShadow(this);\n          drawFunc.call(this, context);\n          context.restore();\n        } else {\n          if (!caching) {\n            context._applyOpacity(this);\n            context._applyGlobalCompositeOperation(this);\n          }\n          drawFunc.call(this, context);\n        }\n      }\n      context.restore();\n      return this;\n    },\n    drawHit: function(can, top, caching) {\n      var layer = this.getLayer(),\n        canvas = can || layer.hitCanvas,\n        context = canvas.getContext(),\n        drawFunc = this.hitFunc() || this.sceneFunc(),\n        cachedCanvas = this._cache.canvas,\n        cachedHitCanvas = cachedCanvas && cachedCanvas.hit;\n\n      if (!this.shouldDrawHit(canvas)) {\n        return this;\n      }\n      if (layer) {\n        layer.clearHitCache();\n      }\n      if (cachedHitCanvas) {\n        context.save();\n        layer._applyTransform(this, context, top);\n        this._drawCachedHitCanvas(context);\n        context.restore();\n        return this;\n      }\n      if (!drawFunc) {\n        return this;\n      }\n      context.save();\n      context._applyLineJoin(this);\n      if (!caching) {\n        if (layer) {\n          layer._applyTransform(this, context, top);\n        } else {\n          var o = this.getAbsoluteTransform(top).getMatrix();\n          context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);\n        }\n      }\n      drawFunc.call(this, context);\n      context.restore();\n      return this;\n    },\n    /**\n        * draw hit graph using the cached scene canvas\n        * @method\n        * @memberof Konva.Shape.prototype\n        * @param {Integer} alphaThreshold alpha channel threshold that determines whether or not\n        *  a pixel should be drawn onto the hit graph.  Must be a value between 0 and 255.\n        *  The default is 0\n        * @returns {Konva.Shape}\n        * @example\n        * shape.cache();\n        * shape.drawHitFromCache();\n        */\n    drawHitFromCache: function(alphaThreshold) {\n      var threshold = alphaThreshold || 0,\n        cachedCanvas = this._cache.canvas,\n        sceneCanvas = this._getCachedSceneCanvas(),\n        hitCanvas = cachedCanvas.hit,\n        hitContext = hitCanvas.getContext(),\n        hitWidth = hitCanvas.getWidth(),\n        hitHeight = hitCanvas.getHeight(),\n        hitImageData,\n        hitData,\n        len,\n        rgbColorKey,\n        i,\n        alpha;\n\n      hitContext.clear();\n      hitContext.drawImage(sceneCanvas._canvas, 0, 0, hitWidth, hitHeight);\n\n      try {\n        hitImageData = hitContext.getImageData(0, 0, hitWidth, hitHeight);\n        hitData = hitImageData.data;\n        len = hitData.length;\n        rgbColorKey = Konva.Util._hexToRgb(this.colorKey);\n\n        // replace non transparent pixels with color key\n        for (i = 0; i < len; i += 4) {\n          alpha = hitData[i + 3];\n          if (alpha > threshold) {\n            hitData[i] = rgbColorKey.r;\n            hitData[i + 1] = rgbColorKey.g;\n            hitData[i + 2] = rgbColorKey.b;\n            hitData[i + 3] = 255;\n          } else {\n            hitData[i + 3] = 0;\n          }\n        }\n        hitContext.putImageData(hitImageData, 0, 0);\n      } catch (e) {\n        Konva.Util.error(\n          'Unable to draw hit graph from cached scene canvas. ' + e.message\n        );\n      }\n\n      return this;\n    }\n  });\n  Konva.Util.extend(Konva.Shape, Konva.Node);\n\n  // add getters and setters\n  Konva.Factory.addGetterSetter(Konva.Shape, 'stroke');\n\n  /**\n     * get/set stroke color\n     * @name stroke\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} color\n     * @returns {String}\n     * @example\n     * // get stroke color\n     * var stroke = shape.stroke();\n     *\n     * // set stroke color with color string\n     * shape.stroke('green');\n     *\n     * // set stroke color with hex\n     * shape.stroke('#00ff00');\n     *\n     * // set stroke color with rgb\n     * shape.stroke('rgb(0,255,0)');\n     *\n     * // set stroke color with rgba and make it 50% opaque\n     * shape.stroke('rgba(0,255,0,0.5');\n     */\n\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'strokeRed',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'strokeGreen',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'strokeBlue',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'strokeAlpha',\n    1,\n    Konva.Validators.alphaComponent\n  );\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'strokeWidth', 2);\n\n  /**\n     * get/set stroke width\n     * @name strokeWidth\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} strokeWidth\n     * @returns {Number}\n     * @example\n     * // get stroke width\n     * var strokeWidth = shape.strokeWidth();\n     *\n     * // set stroke width\n     * shape.strokeWidth();\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'strokeHitEnabled', true);\n\n  /**\n     * get/set strokeHitEnabled property. Useful for performance optimization.\n     * You may set `shape.strokeHitEnabled(false)`. In this case stroke will be no draw on hit canvas, so hit area\n     * of shape will be decreased (by lineWidth / 2). Remember that non closed line with `strokeHitEnabled = false`\n     * will be not drawn on hit canvas, that is mean line will no trigger pointer events (like mouseover)\n     * Default value is true\n     * @name strokeHitEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} strokeHitEnabled\n     * @returns {Boolean}\n     * @example\n     * // get strokeHitEnabled\n     * var strokeHitEnabled = shape.strokeHitEnabled();\n     *\n     * // set strokeHitEnabled\n     * shape.strokeHitEnabled();\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'perfectDrawEnabled', true);\n\n  /**\n     * get/set perfectDrawEnabled. If a shape has fill, stroke and opacity you may set `perfectDrawEnabled` to false to improve performance.\n     * See http://konvajs.github.io/docs/performance/Disable_Perfect_Draw.html for more information.\n     * Default value is true\n     * @name perfectDrawEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} perfectDrawEnabled\n     * @returns {Boolean}\n     * @example\n     * // get perfectDrawEnabled\n     * var perfectDrawEnabled = shape.perfectDrawEnabled();\n     *\n     * // set perfectDrawEnabled\n     * shape.perfectDrawEnabled();\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowForStrokeEnabled', true);\n\n  /**\n     * get/set shadowForStrokeEnabled. Useful for performance optimization.\n     * You may set `shape.shadowForStrokeEnabled(false)`. In this case stroke will be no draw shadow for stroke.\n     * Remember if you set `shadowForStrokeEnabled = false` for non closed line - that line with have no shadow!.\n     * Default value is true\n     * @name shadowForStrokeEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} shadowForStrokeEnabled\n     * @returns {Boolean}\n     * @example\n     * // get shadowForStrokeEnabled\n     * var shadowForStrokeEnabled = shape.shadowForStrokeEnabled();\n     *\n     * // set shadowForStrokeEnabled\n     * shape.shadowForStrokeEnabled();\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'lineJoin');\n\n  /**\n     * get/set line join.  Can be miter, round, or bevel.  The\n     *  default is miter\n     * @name lineJoin\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} lineJoin\n     * @returns {String}\n     * @example\n     * // get line join\n     * var lineJoin = shape.lineJoin();\n     *\n     * // set line join\n     * shape.lineJoin('round');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'lineCap');\n\n  /**\n     * get/set line cap.  Can be butt, round, or square\n     * @name lineCap\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} lineCap\n     * @returns {String}\n     * @example\n     * // get line cap\n     * var lineCap = shape.lineCap();\n     *\n     * // set line cap\n     * shape.lineCap('round');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'sceneFunc');\n\n  /**\n     * get/set scene draw function\n     * @name sceneFunc\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Function} drawFunc drawing function\n     * @returns {Function}\n     * @example\n     * // get scene draw function\n     * var sceneFunc = shape.sceneFunc();\n     *\n     * // set scene draw function\n     * shape.sceneFunc(function(context) {\n     *   context.beginPath();\n     *   context.rect(0, 0, this.width(), this.height());\n     *   context.closePath();\n     *   context.fillStrokeShape(this);\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'hitFunc');\n\n  /**\n     * get/set hit draw function\n     * @name hitFunc\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Function} drawFunc drawing function\n     * @returns {Function}\n     * @example\n     * // get hit draw function\n     * var hitFunc = shape.hitFunc();\n     *\n     * // set hit draw function\n     * shape.hitFunc(function(context) {\n     *   context.beginPath();\n     *   context.rect(0, 0, this.width(), this.height());\n     *   context.closePath();\n     *   context.fillStrokeShape(this);\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'dash');\n\n  /**\n     * get/set dash array for stroke.\n     * @name dash\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Array} dash\n     * @returns {Array}\n     * @example\n     *  // apply dashed stroke that is 10px long and 5 pixels apart\n     *  line.dash([10, 5]);\n     *  // apply dashed stroke that is made up of alternating dashed\n     *  // lines that are 10px long and 20px apart, and dots that have\n     *  // a radius of 5px and are 20px apart\n     *  line.dash([10, 20, 0.001, 20]);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'dashOffset', 0);\n\n  /**\n     * get/set dash offset for stroke.\n     * @name dash\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} dash offset\n     * @returns {Number}\n     * @example\n     *  // apply dashed stroke that is 10px long and 5 pixels apart with an offset of 5px\n     *  line.dash([10, 5]);\n     *  line.dashOffset(5);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowColor');\n\n  /**\n     * get/set shadow color\n     * @name shadowColor\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} color\n     * @returns {String}\n     * @example\n     * // get shadow color\n     * var shadow = shape.shadowColor();\n     *\n     * // set shadow color with color string\n     * shape.shadowColor('green');\n     *\n     * // set shadow color with hex\n     * shape.shadowColor('#00ff00');\n     *\n     * // set shadow color with rgb\n     * shape.shadowColor('rgb(0,255,0)');\n     *\n     * // set shadow color with rgba and make it 50% opaque\n     * shape.shadowColor('rgba(0,255,0,0.5');\n     */\n\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'shadowRed',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'shadowGreen',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'shadowBlue',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'shadowAlpha',\n    1,\n    Konva.Validators.alphaComponent\n  );\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowBlur');\n\n  /**\n     * get/set shadow blur\n     * @name shadowBlur\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} blur\n     * @returns {Number}\n     * @example\n     * // get shadow blur\n     * var shadowBlur = shape.shadowBlur();\n     *\n     * // set shadow blur\n     * shape.shadowBlur(10);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowOpacity');\n\n  /**\n     * get/set shadow opacity.  must be a value between 0 and 1\n     * @name shadowOpacity\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} opacity\n     * @returns {Number}\n     * @example\n     * // get shadow opacity\n     * var shadowOpacity = shape.shadowOpacity();\n     *\n     * // set shadow opacity\n     * shape.shadowOpacity(0.5);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Shape, 'shadowOffset', [\n    'x',\n    'y'\n  ]);\n\n  /**\n     * get/set shadow offset\n     * @name shadowOffset\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} offset\n     * @param {Number} offset.x\n     * @param {Number} offset.y\n     * @returns {Object}\n     * @example\n     * // get shadow offset\n     * var shadowOffset = shape.shadowOffset();\n     *\n     * // set shadow offset\n     * shape.shadowOffset({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowOffsetX', 0);\n\n  /**\n     * get/set shadow offset x\n     * @name shadowOffsetX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get shadow offset x\n     * var shadowOffsetX = shape.shadowOffsetX();\n     *\n     * // set shadow offset x\n     * shape.shadowOffsetX(5);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowOffsetY', 0);\n\n  /**\n     * get/set shadow offset y\n     * @name shadowOffsetY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get shadow offset y\n     * var shadowOffsetY = shape.shadowOffsetY();\n     *\n     * // set shadow offset y\n     * shape.shadowOffsetY(5);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternImage');\n\n  /**\n     * get/set fill pattern image\n     * @name fillPatternImage\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Image} image object\n     * @returns {Image}\n     * @example\n     * // get fill pattern image\n     * var fillPatternImage = shape.fillPatternImage();\n     *\n     * // set fill pattern image\n     * var imageObj = new Image();\n     * imageObj.onload = function() {\n     *   shape.fillPatternImage(imageObj);\n     * };\n     * imageObj.src = 'path/to/image/jpg';\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fill');\n\n  /**\n     * get/set fill color\n     * @name fill\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} color\n     * @returns {String}\n     * @example\n     * // get fill color\n     * var fill = shape.fill();\n     *\n     * // set fill color with color string\n     * shape.fill('green');\n     *\n     * // set fill color with hex\n     * shape.fill('#00ff00');\n     *\n     * // set fill color with rgb\n     * shape.fill('rgb(0,255,0)');\n     *\n     * // set fill color with rgba and make it 50% opaque\n     * shape.fill('rgba(0,255,0,0.5');\n     *\n     * // shape without fill\n     * shape.fill(null);\n     */\n\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'fillRed',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'fillGreen',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'fillBlue',\n    0,\n    Konva.Validators.RGBComponent\n  );\n  Konva.Factory.addDeprecatedGetterSetter(\n    Konva.Shape,\n    'fillAlpha',\n    1,\n    Konva.Validators.alphaComponent\n  );\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternX', 0);\n\n  /**\n     * get/set fill pattern x\n     * @name fillPatternX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill pattern x\n     * var fillPatternX = shape.fillPatternX();\n     * // set fill pattern x\n     * shape.fillPatternX(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternY', 0);\n\n  /**\n     * get/set fill pattern y\n     * @name fillPatternY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill pattern y\n     * var fillPatternY = shape.fillPatternY();\n     * // set fill pattern y\n     * shape.fillPatternY(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillLinearGradientColorStops');\n\n  /**\n     * get/set fill linear gradient color stops\n     * @name fillLinearGradientColorStops\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Array} colorStops\n     * @returns {Array} colorStops\n     * @example\n     * // get fill linear gradient color stops\n     * var colorStops = shape.fillLinearGradientColorStops();\n     *\n     * // create a linear gradient that starts with red, changes to blue\n     * // halfway through, and then changes to green\n     * shape.fillLinearGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green');\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Shape,\n    'fillRadialGradientStartRadius',\n    0\n  );\n\n  /**\n     * get/set fill radial gradient start radius\n     * @name fillRadialGradientStartRadius\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} radius\n     * @returns {Number}\n     * @example\n     * // get radial gradient start radius\n     * var startRadius = shape.fillRadialGradientStartRadius();\n     *\n     * // set radial gradient start radius\n     * shape.fillRadialGradientStartRadius(0);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillRadialGradientEndRadius', 0);\n\n  /**\n     * get/set fill radial gradient end radius\n     * @name fillRadialGradientEndRadius\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} radius\n     * @returns {Number}\n     * @example\n     * // get radial gradient end radius\n     * var endRadius = shape.fillRadialGradientEndRadius();\n     *\n     * // set radial gradient end radius\n     * shape.fillRadialGradientEndRadius(100);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillRadialGradientColorStops');\n\n  /**\n     * get/set fill radial gradient color stops\n     * @name fillRadialGradientColorStops\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} colorStops\n     * @returns {Array}\n     * @example\n     * // get fill radial gradient color stops\n     * var colorStops = shape.fillRadialGradientColorStops();\n     *\n     * // create a radial gradient that starts with red, changes to blue\n     * // halfway through, and then changes to green\n     * shape.fillRadialGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternRepeat', 'repeat');\n\n  /**\n     * get/set fill pattern repeat.  Can be 'repeat', 'repeat-x', 'repeat-y', or 'no-repeat'.  The default is 'repeat'\n     * @name fillPatternRepeat\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} repeat\n     * @returns {String}\n     * @example\n     * // get fill pattern repeat\n     * var repeat = shape.fillPatternRepeat();\n     *\n     * // repeat pattern in x direction only\n     * shape.fillPatternRepeat('repeat-x');\n     *\n     * // do not repeat the pattern\n     * shape.fillPatternRepeat('no repeat');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillEnabled', true);\n\n  /**\n     * get/set fill enabled flag\n     * @name fillEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get fill enabled flag\n     * var fillEnabled = shape.fillEnabled();\n     *\n     * // disable fill\n     * shape.fillEnabled(false);\n     *\n     * // enable fill\n     * shape.fillEnabled(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'strokeEnabled', true);\n\n  /**\n     * get/set stroke enabled flag\n     * @name strokeEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get stroke enabled flag\n     * var strokeEnabled = shape.strokeEnabled();\n     *\n     * // disable stroke\n     * shape.strokeEnabled(false);\n     *\n     * // enable stroke\n     * shape.strokeEnabled(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'shadowEnabled', true);\n\n  /**\n     * get/set shadow enabled flag\n     * @name shadowEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get shadow enabled flag\n     * var shadowEnabled = shape.shadowEnabled();\n     *\n     * // disable shadow\n     * shape.shadowEnabled(false);\n     *\n     * // enable shadow\n     * shape.shadowEnabled(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'dashEnabled', true);\n\n  /**\n     * get/set dash enabled flag\n     * @name dashEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get dash enabled flag\n     * var dashEnabled = shape.dashEnabled();\n     *\n     * // disable dash\n     * shape.dashEnabled(false);\n     *\n     * // enable dash\n     * shape.dashEnabled(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'strokeScaleEnabled', true);\n\n  /**\n     * get/set strokeScale enabled flag\n     * @name strokeScaleEnabled\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get stroke scale enabled flag\n     * var strokeScaleEnabled = shape.strokeScaleEnabled();\n     *\n     * // disable stroke scale\n     * shape.strokeScaleEnabled(false);\n     *\n     * // enable stroke scale\n     * shape.strokeScaleEnabled(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPriority', 'color');\n\n  /**\n     * get/set fill priority.  can be color, pattern, linear-gradient, or radial-gradient.  The default is color.\n     *   This is handy if you want to toggle between different fill types.\n     * @name fillPriority\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {String} priority\n     * @returns {String}\n     * @example\n     * // get fill priority\n     * var fillPriority = shape.fillPriority();\n     *\n     * // set fill priority\n     * shape.fillPriority('linear-gradient');\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Shape, 'fillPatternOffset', [\n    'x',\n    'y'\n  ]);\n\n  /**\n     * get/set fill pattern offset\n     * @name fillPatternOffset\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} offset\n     * @param {Number} offset.x\n     * @param {Number} offset.y\n     * @returns {Object}\n     * @example\n     * // get fill pattern offset\n     * var patternOffset = shape.fillPatternOffset();\n     *\n     * // set fill pattern offset\n     * shape.fillPatternOffset({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternOffsetX', 0);\n  /**\n     * get/set fill pattern offset x\n     * @name fillPatternOffsetX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill pattern offset x\n     * var patternOffsetX = shape.fillPatternOffsetX();\n     *\n     * // set fill pattern offset x\n     * shape.fillPatternOffsetX(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternOffsetY', 0);\n  /**\n     * get/set fill pattern offset y\n     * @name fillPatternOffsetY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill pattern offset y\n     * var patternOffsetY = shape.fillPatternOffsetY();\n     *\n     * // set fill pattern offset y\n     * shape.fillPatternOffsetY(10);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Shape, 'fillPatternScale', [\n    'x',\n    'y'\n  ]);\n\n  /**\n     * get/set fill pattern scale\n     * @name fillPatternScale\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} scale\n     * @param {Number} scale.x\n     * @param {Number} scale.y\n     * @returns {Object}\n     * @example\n     * // get fill pattern scale\n     * var patternScale = shape.fillPatternScale();\n     *\n     * // set fill pattern scale\n     * shape.fillPatternScale({\n     *   x: 2\n     *   y: 2\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternScaleX', 1);\n  /**\n     * get/set fill pattern scale x\n     * @name fillPatternScaleX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill pattern scale x\n     * var patternScaleX = shape.fillPatternScaleX();\n     *\n     * // set fill pattern scale x\n     * shape.fillPatternScaleX(2);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternScaleY', 1);\n  /**\n     * get/set fill pattern scale y\n     * @name fillPatternScaleY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill pattern scale y\n     * var patternScaleY = shape.fillPatternScaleY();\n     *\n     * // set fill pattern scale y\n     * shape.fillPatternScaleY(2);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(\n    Konva.Shape,\n    'fillLinearGradientStartPoint',\n    ['x', 'y']\n  );\n\n  /**\n     * get/set fill linear gradient start point\n     * @name fillLinearGradientStartPoint\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} startPoint\n     * @param {Number} startPoint.x\n     * @param {Number} startPoint.y\n     * @returns {Object}\n     * @example\n     * // get fill linear gradient start point\n     * var startPoint = shape.fillLinearGradientStartPoint();\n     *\n     * // set fill linear gradient start point\n     * shape.fillLinearGradientStartPoint({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Shape,\n    'fillLinearGradientStartPointX',\n    0\n  );\n  /**\n     * get/set fill linear gradient start point x\n     * @name fillLinearGradientStartPointX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill linear gradient start point x\n     * var startPointX = shape.fillLinearGradientStartPointX();\n     *\n     * // set fill linear gradient start point x\n     * shape.fillLinearGradientStartPointX(20);\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Shape,\n    'fillLinearGradientStartPointY',\n    0\n  );\n  /**\n     * get/set fill linear gradient start point y\n     * @name fillLinearGradientStartPointY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill linear gradient start point y\n     * var startPointY = shape.fillLinearGradientStartPointY();\n     *\n     * // set fill linear gradient start point y\n     * shape.fillLinearGradientStartPointY(20);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(\n    Konva.Shape,\n    'fillLinearGradientEndPoint',\n    ['x', 'y']\n  );\n\n  /**\n     * get/set fill linear gradient end point\n     * @name fillLinearGradientEndPoint\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} endPoint\n     * @param {Number} endPoint.x\n     * @param {Number} endPoint.y\n     * @returns {Object}\n     * @example\n     * // get fill linear gradient end point\n     * var endPoint = shape.fillLinearGradientEndPoint();\n     *\n     * // set fill linear gradient end point\n     * shape.fillLinearGradientEndPoint({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillLinearGradientEndPointX', 0);\n  /**\n     * get/set fill linear gradient end point x\n     * @name fillLinearGradientEndPointX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill linear gradient end point x\n     * var endPointX = shape.fillLinearGradientEndPointX();\n     *\n     * // set fill linear gradient end point x\n     * shape.fillLinearGradientEndPointX(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillLinearGradientEndPointY', 0);\n  /**\n     * get/set fill linear gradient end point y\n     * @name fillLinearGradientEndPointY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill linear gradient end point y\n     * var endPointY = shape.fillLinearGradientEndPointY();\n     *\n     * // set fill linear gradient end point y\n     * shape.fillLinearGradientEndPointY(20);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(\n    Konva.Shape,\n    'fillRadialGradientStartPoint',\n    ['x', 'y']\n  );\n\n  /**\n     * get/set fill radial gradient start point\n     * @name fillRadialGradientStartPoint\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} startPoint\n     * @param {Number} startPoint.x\n     * @param {Number} startPoint.y\n     * @returns {Object}\n     * @example\n     * // get fill radial gradient start point\n     * var startPoint = shape.fillRadialGradientStartPoint();\n     *\n     * // set fill radial gradient start point\n     * shape.fillRadialGradientStartPoint({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Shape,\n    'fillRadialGradientStartPointX',\n    0\n  );\n  /**\n     * get/set fill radial gradient start point x\n     * @name fillRadialGradientStartPointX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill radial gradient start point x\n     * var startPointX = shape.fillRadialGradientStartPointX();\n     *\n     * // set fill radial gradient start point x\n     * shape.fillRadialGradientStartPointX(20);\n     */\n\n  Konva.Factory.addGetterSetter(\n    Konva.Shape,\n    'fillRadialGradientStartPointY',\n    0\n  );\n  /**\n     * get/set fill radial gradient start point y\n     * @name fillRadialGradientStartPointY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill radial gradient start point y\n     * var startPointY = shape.fillRadialGradientStartPointY();\n     *\n     * // set fill radial gradient start point y\n     * shape.fillRadialGradientStartPointY(20);\n     */\n\n  Konva.Factory.addComponentsGetterSetter(\n    Konva.Shape,\n    'fillRadialGradientEndPoint',\n    ['x', 'y']\n  );\n\n  /**\n     * get/set fill radial gradient end point\n     * @name fillRadialGradientEndPoint\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Object} endPoint\n     * @param {Number} endPoint.x\n     * @param {Number} endPoint.y\n     * @returns {Object}\n     * @example\n     * // get fill radial gradient end point\n     * var endPoint = shape.fillRadialGradientEndPoint();\n     *\n     * // set fill radial gradient end point\n     * shape.fillRadialGradientEndPoint({\n     *   x: 20\n     *   y: 10\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillRadialGradientEndPointX', 0);\n  /**\n     * get/set fill radial gradient end point x\n     * @name fillRadialGradientEndPointX\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get fill radial gradient end point x\n     * var endPointX = shape.fillRadialGradientEndPointX();\n     *\n     * // set fill radial gradient end point x\n     * shape.fillRadialGradientEndPointX(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillRadialGradientEndPointY', 0);\n  /**\n     * get/set fill radial gradient end point y\n     * @name fillRadialGradientEndPointY\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get fill radial gradient end point y\n     * var endPointY = shape.fillRadialGradientEndPointY();\n     *\n     * // set fill radial gradient end point y\n     * shape.fillRadialGradientEndPointY(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Shape, 'fillPatternRotation', 0);\n\n  /**\n     * get/set fill pattern rotation in degrees\n     * @name fillPatternRotation\n     * @method\n     * @memberof Konva.Shape.prototype\n     * @param {Number} rotation\n     * @returns {Konva.Shape}\n     * @example\n     * // get fill pattern rotation\n     * var patternRotation = shape.fillPatternRotation();\n     *\n     * // set fill pattern rotation\n     * shape.fillPatternRotation(20);\n     */\n\n  Konva.Factory.backCompat(Konva.Shape, {\n    dashArray: 'dash',\n    getDashArray: 'getDash',\n    setDashArray: 'getDash',\n\n    drawFunc: 'sceneFunc',\n    getDrawFunc: 'getSceneFunc',\n    setDrawFunc: 'setSceneFunc',\n\n    drawHitFunc: 'hitFunc',\n    getDrawHitFunc: 'getHitFunc',\n    setDrawHitFunc: 'setHitFunc'\n  });\n\n  Konva.Collection.mapMethods(Konva.Shape);\n})(Konva);\n\n(function() {\n  'use strict';\n  // CONSTANTS\n  var STAGE = 'Stage',\n    STRING = 'string',\n    PX = 'px',\n    MOUSEOUT = 'mouseout',\n    MOUSELEAVE = 'mouseleave',\n    MOUSEOVER = 'mouseover',\n    MOUSEENTER = 'mouseenter',\n    MOUSEMOVE = 'mousemove',\n    MOUSEDOWN = 'mousedown',\n    MOUSEUP = 'mouseup',\n    CONTEXTMENU = 'contextmenu',\n    CLICK = 'click',\n    DBL_CLICK = 'dblclick',\n    TOUCHSTART = 'touchstart',\n    TOUCHEND = 'touchend',\n    TAP = 'tap',\n    DBL_TAP = 'dbltap',\n    TOUCHMOVE = 'touchmove',\n    WHEEL = 'wheel',\n    CONTENT_MOUSEOUT = 'contentMouseout',\n    CONTENT_MOUSEOVER = 'contentMouseover',\n    CONTENT_MOUSEMOVE = 'contentMousemove',\n    CONTENT_MOUSEDOWN = 'contentMousedown',\n    CONTENT_MOUSEUP = 'contentMouseup',\n    CONTENT_CONTEXTMENU = 'contentContextmenu',\n    CONTENT_CLICK = 'contentClick',\n    CONTENT_DBL_CLICK = 'contentDblclick',\n    CONTENT_TOUCHSTART = 'contentTouchstart',\n    CONTENT_TOUCHEND = 'contentTouchend',\n    CONTENT_DBL_TAP = 'contentDbltap',\n    CONTENT_TAP = 'contentTap',\n    CONTENT_TOUCHMOVE = 'contentTouchmove',\n    CONTENT_WHEEL = 'contentWheel',\n    DIV = 'div',\n    RELATIVE = 'relative',\n    KONVA_CONTENT = 'konvajs-content',\n    SPACE = ' ',\n    UNDERSCORE = '_',\n    CONTAINER = 'container',\n    EMPTY_STRING = '',\n    EVENTS = [\n      MOUSEDOWN,\n      MOUSEMOVE,\n      MOUSEUP,\n      MOUSEOUT,\n      TOUCHSTART,\n      TOUCHMOVE,\n      TOUCHEND,\n      MOUSEOVER,\n      WHEEL,\n      CONTEXTMENU\n    ],\n    // cached variables\n    eventsLength = EVENTS.length;\n\n  function addEvent(ctx, eventName) {\n    ctx.content.addEventListener(\n      eventName,\n      function(evt) {\n        ctx[UNDERSCORE + eventName](evt);\n      },\n      false\n    );\n  }\n\n  /**\n     * Stage constructor.  A stage is used to contain multiple layers\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Container\n     * @param {Object} config\n     * @param {String|Element} config.container Container selector or DOM element\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var stage = new Konva.Stage({\n         *   width: 500,\n         *   height: 800,\n         *   container: 'containerId' // or \"#containerId\" or \".containerClass\"\n         * });\n     */\n  Konva.Stage = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Stage, {\n    ___init: function(config) {\n      this.nodeType = STAGE;\n      // call super constructor\n      Konva.Container.call(this, config);\n      this._id = Konva.idCounter++;\n      this._buildDOM();\n      this._bindContentEvents();\n      this._enableNestedTransforms = false;\n      Konva.stages.push(this);\n    },\n    _validateAdd: function(child) {\n      if (child.getType() !== 'Layer') {\n        Konva.Util.throw('You may only add layers to the stage.');\n      }\n    },\n    /**\n         * set container dom element which contains the stage wrapper div element\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {DomElement} container can pass in a dom element or id string\n         */\n    setContainer: function(container) {\n      if (typeof container === STRING) {\n        if (container.charAt(0) === '.') {\n          var className = container.slice(1);\n          container = Konva.document.getElementsByClassName(className)[0];\n        } else {\n          var id;\n          if (container.charAt(0) !== '#') {\n            id = container;\n          } else {\n            id = container.slice(1);\n          }\n          container = Konva.document.getElementById(id);\n        }\n        if (!container) {\n          throw 'Can not find container in document with id ' + id;\n        }\n      }\n      this._setAttr(CONTAINER, container);\n      return this;\n    },\n    shouldDrawHit: function() {\n      return true;\n    },\n    draw: function() {\n      Konva.Node.prototype.draw.call(this);\n      return this;\n    },\n    /**\n         * draw layer scene graphs\n         * @name draw\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n\n    /**\n         * draw layer hit graphs\n         * @name drawHit\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n\n    /**\n         * set height\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {Number} height\n         */\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      this._resizeDOM();\n      return this;\n    },\n    /**\n         * set width\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {Number} width\n         */\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      this._resizeDOM();\n      return this;\n    },\n    /**\n         * clear all layers\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n    clear: function() {\n      var layers = this.children,\n        len = layers.length,\n        n;\n\n      for (n = 0; n < len; n++) {\n        layers[n].clear();\n      }\n      return this;\n    },\n    clone: function(obj) {\n      if (!obj) {\n        obj = {};\n      }\n      obj.container = Konva.document.createElement(DIV);\n      return Konva.Container.prototype.clone.call(this, obj);\n    },\n    /**\n         * destroy stage\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n    destroy: function() {\n      var content = this.content;\n      Konva.Container.prototype.destroy.call(this);\n\n      if (content && Konva.Util._isInDocument(content)) {\n        this.getContainer().removeChild(content);\n      }\n      var index = Konva.stages.indexOf(this);\n      if (index > -1) {\n        Konva.stages.splice(index, 1);\n      }\n      return this;\n    },\n    /**\n         * get pointer position which can be a touch position or mouse position\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @returns {Object}\n         */\n    getPointerPosition: function() {\n      return this.pointerPos;\n    },\n    getStage: function() {\n      return this;\n    },\n    /**\n         * get stage content div element which has the\n         *  the class name \"konvajs-content\"\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n    getContent: function() {\n      return this.content;\n    },\n    /**\n         * Creates a composite data URL\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {Object} config\n         * @param {Function} [config.callback] function executed when the composite has completed. Deprecated as method is sync now.\n         * @param {String} [config.mimeType] can be \"image/png\" or \"image/jpeg\".\n         *  \"image/png\" is the default\n         * @param {Number} [config.x] x position of canvas section\n         * @param {Number} [config.y] y position of canvas section\n         * @param {Number} [config.width] width of canvas section\n         * @param {Number} [config.height] height of canvas section\n         * @param {Number} [config.quality] jpeg quality.  If using an \"image/jpeg\" mimeType,\n         *  you can specify the quality from 0 to 1, where 0 is very poor quality and 1\n         *  is very high quality\n         */\n    toDataURL: function(config) {\n      config = config || {};\n\n      var mimeType = config.mimeType || null,\n        quality = config.quality || null,\n        x = config.x || 0,\n        y = config.y || 0,\n        canvas = new Konva.SceneCanvas({\n          width: config.width || this.getWidth(),\n          height: config.height || this.getHeight(),\n          pixelRatio: config.pixelRatio\n        }),\n        _context = canvas.getContext()._context,\n        layers = this.children;\n\n      if (x || y) {\n        _context.translate(-1 * x, -1 * y);\n      }\n\n      layers.each(function(layer) {\n        var width = layer.getCanvas().getWidth();\n        var height = layer.getCanvas().getHeight();\n        var ratio = layer.getCanvas().getPixelRatio();\n        _context.drawImage(\n          layer.getCanvas()._canvas,\n          0,\n          0,\n          width / ratio,\n          height / ratio\n        );\n      });\n      var src = canvas.toDataURL(mimeType, quality);\n\n      if (config.callback) {\n        config.callback(src);\n      }\n\n      return src;\n    },\n    /**\n         * converts stage into an image.\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {Object} config\n         * @param {Function} config.callback function executed when the composite has completed\n         * @param {String} [config.mimeType] can be \"image/png\" or \"image/jpeg\".\n         *  \"image/png\" is the default\n         * @param {Number} [config.x] x position of canvas section\n         * @param {Number} [config.y] y position of canvas section\n         * @param {Number} [config.width] width of canvas section\n         * @param {Number} [config.height] height of canvas section\n         * @param {Number} [config.quality] jpeg quality.  If using an \"image/jpeg\" mimeType,\n         *  you can specify the quality from 0 to 1, where 0 is very poor quality and 1\n         *  is very high quality\n         */\n    toImage: function(config) {\n      var cb = config.callback;\n\n      config.callback = function(dataUrl) {\n        Konva.Util._getImage(dataUrl, function(img) {\n          cb(img);\n        });\n      };\n      this.toDataURL(config);\n    },\n    /**\n         * get visible intersection shape. This is the preferred\n         *  method for determining if a point intersects a shape or not\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {Object} pos\n         * @param {Number} pos.x\n         * @param {Number} pos.y\n         * @param {String} [selector]\n         * @returns {Konva.Node}\n         * @example\n         * var shape = stage.getIntersection({x: 50, y: 50});\n         * // or if you interested in shape parent:\n         * var group = stage.getIntersection({x: 50, y: 50}, 'Group');\n         */\n    getIntersection: function(pos, selector) {\n      var layers = this.getChildren(),\n        len = layers.length,\n        end = len - 1,\n        n,\n        shape;\n\n      for (n = end; n >= 0; n--) {\n        shape = layers[n].getIntersection(pos, selector);\n        if (shape) {\n          return shape;\n        }\n      }\n\n      return null;\n    },\n    _resizeDOM: function() {\n      if (this.content) {\n        var width = this.getWidth(),\n          height = this.getHeight(),\n          layers = this.getChildren(),\n          len = layers.length,\n          n,\n          layer;\n\n        // set content dimensions\n        this.content.style.width = width + PX;\n        this.content.style.height = height + PX;\n\n        this.bufferCanvas.setSize(width, height);\n        this.bufferHitCanvas.setSize(width, height);\n\n        // set layer dimensions\n        for (n = 0; n < len; n++) {\n          layer = layers[n];\n          layer.setSize(width, height);\n          layer.draw();\n        }\n      }\n    },\n    /**\n         * add layer or layers to stage\n         * @method\n         * @memberof Konva.Stage.prototype\n         * @param {...Konva.Layer} layer\n         * @example\n         * stage.add(layer1, layer2, layer3);\n         */\n    add: function(layer) {\n      if (arguments.length > 1) {\n        for (var i = 0; i < arguments.length; i++) {\n          this.add(arguments[i]);\n        }\n        return this;\n      }\n      Konva.Container.prototype.add.call(this, layer);\n      layer._setCanvasSize(this.width(), this.height());\n\n      // draw layer and append canvas to container\n      layer.draw();\n\n      if (Konva.isBrowser) {\n        this.content.appendChild(layer.canvas._canvas);\n      }\n\n      // chainable\n      return this;\n    },\n    getParent: function() {\n      return null;\n    },\n    getLayer: function() {\n      return null;\n    },\n    /**\n         * returns a {@link Konva.Collection} of layers\n         * @method\n         * @memberof Konva.Stage.prototype\n         */\n    getLayers: function() {\n      return this.getChildren();\n    },\n    _bindContentEvents: function() {\n      if (!Konva.isBrowser) {\n        return;\n      }\n      for (var n = 0; n < eventsLength; n++) {\n        addEvent(this, EVENTS[n]);\n      }\n    },\n    _mouseover: function(evt) {\n      if (!Konva.UA.mobile) {\n        this._setPointerPosition(evt);\n        this._fire(CONTENT_MOUSEOVER, { evt: evt });\n      }\n    },\n    _mouseout: function(evt) {\n      if (!Konva.UA.mobile) {\n        this._setPointerPosition(evt);\n        var targetShape = this.targetShape;\n\n        if (targetShape && !Konva.isDragging()) {\n          targetShape._fireAndBubble(MOUSEOUT, { evt: evt });\n          targetShape._fireAndBubble(MOUSELEAVE, { evt: evt });\n          this.targetShape = null;\n        }\n        this.pointerPos = undefined;\n\n        this._fire(CONTENT_MOUSEOUT, { evt: evt });\n      }\n    },\n    _mousemove: function(evt) {\n      // workaround for mobile IE to force touch event when unhandled pointer event elevates into a mouse event\n      if (Konva.UA.ieMobile) {\n        return this._touchmove(evt);\n      }\n      // workaround fake mousemove event in chrome browser https://code.google.com/p/chromium/issues/detail?id=161464\n      if (\n        (typeof evt.movementX !== 'undefined' ||\n          typeof evt.movementY !== 'undefined') &&\n        evt.movementY === 0 &&\n        evt.movementX === 0\n      ) {\n        return null;\n      }\n      if (Konva.UA.mobile) {\n        return null;\n      }\n      this._setPointerPosition(evt);\n      var shape;\n\n      if (!Konva.isDragging()) {\n        shape = this.getIntersection(this.getPointerPosition());\n        if (shape && shape.isListening()) {\n          if (\n            !Konva.isDragging() &&\n            (!this.targetShape || this.targetShape._id !== shape._id)\n          ) {\n            if (this.targetShape) {\n              this.targetShape._fireAndBubble(MOUSEOUT, { evt: evt }, shape);\n              this.targetShape._fireAndBubble(MOUSELEAVE, { evt: evt }, shape);\n            }\n            shape._fireAndBubble(MOUSEOVER, { evt: evt }, this.targetShape);\n            shape._fireAndBubble(MOUSEENTER, { evt: evt }, this.targetShape);\n            this.targetShape = shape;\n          } else {\n            shape._fireAndBubble(MOUSEMOVE, { evt: evt });\n          }\n        } else {\n          /*\n                 * if no shape was detected, clear target shape and try\n                 * to run mouseout from previous target shape\n                 */\n          if (this.targetShape && !Konva.isDragging()) {\n            this.targetShape._fireAndBubble(MOUSEOUT, { evt: evt });\n            this.targetShape._fireAndBubble(MOUSELEAVE, { evt: evt });\n            this.targetShape = null;\n          }\n        }\n\n        // content event\n        this._fire(CONTENT_MOUSEMOVE, { evt: evt });\n      }\n\n      // always call preventDefault for desktop events because some browsers\n      // try to drag and drop the canvas element\n      if (evt.preventDefault) {\n        evt.preventDefault();\n      }\n    },\n    _mousedown: function(evt) {\n      // workaround for mobile IE to force touch event when unhandled pointer event elevates into a mouse event\n      if (Konva.UA.ieMobile) {\n        return this._touchstart(evt);\n      }\n      if (!Konva.UA.mobile) {\n        this._setPointerPosition(evt);\n        var shape = this.getIntersection(this.getPointerPosition());\n\n        Konva.listenClickTap = true;\n\n        if (shape && shape.isListening()) {\n          this.clickStartShape = shape;\n          shape._fireAndBubble(MOUSEDOWN, { evt: evt });\n        }\n\n        // content event\n        this._fire(CONTENT_MOUSEDOWN, { evt: evt });\n      }\n\n      // always call preventDefault for desktop events because some browsers\n      // try to drag and drop the canvas element\n      if (evt.preventDefault) {\n        evt.preventDefault();\n      }\n    },\n    _mouseup: function(evt) {\n      // workaround for mobile IE to force touch event when unhandled pointer event elevates into a mouse event\n      if (Konva.UA.ieMobile) {\n        return this._touchend(evt);\n      }\n      if (!Konva.UA.mobile) {\n        this._setPointerPosition(evt);\n        var shape = this.getIntersection(this.getPointerPosition()),\n          clickStartShape = this.clickStartShape,\n          clickEndShape = this.clickEndShape,\n          fireDblClick = false,\n          dd = Konva.DD;\n\n        if (Konva.inDblClickWindow) {\n          fireDblClick = true;\n          Konva.inDblClickWindow = false;\n        } else if (!dd || !dd.justDragged) {\n          // don't set inDblClickWindow after dragging\n          Konva.inDblClickWindow = true;\n        } else if (dd) {\n          dd.justDragged = false;\n        }\n\n        setTimeout(function() {\n          Konva.inDblClickWindow = false;\n        }, Konva.dblClickWindow);\n\n        if (shape && shape.isListening()) {\n          this.clickEndShape = shape;\n          shape._fireAndBubble(MOUSEUP, { evt: evt });\n\n          // detect if click or double click occurred\n          if (\n            Konva.listenClickTap &&\n            clickStartShape &&\n            clickStartShape._id === shape._id\n          ) {\n            shape._fireAndBubble(CLICK, { evt: evt });\n\n            if (\n              fireDblClick &&\n              clickEndShape &&\n              clickEndShape._id === shape._id\n            ) {\n              shape._fireAndBubble(DBL_CLICK, { evt: evt });\n            }\n          }\n        }\n        // content events\n        this._fire(CONTENT_MOUSEUP, { evt: evt });\n        if (Konva.listenClickTap) {\n          this._fire(CONTENT_CLICK, { evt: evt });\n          if (fireDblClick) {\n            this._fire(CONTENT_DBL_CLICK, { evt: evt });\n          }\n        }\n\n        Konva.listenClickTap = false;\n      }\n\n      // always call preventDefault for desktop events because some browsers\n      // try to drag and drop the canvas element\n      if (evt.preventDefault) {\n        evt.preventDefault();\n      }\n    },\n    _contextmenu: function(evt) {\n      this._fire(CONTENT_CONTEXTMENU, { evt: evt });\n    },\n    _touchstart: function(evt) {\n      this._setPointerPosition(evt);\n      var shape = this.getIntersection(this.getPointerPosition());\n\n      Konva.listenClickTap = true;\n\n      if (shape && shape.isListening()) {\n        this.tapStartShape = shape;\n        shape._fireAndBubble(TOUCHSTART, { evt: evt });\n\n        // only call preventDefault if the shape is listening for events\n        if (\n          shape.isListening() &&\n          shape.preventDefault() &&\n          evt.preventDefault\n        ) {\n          evt.preventDefault();\n        }\n      }\n      // content event\n      this._fire(CONTENT_TOUCHSTART, { evt: evt });\n    },\n    _touchend: function(evt) {\n      this._setPointerPosition(evt);\n      var shape = this.getIntersection(this.getPointerPosition()),\n        fireDblClick = false;\n\n      if (Konva.inDblClickWindow) {\n        fireDblClick = true;\n        Konva.inDblClickWindow = false;\n      } else {\n        Konva.inDblClickWindow = true;\n      }\n\n      setTimeout(function() {\n        Konva.inDblClickWindow = false;\n      }, Konva.dblClickWindow);\n\n      if (shape && shape.isListening()) {\n        shape._fireAndBubble(TOUCHEND, { evt: evt });\n\n        // detect if tap or double tap occurred\n        if (\n          Konva.listenClickTap &&\n          this.tapStartShape &&\n          shape._id === this.tapStartShape._id\n        ) {\n          shape._fireAndBubble(TAP, { evt: evt });\n\n          if (fireDblClick) {\n            shape._fireAndBubble(DBL_TAP, { evt: evt });\n          }\n        }\n        // only call preventDefault if the shape is listening for events\n        if (\n          shape.isListening() &&\n          shape.preventDefault() &&\n          evt.preventDefault\n        ) {\n          evt.preventDefault();\n        }\n      }\n      // content events\n      this._fire(CONTENT_TOUCHEND, { evt: evt });\n      if (Konva.listenClickTap) {\n        this._fire(CONTENT_TAP, { evt: evt });\n        if (fireDblClick) {\n          this._fire(CONTENT_DBL_TAP, { evt: evt });\n        }\n      }\n\n      Konva.listenClickTap = false;\n    },\n    _touchmove: function(evt) {\n      this._setPointerPosition(evt);\n      var dd = Konva.DD,\n        shape;\n      if (!Konva.isDragging()) {\n        shape = this.getIntersection(this.getPointerPosition());\n        if (shape && shape.isListening()) {\n          shape._fireAndBubble(TOUCHMOVE, { evt: evt });\n          // only call preventDefault if the shape is listening for events\n          if (\n            shape.isListening() &&\n            shape.preventDefault() &&\n            evt.preventDefault\n          ) {\n            evt.preventDefault();\n          }\n        }\n        this._fire(CONTENT_TOUCHMOVE, { evt: evt });\n      }\n      if (dd) {\n        if (Konva.isDragging() && Konva.DD.node.preventDefault()) {\n          evt.preventDefault();\n        }\n      }\n    },\n    _wheel: function(evt) {\n      this._setPointerPosition(evt);\n      var shape = this.getIntersection(this.getPointerPosition());\n\n      if (shape && shape.isListening()) {\n        shape._fireAndBubble(WHEEL, { evt: evt });\n      }\n      this._fire(CONTENT_WHEEL, { evt: evt });\n    },\n    _setPointerPosition: function(evt) {\n      var contentPosition = this._getContentPosition(),\n        x = null,\n        y = null;\n      evt = evt ? evt : window.event;\n\n      // touch events\n      if (evt.touches !== undefined) {\n        // currently, only handle one finger\n        if (evt.touches.length > 0) {\n          var touch = evt.touches[0];\n          // get the information for finger #1\n          x = touch.clientX - contentPosition.left;\n          y = touch.clientY - contentPosition.top;\n        }\n      } else {\n        // mouse events\n        x = evt.clientX - contentPosition.left;\n        y = evt.clientY - contentPosition.top;\n      }\n      if (x !== null && y !== null) {\n        this.pointerPos = {\n          x: x,\n          y: y\n        };\n      }\n    },\n    _getContentPosition: function() {\n      var rect = this.content.getBoundingClientRect\n        ? this.content.getBoundingClientRect()\n        : { top: 0, left: 0 };\n      return {\n        top: rect.top,\n        left: rect.left\n      };\n    },\n    _buildDOM: function() {\n      // the buffer canvas pixel ratio must be 1 because it is used as an\n      // intermediate canvas before copying the result onto a scene canvas.\n      // not setting it to 1 will result in an over compensation\n      this.bufferCanvas = new Konva.SceneCanvas();\n      this.bufferHitCanvas = new Konva.HitCanvas({ pixelRatio: 1 });\n\n      if (!Konva.isBrowser) {\n        return;\n      }\n      var container = this.getContainer();\n      if (!container) {\n        throw 'Stage has no container. A container is required.';\n      }\n      // clear content inside container\n      container.innerHTML = EMPTY_STRING;\n\n      // content\n      this.content = Konva.document.createElement(DIV);\n      this.content.style.position = RELATIVE;\n      this.content.className = KONVA_CONTENT;\n      this.content.setAttribute('role', 'presentation');\n\n      container.appendChild(this.content);\n\n      this._resizeDOM();\n    },\n    _onContent: function(typesStr, handler) {\n      var types = typesStr.split(SPACE),\n        len = types.length,\n        n,\n        baseEvent;\n\n      for (n = 0; n < len; n++) {\n        baseEvent = types[n];\n        this.content.addEventListener(baseEvent, handler, false);\n      }\n    },\n    // currently cache function is now working for stage, because stage has no its own canvas element\n    // TODO: may be it is better to cache all children layers?\n    cache: function() {\n      Konva.Util.warn(\n        'Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.'\n      );\n    },\n    clearCache: function() {}\n  });\n  Konva.Util.extend(Konva.Stage, Konva.Container);\n\n  // add getters and setters\n  Konva.Factory.addGetter(Konva.Stage, 'container');\n  Konva.Factory.addOverloadedGetterSetter(Konva.Stage, 'container');\n\n  /**\n     * get container DOM element\n     * @name container\n     * @method\n     * @memberof Konva.Stage.prototype\n     * @returns {DomElement} container\n     * @example\n     * // get container\n     * var container = stage.container();\n     * // set container\n     * var container = document.createElement('div');\n     * body.appendChild(container);\n     * stage.container(container);\n     */\n})();\n\n(function(Konva) {\n  'use strict';\n  /**\n     * BaseLayer constructor.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Container\n     * @param {Object} config\n     * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want\n     * to clear the canvas before each layer draw.  The default value is true.\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * * @param {Object} [config.clip] set clip\n     * @param {Number} [config.clipX] set clip x\n     * @param {Number} [config.clipY] set clip y\n     * @param {Number} [config.clipWidth] set clip width\n     * @param {Number} [config.clipHeight] set clip height\n     * @param {Function} [config.clipFunc] set clip func\n\n     */\n  Konva.BaseLayer = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Util.addMethods(Konva.BaseLayer, {\n    ___init: function(config) {\n      this.nodeType = 'Layer';\n      Konva.Container.call(this, config);\n    },\n    createPNGStream: function() {\n      return this.canvas._canvas.createPNGStream();\n    },\n    /**\n     * get layer canvas\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     */\n    getCanvas: function() {\n      return this.canvas;\n    },\n    /**\n     * get layer hit canvas\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     */\n    getHitCanvas: function() {\n      return this.hitCanvas;\n    },\n    /**\n     * get layer canvas context\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     */\n    getContext: function() {\n      return this.getCanvas().getContext();\n    },\n    /**\n     * clear scene and hit canvas contexts tied to the layer\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     * @param {Object} [bounds]\n     * @param {Number} [bounds.x]\n     * @param {Number} [bounds.y]\n     * @param {Number} [bounds.width]\n     * @param {Number} [bounds.height]\n     * @example\n     * layer.clear();\n     * layer.clear({\n     *   x : 0,\n     *   y : 0,\n     *   width : 100,\n     *   height : 100\n     * });\n     */\n    clear: function(bounds) {\n      this.getContext().clear(bounds);\n      return this;\n    },\n    clearHitCache: function() {\n      this._hitImageData = undefined;\n    },\n    // extend Node.prototype.setZIndex\n    setZIndex: function(index) {\n      Konva.Node.prototype.setZIndex.call(this, index);\n      var stage = this.getStage();\n      if (stage) {\n        stage.content.removeChild(this.getCanvas()._canvas);\n\n        if (index < stage.getChildren().length - 1) {\n          stage.content.insertBefore(\n            this.getCanvas()._canvas,\n            stage.getChildren()[index + 1].getCanvas()._canvas\n          );\n        } else {\n          stage.content.appendChild(this.getCanvas()._canvas);\n        }\n      }\n      return this;\n    },\n    // extend Node.prototype.moveToTop\n    moveToTop: function() {\n      Konva.Node.prototype.moveToTop.call(this);\n      var stage = this.getStage();\n      if (stage) {\n        stage.content.removeChild(this.getCanvas()._canvas);\n        stage.content.appendChild(this.getCanvas()._canvas);\n      }\n      return this;\n    },\n    // extend Node.prototype.moveUp\n    moveUp: function() {\n      var moved = Konva.Node.prototype.moveUp.call(this);\n      if (!moved) {\n        return this;\n      }\n      var stage = this.getStage();\n      if (!stage) {\n        return this;\n      }\n      stage.content.removeChild(this.getCanvas()._canvas);\n\n      if (this.index < stage.getChildren().length - 1) {\n        stage.content.insertBefore(\n          this.getCanvas()._canvas,\n          stage.getChildren()[this.index + 1].getCanvas()._canvas\n        );\n      } else {\n        stage.content.appendChild(this.getCanvas()._canvas);\n      }\n      return this;\n    },\n    // extend Node.prototype.moveDown\n    moveDown: function() {\n      if (Konva.Node.prototype.moveDown.call(this)) {\n        var stage = this.getStage();\n        if (stage) {\n          var children = stage.getChildren();\n          stage.content.removeChild(this.getCanvas()._canvas);\n          stage.content.insertBefore(\n            this.getCanvas()._canvas,\n            children[this.index + 1].getCanvas()._canvas\n          );\n        }\n      }\n      return this;\n    },\n    // extend Node.prototype.moveToBottom\n    moveToBottom: function() {\n      if (Konva.Node.prototype.moveToBottom.call(this)) {\n        var stage = this.getStage();\n        if (stage) {\n          var children = stage.getChildren();\n          stage.content.removeChild(this.getCanvas()._canvas);\n          stage.content.insertBefore(\n            this.getCanvas()._canvas,\n            children[1].getCanvas()._canvas\n          );\n        }\n      }\n      return this;\n    },\n    getLayer: function() {\n      return this;\n    },\n    remove: function() {\n      var _canvas = this.getCanvas()._canvas;\n\n      Konva.Node.prototype.remove.call(this);\n\n      if (_canvas && _canvas.parentNode && Konva.Util._isInDocument(_canvas)) {\n        _canvas.parentNode.removeChild(_canvas);\n      }\n      return this;\n    },\n    getStage: function() {\n      return this.parent;\n    },\n    setSize: function(width, height) {\n      this.canvas.setSize(width, height);\n      return this;\n    },\n    /**\n     * get/set width of layer.getter return width of stage. setter doing nothing.\n     * if you want change width use `stage.width(value);`\n     * @name width\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     * @returns {Number}\n     * @example\n     * var width = layer.width();\n     */\n    getWidth: function() {\n      if (this.parent) {\n        return this.parent.getWidth();\n      }\n    },\n    setWidth: function() {\n      Konva.Util.warn(\n        'Can not change width of layer. Use \"stage.width(value)\" function instead.'\n      );\n    },\n    /**\n     * get/set height of layer.getter return height of stage. setter doing nothing.\n     * if you want change height use `stage.height(value);`\n     * @name height\n     * @method\n     * @memberof Konva.BaseLayer.prototype\n     * @returns {Number}\n     * @example\n     * var height = layer.height();\n     */\n    getHeight: function() {\n      if (this.parent) {\n        return this.parent.getHeight();\n      }\n    },\n    setHeight: function() {\n      Konva.Util.warn(\n        'Can not change height of layer. Use \"stage.height(value)\" function instead.'\n      );\n    },\n    // the apply transform method is handled by the Layer and FastLayer class\n    // because it is up to the layer to decide if an absolute or relative transform\n    // should be used\n    _applyTransform: function(shape, context, top) {\n      var m = shape.getAbsoluteTransform(top).getMatrix();\n      context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n    }\n  });\n  Konva.Util.extend(Konva.BaseLayer, Konva.Container);\n\n  // add getters and setters\n  Konva.Factory.addGetterSetter(Konva.BaseLayer, 'clearBeforeDraw', true);\n  /**\n   * get/set clearBeforeDraw flag which determines if the layer is cleared or not\n   *  before drawing\n   * @name clearBeforeDraw\n   * @method\n   * @memberof Konva.BaseLayer.prototype\n   * @param {Boolean} clearBeforeDraw\n   * @returns {Boolean}\n   * @example\n   * // get clearBeforeDraw flag\n   * var clearBeforeDraw = layer.clearBeforeDraw();\n   *\n   * // disable clear before draw\n   * layer.clearBeforeDraw(false);\n   *\n   * // enable clear before draw\n   * layer.clearBeforeDraw(true);\n   */\n\n  Konva.Collection.mapMethods(Konva.BaseLayer);\n})(Konva);\n\n(function() {\n  'use strict';\n  // constants\n  var HASH = '#',\n    BEFORE_DRAW = 'beforeDraw',\n    DRAW = 'draw',\n    /*\n         * 2 - 3 - 4\n         * |       |\n         * 1 - 0   5\n         *         |\n         * 8 - 7 - 6\n         */\n    INTERSECTION_OFFSETS = [\n      { x: 0, y: 0 }, // 0\n      { x: -1, y: 0 }, // 1\n      { x: -1, y: -1 }, // 2\n      { x: 0, y: -1 }, // 3\n      { x: 1, y: -1 }, // 4\n      { x: 1, y: 0 }, // 5\n      { x: 1, y: 1 }, // 6\n      { x: 0, y: 1 }, // 7\n      { x: -1, y: 1 } // 8\n    ],\n    INTERSECTION_OFFSETS_LEN = INTERSECTION_OFFSETS.length;\n\n  /**\n     * Layer constructor.  Layers are tied to their own canvas element and are used\n     * to contain groups or shapes.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.BaseLayer\n     * @param {Object} config\n     * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want\n     * to clear the canvas before each layer draw.  The default value is true.\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * * @param {Object} [config.clip] set clip\n     * @param {Number} [config.clipX] set clip x\n     * @param {Number} [config.clipY] set clip y\n     * @param {Number} [config.clipWidth] set clip width\n     * @param {Number} [config.clipHeight] set clip height\n     * @param {Function} [config.clipFunc] set clip func\n\n     * @example\n     * var layer = new Konva.Layer();\n     */\n  Konva.Layer = function(config) {\n    this.____init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Layer, {\n    ____init: function(config) {\n      this.nodeType = 'Layer';\n      this.canvas = new Konva.SceneCanvas();\n      this.hitCanvas = new Konva.HitCanvas({\n        pixelRatio: 1\n      });\n      // call super constructor\n      Konva.BaseLayer.call(this, config);\n    },\n    _setCanvasSize: function(width, height) {\n      this.canvas.setSize(width, height);\n      this.hitCanvas.setSize(width, height);\n    },\n    _validateAdd: function(child) {\n      var type = child.getType();\n      if (type !== 'Group' && type !== 'Shape') {\n        Konva.Util.throw('You may only add groups and shapes to a layer.');\n      }\n    },\n    /**\n         * get visible intersection shape. This is the preferred\n         * method for determining if a point intersects a shape or not\n         * also you may pass optional selector parametr to return ancestor of intersected shape\n         * @method\n         * @memberof Konva.Layer.prototype\n         * @param {Object} pos\n         * @param {Number} pos.x\n         * @param {Number} pos.y\n         * @param {String} [selector]\n         * @returns {Konva.Node}\n         * @example\n         * var shape = layer.getIntersection({x: 50, y: 50});\n         * // or if you interested in shape parent:\n         * var group = layer.getIntersection({x: 50, y: 50}, 'Group');\n         */\n    getIntersection: function(pos, selector) {\n      var obj, i, intersectionOffset, shape;\n\n      if (!this.hitGraphEnabled() || !this.isVisible()) {\n        return null;\n      }\n      // in some cases antialiased area may be bigger than 1px\n      // it is possible if we will cache node, then scale it a lot\n      // TODO: check { 0; 0 } point before loop, and remove it from INTERSECTION_OFFSETS.\n      var spiralSearchDistance = 1;\n      var continueSearch = false;\n      while (true) {\n        for (i = 0; i < INTERSECTION_OFFSETS_LEN; i++) {\n          intersectionOffset = INTERSECTION_OFFSETS[i];\n          obj = this._getIntersection({\n            x: pos.x + intersectionOffset.x * spiralSearchDistance,\n            y: pos.y + intersectionOffset.y * spiralSearchDistance\n          });\n          shape = obj.shape;\n          if (shape && selector) {\n            return shape.findAncestor(selector, true);\n          } else if (shape) {\n            return shape;\n          }\n          // we should continue search if we found antialiased pixel\n          // that means our node somewhere very close\n          continueSearch = !!obj.antialiased;\n          // stop search if found empty pixel\n          if (!obj.antialiased) {\n            break;\n          }\n        }\n        // if no shape, and no antialiased pixel, we should end searching\n        if (continueSearch) {\n          spiralSearchDistance += 1;\n        } else {\n          return null;\n        }\n      }\n    },\n    _getImageData: function(x, y) {\n      var width = this.hitCanvas.width || 1,\n        height = this.hitCanvas.height || 1,\n        index = Math.round(y) * width + Math.round(x);\n\n      if (!this._hitImageData) {\n        this._hitImageData = this.hitCanvas.context.getImageData(\n          0,\n          0,\n          width,\n          height\n        );\n      }\n\n      return [\n        this._hitImageData.data[4 * index + 0], // Red\n        this._hitImageData.data[4 * index + 1], // Green\n        this._hitImageData.data[4 * index + 2], // Blue\n        this._hitImageData.data[4 * index + 3] // Alpha\n      ];\n    },\n    _getIntersection: function(pos) {\n      var ratio = this.hitCanvas.pixelRatio;\n      var p = this.hitCanvas.context.getImageData(\n        Math.round(pos.x * ratio),\n        Math.round(pos.y * ratio),\n        1,\n        1\n      ).data,\n        p3 = p[3],\n        colorKey,\n        shape;\n      // fully opaque pixel\n      if (p3 === 255) {\n        colorKey = Konva.Util._rgbToHex(p[0], p[1], p[2]);\n        shape = Konva.shapes[HASH + colorKey];\n        if (shape) {\n          return {\n            shape: shape\n          };\n        }\n        return {\n          antialiased: true\n        };\n      } else if (p3 > 0) {\n        // antialiased pixel\n        return {\n          antialiased: true\n        };\n      }\n      // empty pixel\n      return {};\n    },\n    drawScene: function(can, top) {\n      var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas());\n\n      this._fire(BEFORE_DRAW, {\n        node: this\n      });\n\n      if (this.getClearBeforeDraw()) {\n        canvas.getContext().clear();\n      }\n\n      Konva.Container.prototype.drawScene.call(this, canvas, top);\n\n      this._fire(DRAW, {\n        node: this\n      });\n\n      return this;\n    },\n    drawHit: function(can, top) {\n      var layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas);\n\n      if (layer && layer.getClearBeforeDraw()) {\n        layer.getHitCanvas().getContext().clear();\n      }\n\n      Konva.Container.prototype.drawHit.call(this, canvas, top);\n      this.imageData = null; // Clear imageData cache\n      return this;\n    },\n    clear: function(bounds) {\n      Konva.BaseLayer.prototype.clear.call(this, bounds);\n      this.getHitCanvas().getContext().clear(bounds);\n      this.imageData = null; // Clear getImageData cache\n      return this;\n    },\n    // extend Node.prototype.setVisible\n    setVisible: function(visible) {\n      Konva.Node.prototype.setVisible.call(this, visible);\n      if (visible) {\n        this.getCanvas()._canvas.style.display = 'block';\n        this.hitCanvas._canvas.style.display = 'block';\n      } else {\n        this.getCanvas()._canvas.style.display = 'none';\n        this.hitCanvas._canvas.style.display = 'none';\n      }\n      return this;\n    },\n    /**\n         * enable hit graph\n         * @name enableHitGraph\n         * @method\n         * @memberof Konva.Layer.prototype\n         * @returns {Layer}\n         */\n    enableHitGraph: function() {\n      this.setHitGraphEnabled(true);\n      return this;\n    },\n    /**\n         * disable hit graph\n         * @name disableHitGraph\n         * @method\n         * @memberof Konva.Layer.prototype\n         * @returns {Layer}\n         */\n    disableHitGraph: function() {\n      this.setHitGraphEnabled(false);\n      return this;\n    },\n    setSize: function(width, height) {\n      Konva.BaseLayer.prototype.setSize.call(this, width, height);\n      this.hitCanvas.setSize(width, height);\n      return this;\n    }\n  });\n  Konva.Util.extend(Konva.Layer, Konva.BaseLayer);\n\n  Konva.Factory.addGetterSetter(Konva.Layer, 'hitGraphEnabled', true);\n  /**\n     * get/set hitGraphEnabled flag.  Disabling the hit graph will greatly increase\n     *  draw performance because the hit graph will not be redrawn each time the layer is\n     *  drawn.  This, however, also disables mouse/touch event detection\n     * @name hitGraphEnabled\n     * @method\n     * @memberof Konva.Layer.prototype\n     * @param {Boolean} enabled\n     * @returns {Boolean}\n     * @example\n     * // get hitGraphEnabled flag\n     * var hitGraphEnabled = layer.hitGraphEnabled();\n     *\n     * // disable hit graph\n     * layer.hitGraphEnabled(false);\n     *\n     * // enable hit graph\n     * layer.hitGraphEnabled(true);\n     */\n  Konva.Collection.mapMethods(Konva.Layer);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * FastLayer constructor. Layers are tied to their own canvas element and are used\n     * to contain shapes only.  If you don't need node nesting, mouse and touch interactions,\n     * or event pub/sub, you should use FastLayer instead of Layer to create your layers.\n     * It renders about 2x faster than normal layers.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.BaseLayer\n     * @param {Object} config\n     * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want\n     * to clear the canvas before each layer draw.  The default value is true.\n     * @param {Boolean} [config.visible]\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * * @param {Object} [config.clip] set clip\n     * @param {Number} [config.clipX] set clip x\n     * @param {Number} [config.clipY] set clip y\n     * @param {Number} [config.clipWidth] set clip width\n     * @param {Number} [config.clipHeight] set clip height\n     * @param {Function} [config.clipFunc] set clip func\n\n     * @example\n     * var layer = new Konva.FastLayer();\n     */\n  Konva.FastLayer = function(config) {\n    this.____init(config);\n  };\n\n  Konva.Util.addMethods(Konva.FastLayer, {\n    ____init: function(config) {\n      this.nodeType = 'Layer';\n      this.canvas = new Konva.SceneCanvas();\n      // call super constructor\n      Konva.BaseLayer.call(this, config);\n    },\n    _validateAdd: function(child) {\n      var type = child.getType();\n      if (type !== 'Shape') {\n        Konva.Util.throw('You may only add shapes to a fast layer.');\n      }\n    },\n    _setCanvasSize: function(width, height) {\n      this.canvas.setSize(width, height);\n    },\n    hitGraphEnabled: function() {\n      return false;\n    },\n    getIntersection: function() {\n      return null;\n    },\n    drawScene: function(can) {\n      var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas());\n\n      if (this.getClearBeforeDraw()) {\n        canvas.getContext().clear();\n      }\n\n      Konva.Container.prototype.drawScene.call(this, canvas);\n\n      return this;\n    },\n    draw: function() {\n      this.drawScene();\n      return this;\n    },\n    // extend Node.prototype.setVisible\n    setVisible: function(visible) {\n      Konva.Node.prototype.setVisible.call(this, visible);\n      if (visible) {\n        this.getCanvas()._canvas.style.display = 'block';\n      } else {\n        this.getCanvas()._canvas.style.display = 'none';\n      }\n      return this;\n    }\n  });\n  Konva.Util.extend(Konva.FastLayer, Konva.BaseLayer);\n\n  Konva.Collection.mapMethods(Konva.FastLayer);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Group constructor.  Groups are used to contain shapes or other groups.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Container\n     * @param {Object} config\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * * @param {Object} [config.clip] set clip\n     * @param {Number} [config.clipX] set clip x\n     * @param {Number} [config.clipY] set clip y\n     * @param {Number} [config.clipWidth] set clip width\n     * @param {Number} [config.clipHeight] set clip height\n     * @param {Function} [config.clipFunc] set clip func\n\n     * @example\n     * var group = new Konva.Group();\n     */\n  Konva.Group = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Util.addMethods(Konva.Group, {\n    ___init: function(config) {\n      this.nodeType = 'Group';\n      // call super constructor\n      Konva.Container.call(this, config);\n    },\n    _validateAdd: function(child) {\n      var type = child.getType();\n      if (type !== 'Group' && type !== 'Shape') {\n        Konva.Util.throw('You may only add groups and shapes to groups.');\n      }\n    }\n  });\n  Konva.Util.extend(Konva.Group, Konva.Container);\n\n  Konva.Collection.mapMethods(Konva.Group);\n})();\n\n(function(Konva) {\n  'use strict';\n  var now = (function() {\n    if (Konva.global.performance && Konva.global.performance.now) {\n      return function() {\n        return Konva.global.performance.now();\n      };\n    }\n\n    return function() {\n      return new Date().getTime();\n    };\n  })();\n\n  function FRAF(callback) {\n    setTimeout(callback, 1000 / 60);\n  }\n\n  var RAF = (function() {\n    return (\n      Konva.global.requestAnimationFrame ||\n      Konva.global.webkitRequestAnimationFrame ||\n      Konva.global.mozRequestAnimationFrame ||\n      Konva.global.oRequestAnimationFrame ||\n      Konva.global.msRequestAnimationFrame ||\n      FRAF\n    );\n  })();\n\n  function requestAnimFrame() {\n    return RAF.apply(Konva.global, arguments);\n  }\n\n  /**\n     * Animation constructor.  A stage is used to contain multiple layers and handle\n     * @constructor\n     * @memberof Konva\n     * @param {Function} func function executed on each animation frame.  The function is passed a frame object, which contains\n     *  timeDiff, lastTime, time, and frameRate properties.  The timeDiff property is the number of milliseconds that have passed\n     *  since the last animation frame.  The lastTime property is time in milliseconds that elapsed from the moment the animation started\n     *  to the last animation frame.  The time property is the time in milliseconds that ellapsed from the moment the animation started\n     *  to the current animation frame.  The frameRate property is the current frame rate in frames / second. Return false from function,\n     *  if you don't need to redraw layer/layers on some frames.\n     * @param {Konva.Layer|Array} [layers] layer(s) to be redrawn on each animation frame. Can be a layer, an array of layers, or null.\n     *  Not specifying a node will result in no redraw.\n     * @example\n     * // move a node to the right at 50 pixels / second\n     * var velocity = 50;\n     *\n     * var anim = new Konva.Animation(function(frame) {\n     *   var dist = velocity * (frame.timeDiff / 1000);\n     *   node.move(dist, 0);\n     * }, layer);\n     *\n     * anim.start();\n     */\n  Konva.Animation = function(func, layers) {\n    var Anim = Konva.Animation;\n    this.func = func;\n    this.setLayers(layers);\n    this.id = Anim.animIdCounter++;\n    this.frame = {\n      time: 0,\n      timeDiff: 0,\n      lastTime: now()\n    };\n  };\n  /*\n     * Animation methods\n     */\n  Konva.Animation.prototype = {\n    /**\n         * set layers to be redrawn on each animation frame\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @param {Konva.Layer|Array} [layers] layer(s) to be redrawn.&nbsp; Can be a layer, an array of layers, or null.  Not specifying a node will result in no redraw.\n         * @return {Konva.Animation} this\n         */\n    setLayers: function(layers) {\n      var lays = [];\n      // if passing in no layers\n      if (!layers) {\n        lays = [];\n      } else if (layers.length > 0) {\n        // if passing in an array of Layers\n        // NOTE: layers could be an array or Konva.Collection.  for simplicity, I'm just inspecting\n        // the length property to check for both cases\n        lays = layers;\n      } else {\n        // if passing in a Layer\n        lays = [layers];\n      }\n\n      this.layers = lays;\n      return this;\n    },\n    /**\n         * get layers\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @return {Array} Array of Konva.Layer\n         */\n    getLayers: function() {\n      return this.layers;\n    },\n    /**\n         * add layer.  Returns true if the layer was added, and false if it was not\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @param {Konva.Layer} layer to add\n         * @return {Bool} true if layer is added to animation, otherwise false\n         */\n    addLayer: function(layer) {\n      var layers = this.layers, len = layers.length, n;\n\n      // don't add the layer if it already exists\n      for (n = 0; n < len; n++) {\n        if (layers[n]._id === layer._id) {\n          return false;\n        }\n      }\n\n      this.layers.push(layer);\n      return true;\n    },\n    /**\n         * determine if animation is running or not.  returns true or false\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @return {Bool} is animation running?\n         */\n    isRunning: function() {\n      var a = Konva.Animation,\n        animations = a.animations,\n        len = animations.length,\n        n;\n\n      for (n = 0; n < len; n++) {\n        if (animations[n].id === this.id) {\n          return true;\n        }\n      }\n      return false;\n    },\n    /**\n         * start animation\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @return {Konva.Animation} this\n         */\n    start: function() {\n      var Anim = Konva.Animation;\n      this.stop();\n      this.frame.timeDiff = 0;\n      this.frame.lastTime = now();\n      Anim._addAnimation(this);\n      return this;\n    },\n    /**\n         * stop animation\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @return {Konva.Animation} this\n         */\n    stop: function() {\n      Konva.Animation._removeAnimation(this);\n      return this;\n    },\n    _updateFrameObject: function(time) {\n      this.frame.timeDiff = time - this.frame.lastTime;\n      this.frame.lastTime = time;\n      this.frame.time += this.frame.timeDiff;\n      this.frame.frameRate = 1000 / this.frame.timeDiff;\n    }\n  };\n  Konva.Animation.animations = [];\n  Konva.Animation.animIdCounter = 0;\n  Konva.Animation.animRunning = false;\n\n  Konva.Animation._addAnimation = function(anim) {\n    this.animations.push(anim);\n    this._handleAnimation();\n  };\n  Konva.Animation._removeAnimation = function(anim) {\n    var id = anim.id, animations = this.animations, len = animations.length, n;\n\n    for (n = 0; n < len; n++) {\n      if (animations[n].id === id) {\n        this.animations.splice(n, 1);\n        break;\n      }\n    }\n  };\n\n  Konva.Animation._runFrames = function() {\n    var layerHash = {},\n      animations = this.animations,\n      anim,\n      layers,\n      func,\n      n,\n      i,\n      layersLen,\n      layer,\n      key,\n      needRedraw;\n    /*\n         * loop through all animations and execute animation\n         *  function.  if the animation object has specified node,\n         *  we can add the node to the nodes hash to eliminate\n         *  drawing the same node multiple times.  The node property\n         *  can be the stage itself or a layer\n         */\n    /*\n         * WARNING: don't cache animations.length because it could change while\n         * the for loop is running, causing a JS error\n         */\n\n    for (n = 0; n < animations.length; n++) {\n      anim = animations[n];\n      layers = anim.layers;\n      func = anim.func;\n\n      anim._updateFrameObject(now());\n      layersLen = layers.length;\n\n      // if animation object has a function, execute it\n      if (func) {\n        // allow anim bypassing drawing\n        needRedraw = func.call(anim, anim.frame) !== false;\n      } else {\n        needRedraw = true;\n      }\n      if (!needRedraw) {\n        continue;\n      }\n      for (i = 0; i < layersLen; i++) {\n        layer = layers[i];\n\n        if (layer._id !== undefined) {\n          layerHash[layer._id] = layer;\n        }\n      }\n    }\n\n    for (key in layerHash) {\n      if (!layerHash.hasOwnProperty(key)) {\n        continue;\n      }\n      layerHash[key].draw();\n    }\n  };\n  Konva.Animation._animationLoop = function() {\n    var Anim = Konva.Animation;\n    if (Anim.animations.length) {\n      Anim._runFrames();\n      requestAnimFrame(Anim._animationLoop);\n    } else {\n      Anim.animRunning = false;\n    }\n  };\n  Konva.Animation._handleAnimation = function() {\n    if (!this.animRunning) {\n      this.animRunning = true;\n      requestAnimFrame(this._animationLoop);\n    }\n  };\n\n  /**\n     * batch draw. this function will not do immediate draw\n     * but it will schedule drawing to next tick (requestAnimFrame)\n     * @method\n     * @return {Konva.Layer} this\n     * @memberof Konva.Base.prototype\n     */\n  Konva.BaseLayer.prototype.batchDraw = function() {\n    var that = this, Anim = Konva.Animation;\n\n    if (!this.batchAnim) {\n      this.batchAnim = new Anim(function() {\n        // stop animation after first tick\n        that.batchAnim.stop();\n      }, this);\n    }\n\n    if (!this.batchAnim.isRunning()) {\n      this.batchAnim.start();\n    }\n    return this;\n  };\n\n  /**\n     * batch draw\n     * @method\n     * @return {Konva.Stage} this\n     * @memberof Konva.Stage.prototype\n     */\n  Konva.Stage.prototype.batchDraw = function() {\n    this.getChildren().each(function(layer) {\n      layer.batchDraw();\n    });\n    return this;\n  };\n})(Konva);\n\n(function() {\n  'use strict';\n  var blacklist = {\n    node: 1,\n    duration: 1,\n    easing: 1,\n    onFinish: 1,\n    yoyo: 1\n  },\n    PAUSED = 1,\n    PLAYING = 2,\n    REVERSING = 3,\n    idCounter = 0,\n    colorAttrs = ['fill', 'stroke', 'shadowColor'];\n\n  var Tween = function(prop, propFunc, func, begin, finish, duration, yoyo) {\n    this.prop = prop;\n    this.propFunc = propFunc;\n    this.begin = begin;\n    this._pos = begin;\n    this.duration = duration;\n    this._change = 0;\n    this.prevPos = 0;\n    this.yoyo = yoyo;\n    this._time = 0;\n    this._position = 0;\n    this._startTime = 0;\n    this._finish = 0;\n    this.func = func;\n    this._change = finish - this.begin;\n    this.pause();\n  };\n  /*\n     * Tween methods\n     */\n  Tween.prototype = {\n    fire: function(str) {\n      var handler = this[str];\n      if (handler) {\n        handler();\n      }\n    },\n    setTime: function(t) {\n      if (t > this.duration) {\n        if (this.yoyo) {\n          this._time = this.duration;\n          this.reverse();\n        } else {\n          this.finish();\n        }\n      } else if (t < 0) {\n        if (this.yoyo) {\n          this._time = 0;\n          this.play();\n        } else {\n          this.reset();\n        }\n      } else {\n        this._time = t;\n        this.update();\n      }\n    },\n    getTime: function() {\n      return this._time;\n    },\n    setPosition: function(p) {\n      this.prevPos = this._pos;\n      this.propFunc(p);\n      this._pos = p;\n    },\n    getPosition: function(t) {\n      if (t === undefined) {\n        t = this._time;\n      }\n      return this.func(t, this.begin, this._change, this.duration);\n    },\n    play: function() {\n      this.state = PLAYING;\n      this._startTime = this.getTimer() - this._time;\n      this.onEnterFrame();\n      this.fire('onPlay');\n    },\n    reverse: function() {\n      this.state = REVERSING;\n      this._time = this.duration - this._time;\n      this._startTime = this.getTimer() - this._time;\n      this.onEnterFrame();\n      this.fire('onReverse');\n    },\n    seek: function(t) {\n      this.pause();\n      this._time = t;\n      this.update();\n      this.fire('onSeek');\n    },\n    reset: function() {\n      this.pause();\n      this._time = 0;\n      this.update();\n      this.fire('onReset');\n    },\n    finish: function() {\n      this.pause();\n      this._time = this.duration;\n      this.update();\n      this.fire('onFinish');\n    },\n    update: function() {\n      this.setPosition(this.getPosition(this._time));\n    },\n    onEnterFrame: function() {\n      var t = this.getTimer() - this._startTime;\n      if (this.state === PLAYING) {\n        this.setTime(t);\n      } else if (this.state === REVERSING) {\n        this.setTime(this.duration - t);\n      }\n    },\n    pause: function() {\n      this.state = PAUSED;\n      this.fire('onPause');\n    },\n    getTimer: function() {\n      return new Date().getTime();\n    }\n  };\n\n  /**\n     * Tween constructor.  Tweens enable you to animate a node between the current state and a new state.\n     *  You can play, pause, reverse, seek, reset, and finish tweens.  By default, tweens are animated using\n     *  a linear easing.  For more tweening options, check out {@link Konva.Easings}\n     * @constructor\n     * @memberof Konva\n     * @example\n     * // instantiate new tween which fully rotates a node in 1 second\n     * var tween = new Konva.Tween({\n     *   node: node,\n     *   rotationDeg: 360,\n     *   duration: 1,\n     *   easing: Konva.Easings.EaseInOut\n     * });\n     *\n     * // play tween\n     * tween.play();\n     *\n     * // pause tween\n     * tween.pause();\n     */\n  Konva.Tween = function(config) {\n    var that = this,\n      node = config.node,\n      nodeId = node._id,\n      duration,\n      easing = config.easing || Konva.Easings.Linear,\n      yoyo = !!config.yoyo,\n      key;\n\n    if (typeof config.duration === 'undefined') {\n      duration = 1;\n    } else if (config.duration === 0) {\n      // zero is bad value for duration\n      duration = 0.001;\n    } else {\n      duration = config.duration;\n    }\n    this.node = node;\n    this._id = idCounter++;\n\n    var layers =\n      node.getLayer() ||\n      (node instanceof Konva.Stage ? node.getLayers() : null);\n    if (!layers) {\n      Konva.Util.error(\n        'Tween constructor have `node` that is not in a layer. Please add node into layer first.'\n      );\n    }\n    this.anim = new Konva.Animation(function() {\n      that.tween.onEnterFrame();\n    }, layers);\n\n    this.tween = new Tween(\n      key,\n      function(i) {\n        that._tweenFunc(i);\n      },\n      easing,\n      0,\n      1,\n      duration * 1000,\n      yoyo\n    );\n\n    this._addListeners();\n\n    // init attrs map\n    if (!Konva.Tween.attrs[nodeId]) {\n      Konva.Tween.attrs[nodeId] = {};\n    }\n    if (!Konva.Tween.attrs[nodeId][this._id]) {\n      Konva.Tween.attrs[nodeId][this._id] = {};\n    }\n    // init tweens map\n    if (!Konva.Tween.tweens[nodeId]) {\n      Konva.Tween.tweens[nodeId] = {};\n    }\n\n    for (key in config) {\n      if (blacklist[key] === undefined) {\n        this._addAttr(key, config[key]);\n      }\n    }\n\n    this.reset();\n\n    // callbacks\n    this.onFinish = config.onFinish;\n    this.onReset = config.onReset;\n  };\n\n  // start/diff object = attrs.nodeId.tweenId.attr\n  Konva.Tween.attrs = {};\n  // tweenId = tweens.nodeId.attr\n  Konva.Tween.tweens = {};\n\n  Konva.Tween.prototype = {\n    _addAttr: function(key, end) {\n      var node = this.node,\n        nodeId = node._id,\n        start,\n        diff,\n        tweenId,\n        n,\n        len,\n        trueEnd,\n        trueStart;\n\n      // remove conflict from tween map if it exists\n      tweenId = Konva.Tween.tweens[nodeId][key];\n\n      if (tweenId) {\n        delete Konva.Tween.attrs[nodeId][tweenId][key];\n      }\n\n      // add to tween map\n      start = node.getAttr(key);\n\n      if (Konva.Util._isArray(end)) {\n        diff = [];\n        len = Math.max(end.length, start.length);\n\n        if (key === 'points' && end.length !== start.length) {\n          // before tweening points we need to make sure that start.length === end.length\n          // Konva.Util._prepareArrayForTween thinking that end.length > start.length\n\n          if (end.length > start.length) {\n            // so in this case we will increase number of starting points\n            trueStart = start;\n            start = Konva.Util._prepareArrayForTween(start, end, node.closed());\n          } else {\n            // in this case we will increase number of eding points\n            trueEnd = end;\n            end = Konva.Util._prepareArrayForTween(end, start, node.closed());\n          }\n        }\n\n        for (n = 0; n < len; n++) {\n          diff.push(end[n] - start[n]);\n        }\n      } else if (colorAttrs.indexOf(key) !== -1) {\n        start = Konva.Util.colorToRGBA(start);\n        var endRGBA = Konva.Util.colorToRGBA(end);\n        diff = {\n          r: endRGBA.r - start.r,\n          g: endRGBA.g - start.g,\n          b: endRGBA.b - start.b,\n          a: endRGBA.a - start.a\n        };\n      } else {\n        diff = end - start;\n      }\n\n      Konva.Tween.attrs[nodeId][this._id][key] = {\n        start: start,\n        diff: diff,\n        end: end,\n        trueEnd: trueEnd,\n        trueStart: trueStart\n      };\n      Konva.Tween.tweens[nodeId][key] = this._id;\n    },\n    _tweenFunc: function(i) {\n      var node = this.node,\n        attrs = Konva.Tween.attrs[node._id][this._id],\n        key,\n        attr,\n        start,\n        diff,\n        newVal,\n        n,\n        len,\n        end;\n\n      for (key in attrs) {\n        attr = attrs[key];\n        start = attr.start;\n        diff = attr.diff;\n        end = attr.end;\n\n        if (Konva.Util._isArray(start)) {\n          newVal = [];\n          len = Math.max(start.length, end.length);\n          for (n = 0; n < len; n++) {\n            newVal.push((start[n] || 0) + diff[n] * i);\n          }\n        } else if (colorAttrs.indexOf(key) !== -1) {\n          newVal =\n            'rgba(' +\n            Math.round(start.r + diff.r * i) +\n            ',' +\n            Math.round(start.g + diff.g * i) +\n            ',' +\n            Math.round(start.b + diff.b * i) +\n            ',' +\n            (start.a + diff.a * i) +\n            ')';\n        } else {\n          newVal = start + diff * i;\n        }\n\n        node.setAttr(key, newVal);\n      }\n    },\n    _addListeners: function() {\n      var that = this;\n\n      // start listeners\n      this.tween.onPlay = function() {\n        that.anim.start();\n      };\n      this.tween.onReverse = function() {\n        that.anim.start();\n      };\n\n      // stop listeners\n      this.tween.onPause = function() {\n        that.anim.stop();\n      };\n      this.tween.onFinish = function() {\n        var node = that.node;\n\n        // after tweening  points of line we need to set original end\n        var attrs = Konva.Tween.attrs[node._id][that._id];\n        if (attrs.points && attrs.points.trueEnd) {\n          node.points(attrs.points.trueEnd);\n        }\n\n        if (that.onFinish) {\n          that.onFinish.call(that);\n        }\n      };\n      this.tween.onReset = function() {\n        var node = that.node;\n        // after tweening  points of line we need to set original start\n        var attrs = Konva.Tween.attrs[node._id][that._id];\n        if (attrs.points && attrs.points.trueStart) {\n          node.points(attrs.points.trueStart);\n        }\n\n        if (that.onReset) {\n          that.onReset();\n        }\n      };\n    },\n    /**\n         * play\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @returns {Tween}\n         */\n    play: function() {\n      this.tween.play();\n      return this;\n    },\n    /**\n         * reverse\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @returns {Tween}\n         */\n    reverse: function() {\n      this.tween.reverse();\n      return this;\n    },\n    /**\n         * reset\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @returns {Tween}\n         */\n    reset: function() {\n      this.tween.reset();\n      return this;\n    },\n    /**\n         * seek\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @param {Integer} t time in seconds between 0 and the duration\n         * @returns {Tween}\n         */\n    seek: function(t) {\n      this.tween.seek(t * 1000);\n      return this;\n    },\n    /**\n         * pause\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @returns {Tween}\n         */\n    pause: function() {\n      this.tween.pause();\n      return this;\n    },\n    /**\n         * finish\n         * @method\n         * @memberof Konva.Tween.prototype\n         * @returns {Tween}\n         */\n    finish: function() {\n      this.tween.finish();\n      return this;\n    },\n    /**\n         * destroy\n         * @method\n         * @memberof Konva.Tween.prototype\n         */\n    destroy: function() {\n      var nodeId = this.node._id,\n        thisId = this._id,\n        attrs = Konva.Tween.tweens[nodeId],\n        key;\n\n      this.pause();\n\n      for (key in attrs) {\n        delete Konva.Tween.tweens[nodeId][key];\n      }\n\n      delete Konva.Tween.attrs[nodeId][thisId];\n    }\n  };\n\n  /**\n     * Tween node properties. Shorter usage of {@link Konva.Tween} object.\n     *\n     * @method Konva.Node#to\n     * @memberof Konva.Node\n     * @param {Object} [params] tween params\n     * @example\n     *\n     * circle.to({\n     *  x : 50,\n     *  duration : 0.5\n     * });\n     */\n  Konva.Node.prototype.to = function(params) {\n    var onFinish = params.onFinish;\n    params.node = this;\n    params.onFinish = function() {\n      this.destroy();\n      if (onFinish) {\n        onFinish();\n      }\n    };\n    var tween = new Konva.Tween(params);\n    tween.play();\n  };\n\n  /*\n    * These eases were ported from an Adobe Flash tweening library to JavaScript\n    * by Xaric\n    */\n\n  /**\n     * @namespace Easings\n     * @memberof Konva\n     */\n  Konva.Easings = {\n    /**\n        * back ease in\n        * @function\n        * @memberof Konva.Easings\n        */\n    BackEaseIn: function(t, b, c, d) {\n      var s = 1.70158;\n      return c * (t /= d) * t * ((s + 1) * t - s) + b;\n    },\n    /**\n        * back ease out\n        * @function\n        * @memberof Konva.Easings\n        */\n    BackEaseOut: function(t, b, c, d) {\n      var s = 1.70158;\n      return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n    },\n    /**\n        * back ease in out\n        * @function\n        * @memberof Konva.Easings\n        */\n    BackEaseInOut: function(t, b, c, d) {\n      var s = 1.70158;\n      if ((t /= d / 2) < 1) {\n        return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n      }\n      return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n    },\n    /**\n        * elastic ease in\n        * @function\n        * @memberof Konva.Easings\n        */\n    ElasticEaseIn: function(t, b, c, d, a, p) {\n      // added s = 0\n      var s = 0;\n      if (t === 0) {\n        return b;\n      }\n      if ((t /= d) === 1) {\n        return b + c;\n      }\n      if (!p) {\n        p = d * 0.3;\n      }\n      if (!a || a < Math.abs(c)) {\n        a = c;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(c / a);\n      }\n      return (\n        -(a *\n          Math.pow(2, 10 * (t -= 1)) *\n          Math.sin((t * d - s) * (2 * Math.PI) / p)) + b\n      );\n    },\n    /**\n        * elastic ease out\n        * @function\n        * @memberof Konva.Easings\n        */\n    ElasticEaseOut: function(t, b, c, d, a, p) {\n      // added s = 0\n      var s = 0;\n      if (t === 0) {\n        return b;\n      }\n      if ((t /= d) === 1) {\n        return b + c;\n      }\n      if (!p) {\n        p = d * 0.3;\n      }\n      if (!a || a < Math.abs(c)) {\n        a = c;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(c / a);\n      }\n      return (\n        a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) +\n        c +\n        b\n      );\n    },\n    /**\n        * elastic ease in out\n        * @function\n        * @memberof Konva.Easings\n        */\n    ElasticEaseInOut: function(t, b, c, d, a, p) {\n      // added s = 0\n      var s = 0;\n      if (t === 0) {\n        return b;\n      }\n      if ((t /= d / 2) === 2) {\n        return b + c;\n      }\n      if (!p) {\n        p = d * (0.3 * 1.5);\n      }\n      if (!a || a < Math.abs(c)) {\n        a = c;\n        s = p / 4;\n      } else {\n        s = p / (2 * Math.PI) * Math.asin(c / a);\n      }\n      if (t < 1) {\n        return (\n          -0.5 *\n            (a *\n              Math.pow(2, 10 * (t -= 1)) *\n              Math.sin((t * d - s) * (2 * Math.PI) / p)) +\n          b\n        );\n      }\n      return (\n        a *\n          Math.pow(2, -10 * (t -= 1)) *\n          Math.sin((t * d - s) * (2 * Math.PI) / p) *\n          0.5 +\n        c +\n        b\n      );\n    },\n    /**\n        * bounce ease out\n        * @function\n        * @memberof Konva.Easings\n        */\n    BounceEaseOut: function(t, b, c, d) {\n      if ((t /= d) < 1 / 2.75) {\n        return c * (7.5625 * t * t) + b;\n      } else if (t < 2 / 2.75) {\n        return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n      } else if (t < 2.5 / 2.75) {\n        return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n      } else {\n        return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n      }\n    },\n    /**\n        * bounce ease in\n        * @function\n        * @memberof Konva.Easings\n        */\n    BounceEaseIn: function(t, b, c, d) {\n      return c - Konva.Easings.BounceEaseOut(d - t, 0, c, d) + b;\n    },\n    /**\n        * bounce ease in out\n        * @function\n        * @memberof Konva.Easings\n        */\n    BounceEaseInOut: function(t, b, c, d) {\n      if (t < d / 2) {\n        return Konva.Easings.BounceEaseIn(t * 2, 0, c, d) * 0.5 + b;\n      } else {\n        return (\n          Konva.Easings.BounceEaseOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b\n        );\n      }\n    },\n    /**\n        * ease in\n        * @function\n        * @memberof Konva.Easings\n        */\n    EaseIn: function(t, b, c, d) {\n      return c * (t /= d) * t + b;\n    },\n    /**\n        * ease out\n        * @function\n        * @memberof Konva.Easings\n        */\n    EaseOut: function(t, b, c, d) {\n      return -c * (t /= d) * (t - 2) + b;\n    },\n    /**\n        * ease in out\n        * @function\n        * @memberof Konva.Easings\n        */\n    EaseInOut: function(t, b, c, d) {\n      if ((t /= d / 2) < 1) {\n        return c / 2 * t * t + b;\n      }\n      return -c / 2 * (--t * (t - 2) - 1) + b;\n    },\n    /**\n        * strong ease in\n        * @function\n        * @memberof Konva.Easings\n        */\n    StrongEaseIn: function(t, b, c, d) {\n      return c * (t /= d) * t * t * t * t + b;\n    },\n    /**\n        * strong ease out\n        * @function\n        * @memberof Konva.Easings\n        */\n    StrongEaseOut: function(t, b, c, d) {\n      return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n    },\n    /**\n        * strong ease in out\n        * @function\n        * @memberof Konva.Easings\n        */\n    StrongEaseInOut: function(t, b, c, d) {\n      if ((t /= d / 2) < 1) {\n        return c / 2 * t * t * t * t * t + b;\n      }\n      return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n    },\n    /**\n        * linear\n        * @function\n        * @memberof Konva.Easings\n        */\n    Linear: function(t, b, c, d) {\n      return c * t / d + b;\n    }\n  };\n})();\n\n(function() {\n  'use strict';\n  Konva.DD = {\n    // properties\n    anim: new Konva.Animation(function() {\n      var b = this.dirty;\n      this.dirty = false;\n      return b;\n    }),\n    isDragging: false,\n    justDragged: false,\n    offset: {\n      x: 0,\n      y: 0\n    },\n    node: null,\n\n    // methods\n    _drag: function(evt) {\n      var dd = Konva.DD,\n        node = dd.node;\n      if (node) {\n        if (!dd.isDragging) {\n          var pos = node.getStage().getPointerPosition();\n          // it is possible that pos is undefined\n          // reattach it\n          if (!pos) {\n            node.getStage()._setPointerPosition(evt);\n            pos = node.getStage().getPointerPosition();\n          }\n          var dragDistance = node.dragDistance();\n          var distance = Math.max(\n            Math.abs(pos.x - dd.startPointerPos.x),\n            Math.abs(pos.y - dd.startPointerPos.y)\n          );\n          if (distance < dragDistance) {\n            return;\n          }\n        }\n\n        node.getStage()._setPointerPosition(evt);\n        node._setDragPosition(evt);\n        if (!dd.isDragging) {\n          dd.isDragging = true;\n          node.fire(\n            'dragstart',\n            {\n              type: 'dragstart',\n              target: node,\n              evt: evt\n            },\n            true\n          );\n        }\n\n        // execute ondragmove if defined\n        node.fire(\n          'dragmove',\n          {\n            type: 'dragmove',\n            target: node,\n            evt: evt\n          },\n          true\n        );\n      }\n    },\n    _endDragBefore: function(evt) {\n      var dd = Konva.DD,\n        node = dd.node,\n        layer;\n\n      if (node) {\n        layer = node.getLayer();\n        dd.anim.stop();\n\n        // only fire dragend event if the drag and drop\n        // operation actually started.\n        if (dd.isDragging) {\n          dd.isDragging = false;\n          dd.justDragged = true;\n          Konva.listenClickTap = false;\n\n          if (evt) {\n            evt.dragEndNode = node;\n          }\n        }\n\n        delete dd.node;\n\n        if (node.getLayer() || layer || node instanceof Konva.Stage) {\n          (layer || node).draw();\n        }\n      }\n    },\n    _endDragAfter: function(evt) {\n      evt = evt || {};\n      var dragEndNode = evt.dragEndNode;\n\n      if (evt && dragEndNode) {\n        dragEndNode.fire(\n          'dragend',\n          {\n            type: 'dragend',\n            target: dragEndNode,\n            evt: evt\n          },\n          true\n        );\n      }\n    }\n  };\n\n  // Node extenders\n\n  /**\n     * initiate drag and drop\n     * @method\n     * @memberof Konva.Node.prototype\n     */\n  Konva.Node.prototype.startDrag = function() {\n    var dd = Konva.DD,\n      stage = this.getStage(),\n      layer = this.getLayer(),\n      pos = stage.getPointerPosition(),\n      ap = this.getAbsolutePosition();\n\n    if (pos) {\n      if (dd.node) {\n        dd.node.stopDrag();\n      }\n\n      dd.node = this;\n      dd.startPointerPos = pos;\n      dd.offset.x = pos.x - ap.x;\n      dd.offset.y = pos.y - ap.y;\n      dd.anim.setLayers(layer || this.getLayers());\n      dd.anim.start();\n\n      this._setDragPosition();\n    }\n  };\n\n  Konva.Node.prototype._setDragPosition = function(evt) {\n    var dd = Konva.DD,\n      pos = this.getStage().getPointerPosition(),\n      dbf = this.getDragBoundFunc();\n    if (!pos) {\n      return;\n    }\n    var newNodePos = {\n      x: pos.x - dd.offset.x,\n      y: pos.y - dd.offset.y\n    };\n\n    if (dbf !== undefined) {\n      newNodePos = dbf.call(this, newNodePos, evt);\n    }\n    this.setAbsolutePosition(newNodePos);\n\n    if (\n      !this._lastPos ||\n      this._lastPos.x !== newNodePos.x ||\n      this._lastPos.y !== newNodePos.y\n    ) {\n      dd.anim.dirty = true;\n    }\n\n    this._lastPos = newNodePos;\n  };\n\n  /**\n     * stop drag and drop\n     * @method\n     * @memberof Konva.Node.prototype\n     */\n  Konva.Node.prototype.stopDrag = function() {\n    var dd = Konva.DD,\n      evt = {};\n    dd._endDragBefore(evt);\n    dd._endDragAfter(evt);\n  };\n\n  Konva.Node.prototype.setDraggable = function(draggable) {\n    this._setAttr('draggable', draggable);\n    this._dragChange();\n  };\n\n  var origRemove = Konva.Node.prototype.remove;\n\n  Konva.Node.prototype.__originalRemove = origRemove;\n  Konva.Node.prototype.remove = function() {\n    var dd = Konva.DD;\n\n    // stop DD\n    if (dd.node && dd.node._id === this._id) {\n      this.stopDrag();\n    }\n\n    origRemove.call(this);\n  };\n\n  /**\n     * determine if node is currently in drag and drop mode\n     * @method\n     * @memberof Konva.Node.prototype\n     */\n  Konva.Node.prototype.isDragging = function() {\n    var dd = Konva.DD;\n    return !!(dd.node && dd.node._id === this._id && dd.isDragging);\n  };\n\n  Konva.Node.prototype._listenDrag = function() {\n    var that = this;\n\n    this._dragCleanup();\n\n    if (this.getClassName() === 'Stage') {\n      this.on('contentMousedown.konva contentTouchstart.konva', function(evt) {\n        if (!Konva.DD.node) {\n          that.startDrag(evt);\n        }\n      });\n    } else {\n      this.on('mousedown.konva touchstart.konva', function(evt) {\n        // ignore right and middle buttons\n        if (evt.evt.button === 1 || evt.evt.button === 2) {\n          return;\n        }\n        if (!Konva.DD.node) {\n          that.startDrag(evt);\n        }\n      });\n    }\n\n    // listening is required for drag and drop\n    /*\n        this._listeningEnabled = true;\n        this._clearSelfAndAncestorCache('listeningEnabled');\n        */\n  };\n\n  Konva.Node.prototype._dragChange = function() {\n    if (this.attrs.draggable) {\n      this._listenDrag();\n    } else {\n      // remove event listeners\n      this._dragCleanup();\n\n      /*\n             * force drag and drop to end\n             * if this node is currently in\n             * drag and drop mode\n             */\n      var stage = this.getStage();\n      var dd = Konva.DD;\n      if (stage && dd.node && dd.node._id === this._id) {\n        dd.node.stopDrag();\n      }\n    }\n  };\n\n  Konva.Node.prototype._dragCleanup = function() {\n    if (this.getClassName() === 'Stage') {\n      this.off('contentMousedown.konva');\n      this.off('contentTouchstart.konva');\n    } else {\n      this.off('mousedown.konva');\n      this.off('touchstart.konva');\n    }\n  };\n\n  Konva.Factory.addGetterSetter(Konva.Node, 'dragBoundFunc');\n\n  /**\n     * get/set drag bound function.  This is used to override the default\n     *  drag and drop position\n     * @name dragBoundFunc\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Function} dragBoundFunc\n     * @returns {Function}\n     * @example\n     * // get drag bound function\n     * var dragBoundFunc = node.dragBoundFunc();\n     *\n     * // create vertical drag and drop\n     * node.dragBoundFunc(function(pos){\n     *   return {\n     *     x: this.getAbsolutePosition().x,\n     *     y: pos.y\n     *   };\n     * });\n     */\n\n  Konva.Factory.addGetter(Konva.Node, 'draggable', false);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Node, 'draggable');\n\n  /**\n     * get/set draggable flag\n     * @name draggable\n     * @method\n     * @memberof Konva.Node.prototype\n     * @param {Boolean} draggable\n     * @returns {Boolean}\n     * @example\n     * // get draggable flag\n     * var draggable = node.draggable();\n     *\n     * // enable drag and drop\n     * node.draggable(true);\n     *\n     * // disable drag and drop\n     * node.draggable(false);\n     */\n\n  if (Konva.isBrowser) {\n    var html = Konva.document.documentElement;\n    html.addEventListener('mouseup', Konva.DD._endDragBefore, true);\n    html.addEventListener('touchend', Konva.DD._endDragBefore, true);\n\n    html.addEventListener('mousemove', Konva.DD._drag);\n    html.addEventListener('touchmove', Konva.DD._drag);\n\n    html.addEventListener('mouseup', Konva.DD._endDragAfter, false);\n    html.addEventListener('touchend', Konva.DD._endDragAfter, false);\n  }\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Rect constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} [config.cornerRadius]\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var rect = new Konva.Rect({\n     *   width: 100,\n     *   height: 50,\n     *   fill: 'red',\n     *   stroke: 'black',\n     *   strokeWidth: 5\n     * });\n     */\n  Konva.Rect = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Rect.prototype = {\n    ___init: function(config) {\n      Konva.Shape.call(this, config);\n      this.className = 'Rect';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var cornerRadius = this.getCornerRadius(),\n        width = this.getWidth(),\n        height = this.getHeight();\n\n      context.beginPath();\n\n      if (!cornerRadius) {\n        // simple rect - don't bother doing all that complicated maths stuff.\n        context.rect(0, 0, width, height);\n      } else {\n        // arcTo would be nicer, but browser support is patchy (Opera)\n        cornerRadius = Math.min(cornerRadius, width / 2, height / 2);\n        context.moveTo(cornerRadius, 0);\n        context.lineTo(width - cornerRadius, 0);\n        context.arc(\n          width - cornerRadius,\n          cornerRadius,\n          cornerRadius,\n          Math.PI * 3 / 2,\n          0,\n          false\n        );\n        context.lineTo(width, height - cornerRadius);\n        context.arc(\n          width - cornerRadius,\n          height - cornerRadius,\n          cornerRadius,\n          0,\n          Math.PI / 2,\n          false\n        );\n        context.lineTo(cornerRadius, height);\n        context.arc(\n          cornerRadius,\n          height - cornerRadius,\n          cornerRadius,\n          Math.PI / 2,\n          Math.PI,\n          false\n        );\n        context.lineTo(0, cornerRadius);\n        context.arc(\n          cornerRadius,\n          cornerRadius,\n          cornerRadius,\n          Math.PI,\n          Math.PI * 3 / 2,\n          false\n        );\n      }\n      context.closePath();\n      context.fillStrokeShape(this);\n    }\n  };\n\n  Konva.Util.extend(Konva.Rect, Konva.Shape);\n\n  Konva.Factory.addGetterSetter(Konva.Rect, 'cornerRadius', 0);\n  /**\n     * get/set corner radius\n     * @name cornerRadius\n     * @method\n     * @memberof Konva.Rect.prototype\n     * @param {Number} cornerRadius\n     * @returns {Number}\n     * @example\n     * // get corner radius\n     * var cornerRadius = rect.cornerRadius();\n     *\n     * // set corner radius\n     * rect.cornerRadius(10);\n     */\n\n  Konva.Collection.mapMethods(Konva.Rect);\n})();\n\n(function(Konva) {\n  'use strict';\n  // the 0.0001 offset fixes a bug in Chrome 27\n  var PIx2 = Math.PI * 2 - 0.0001, CIRCLE = 'Circle';\n\n  /**\n     * Circle constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} config.radius\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * // create circle\n     * var circle = new Konva.Circle({\n     *   radius: 40,\n     *   fill: 'red',\n     *   stroke: 'black'\n     *   strokeWidth: 5\n     * });\n     */\n  Konva.Circle = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Circle.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = CIRCLE;\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      context.beginPath();\n      context.arc(0, 0, this.getRadius(), 0, PIx2, false);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.radius() !== width / 2) {\n        this.setRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.radius() !== height / 2) {\n        this.setRadius(height / 2);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.Circle, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Circle, 'radius', 0);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Circle, 'radius');\n\n  /**\n     * get/set radius\n     * @name radius\n     * @method\n     * @memberof Konva.Circle.prototype\n     * @param {Number} radius\n     * @returns {Number}\n     * @example\n     * // get radius\n     * var radius = circle.radius();\n     *\n     * // set radius\n     * circle.radius(10);\n     */\n\n  Konva.Collection.mapMethods(Konva.Circle);\n})(Konva);\n\n(function() {\n  'use strict';\n  // the 0.0001 offset fixes a bug in Chrome 27\n  var PIx2 = Math.PI * 2 - 0.0001, ELLIPSE = 'Ellipse';\n\n  /**\n     * Ellipse constructor\n     * @constructor\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Object} config.radius defines x and y radius\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var ellipse = new Konva.Ellipse({\n     *   radius : {\n     *     x : 50,\n     *     y : 50\n     *   },\n     *   fill: 'red'\n     * });\n     */\n  Konva.Ellipse = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Ellipse.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = ELLIPSE;\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var rx = this.getRadiusX(), ry = this.getRadiusY();\n\n      context.beginPath();\n      context.save();\n      if (rx !== ry) {\n        context.scale(1, ry / rx);\n      }\n      context.arc(0, 0, rx, 0, PIx2, false);\n      context.restore();\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getRadiusX() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getRadiusY() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      this.setRadius({\n        x: width / 2\n      });\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      this.setRadius({\n        y: height / 2\n      });\n    }\n  };\n  Konva.Util.extend(Konva.Ellipse, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addComponentsGetterSetter(Konva.Ellipse, 'radius', ['x', 'y']);\n\n  /**\n     * get/set radius\n     * @name radius\n     * @method\n     * @memberof Konva.Ellipse.prototype\n     * @param {Object} radius\n     * @param {Number} radius.x\n     * @param {Number} radius.y\n     * @returns {Object}\n     * @example\n     * // get radius\n     * var radius = ellipse.radius();\n     *\n     * // set radius\n     * ellipse.radius({\n     *   x: 200,\n     *   y: 100\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Ellipse, 'radiusX', 0);\n  /**\n     * get/set radius x\n     * @name radiusX\n     * @method\n     * @memberof Konva.Ellipse.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get radius x\n     * var radiusX = ellipse.radiusX();\n     *\n     * // set radius x\n     * ellipse.radiusX(200);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Ellipse, 'radiusY', 0);\n  /**\n     * get/set radius y\n     * @name radiusY\n     * @method\n     * @memberof Konva.Ellipse.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get radius y\n     * var radiusY = ellipse.radiusY();\n     *\n     * // set radius y\n     * ellipse.radiusY(200);\n     */\n\n  Konva.Collection.mapMethods(Konva.Ellipse);\n})();\n\n(function() {\n  'use strict';\n  // the 0.0001 offset fixes a bug in Chrome 27\n  var PIx2 = Math.PI * 2 - 0.0001;\n  /**\n     * Ring constructor\n     * @constructor\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} config.innerRadius\n     * @param {Number} config.outerRadius\n     * @param {Boolean} [config.clockwise]\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var ring = new Konva.Ring({\n     *   innerRadius: 40,\n     *   outerRadius: 80,\n     *   fill: 'red',\n     *   stroke: 'black',\n     *   strokeWidth: 5\n     * });\n     */\n  Konva.Ring = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Ring.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Ring';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      context.beginPath();\n      context.arc(0, 0, this.getInnerRadius(), 0, PIx2, false);\n      context.moveTo(this.getOuterRadius(), 0);\n      context.arc(0, 0, this.getOuterRadius(), PIx2, 0, true);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.outerRadius() !== width / 2) {\n        this.setOuterRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.outerRadius() !== height / 2) {\n        this.setOuterRadius(height / 2);\n      }\n    },\n    setOuterRadius: function(val) {\n      this._setAttr('outerRadius', val);\n      this.setWidth(val * 2);\n      this.setHeight(val * 2);\n    }\n  };\n  Konva.Util.extend(Konva.Ring, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Ring, 'innerRadius', 0);\n\n  /**\n     * get/set innerRadius\n     * @name innerRadius\n     * @method\n     * @memberof Konva.Ring.prototype\n     * @param {Number} innerRadius\n     * @returns {Number}\n     * @example\n     * // get inner radius\n     * var innerRadius = ring.innerRadius();\n     *\n     * // set inner radius\n     * ring.innerRadius(20);\n     */\n  Konva.Factory.addGetter(Konva.Ring, 'outerRadius', 0);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Ring, 'outerRadius');\n\n  /**\n     * get/set outerRadius\n     * @name outerRadius\n     * @method\n     * @memberof Konva.Ring.prototype\n     * @param {Number} outerRadius\n     * @returns {Number}\n     * @example\n     * // get outer radius\n     * var outerRadius = ring.outerRadius();\n     *\n     * // set outer radius\n     * ring.outerRadius(20);\n     */\n\n  Konva.Collection.mapMethods(Konva.Ring);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Wedge constructor\n     * @constructor\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} config.angle in degrees\n     * @param {Number} config.radius\n     * @param {Boolean} [config.clockwise]\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * // draw a wedge that's pointing downwards\n     * var wedge = new Konva.Wedge({\n     *   radius: 40,\n     *   fill: 'red',\n     *   stroke: 'black'\n     *   strokeWidth: 5,\n     *   angleDeg: 60,\n     *   rotationDeg: -120\n     * });\n     */\n  Konva.Wedge = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Wedge.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Wedge';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      context.beginPath();\n      context.arc(\n        0,\n        0,\n        this.getRadius(),\n        0,\n        Konva.getAngle(this.getAngle()),\n        this.getClockwise()\n      );\n      context.lineTo(0, 0);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.radius() !== width / 2) {\n        this.setRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.radius() !== height / 2) {\n        this.setRadius(height / 2);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.Wedge, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Wedge, 'radius', 0);\n\n  /**\n     * get/set radius\n     * @name radius\n     * @method\n     * @memberof Konva.Wedge.prototype\n     * @param {Number} radius\n     * @returns {Number}\n     * @example\n     * // get radius\n     * var radius = wedge.radius();\n     *\n     * // set radius\n     * wedge.radius(10);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Wedge, 'angle', 0);\n\n  /**\n     * get/set angle in degrees\n     * @name angle\n     * @method\n     * @memberof Konva.Wedge.prototype\n     * @param {Number} angle\n     * @returns {Number}\n     * @example\n     * // get angle\n     * var angle = wedge.angle();\n     *\n     * // set angle\n     * wedge.angle(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Wedge, 'clockwise', false);\n\n  /**\n     * get/set clockwise flag\n     * @name clockwise\n     * @method\n     * @memberof Konva.Wedge.prototype\n     * @param {Number} clockwise\n     * @returns {Number}\n     * @example\n     * // get clockwise flag\n     * var clockwise = wedge.clockwise();\n     *\n     * // draw wedge counter-clockwise\n     * wedge.clockwise(false);\n     *\n     * // draw wedge clockwise\n     * wedge.clockwise(true);\n     */\n\n  Konva.Factory.backCompat(Konva.Wedge, {\n    angleDeg: 'angle',\n    getAngleDeg: 'getAngle',\n    setAngleDeg: 'setAngle'\n  });\n\n  Konva.Collection.mapMethods(Konva.Wedge);\n})();\n\n(function(Konva) {\n  'use strict';\n  /**\n     * Arc constructor\n     * @constructor\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} config.angle in degrees\n     * @param {Number} config.innerRadius\n     * @param {Number} config.outerRadius\n     * @param {Boolean} [config.clockwise]\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * // draw a Arc that's pointing downwards\n     * var arc = new Konva.Arc({\n     *   innerRadius: 40,\n     *   outerRadius: 80,\n     *   fill: 'red',\n     *   stroke: 'black'\n     *   strokeWidth: 5,\n     *   angle: 60,\n     *   rotationDeg: -120\n     * });\n     */\n  Konva.Arc = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Arc.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Arc';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var angle = Konva.getAngle(this.angle()), clockwise = this.clockwise();\n\n      context.beginPath();\n      context.arc(0, 0, this.getOuterRadius(), 0, angle, clockwise);\n      context.arc(0, 0, this.getInnerRadius(), angle, 0, !clockwise);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.getOuterRadius() !== width / 2) {\n        this.setOuterRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.getOuterRadius() !== height / 2) {\n        this.setOuterRadius(height / 2);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.Arc, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Arc, 'innerRadius', 0);\n\n  /**\n     * get/set innerRadius\n     * @name innerRadius\n     * @method\n     * @memberof Konva.Arc.prototype\n     * @param {Number} innerRadius\n     * @returns {Number}\n     * @example\n     * // get inner radius\n     * var innerRadius = arc.innerRadius();\n     *\n     * // set inner radius\n     * arc.innerRadius(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arc, 'outerRadius', 0);\n\n  /**\n     * get/set outerRadius\n     * @name outerRadius\n     * @method\n     * @memberof Konva.Arc.prototype\n     * @param {Number} outerRadius\n     * @returns {Number}\n     * @example\n     * // get outer radius\n     * var outerRadius = arc.outerRadius();\n     *\n     * // set outer radius\n     * arc.outerRadius(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arc, 'angle', 0);\n\n  /**\n     * get/set angle in degrees\n     * @name angle\n     * @method\n     * @memberof Konva.Arc.prototype\n     * @param {Number} angle\n     * @returns {Number}\n     * @example\n     * // get angle\n     * var angle = arc.angle();\n     *\n     * // set angle\n     * arc.angle(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arc, 'clockwise', false);\n\n  /**\n     * get/set clockwise flag\n     * @name clockwise\n     * @method\n     * @memberof Konva.Arc.prototype\n     * @param {Boolean} clockwise\n     * @returns {Boolean}\n     * @example\n     * // get clockwise flag\n     * var clockwise = arc.clockwise();\n     *\n     * // draw arc counter-clockwise\n     * arc.clockwise(false);\n     *\n     * // draw arc clockwise\n     * arc.clockwise(true);\n     */\n\n  Konva.Collection.mapMethods(Konva.Arc);\n})(Konva);\n\n(function() {\n  'use strict';\n  // CONSTANTS\n  var IMAGE = 'Image';\n\n  /**\n     * Image constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Image} config.image\n     * @param {Object} [config.crop]\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var imageObj = new Image();\n     * imageObj.onload = function() {\n     *   var image = new Konva.Image({\n     *     x: 200,\n     *     y: 50,\n     *     image: imageObj,\n     *     width: 100,\n     *     height: 100\n     *   });\n     * };\n     * imageObj.src = '/path/to/image.jpg'\n     */\n  Konva.Image = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Image.prototype = {\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = IMAGE;\n      this.sceneFunc(this._sceneFunc);\n      this.hitFunc(this._hitFunc);\n    },\n    _useBufferCanvas: function() {\n      return (\n        (this.hasShadow() || this.getAbsoluteOpacity() !== 1) &&\n        this.hasStroke() &&\n        this.getStage()\n      );\n    },\n    _sceneFunc: function(context) {\n      var width = this.getWidth(),\n        height = this.getHeight(),\n        image = this.getImage(),\n        cropWidth,\n        cropHeight,\n        params;\n\n      if (image) {\n        cropWidth = this.getCropWidth();\n        cropHeight = this.getCropHeight();\n        if (cropWidth && cropHeight) {\n          params = [\n            image,\n            this.getCropX(),\n            this.getCropY(),\n            cropWidth,\n            cropHeight,\n            0,\n            0,\n            width,\n            height\n          ];\n        } else {\n          params = [image, 0, 0, width, height];\n        }\n      }\n\n      if (this.hasFill() || this.hasStroke()) {\n        context.beginPath();\n        context.rect(0, 0, width, height);\n        context.closePath();\n        context.fillStrokeShape(this);\n      }\n\n      if (image) {\n        context.drawImage.apply(context, params);\n      }\n    },\n    _hitFunc: function(context) {\n      var width = this.getWidth(), height = this.getHeight();\n\n      context.beginPath();\n      context.rect(0, 0, width, height);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    getWidth: function() {\n      var image = this.getImage();\n      return this.attrs.width || (image ? image.width : 0);\n    },\n    getHeight: function() {\n      var image = this.getImage();\n      return this.attrs.height || (image ? image.height : 0);\n    }\n  };\n  Konva.Util.extend(Konva.Image, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Image, 'image');\n\n  /**\n     * set image\n     * @name setImage\n     * @method\n     * @memberof Konva.Image.prototype\n     * @param {Image} image\n     */\n\n  /**\n     * get image\n     * @name getImage\n     * @method\n     * @memberof Konva.Image.prototype\n     * @returns {Image}\n     */\n\n  Konva.Factory.addComponentsGetterSetter(Konva.Image, 'crop', [\n    'x',\n    'y',\n    'width',\n    'height'\n  ]);\n  /**\n     * get/set crop\n     * @method\n     * @name crop\n     * @memberof Konva.Image.prototype\n     * @param {Object} crop\n     * @param {Number} crop.x\n     * @param {Number} crop.y\n     * @param {Number} crop.width\n     * @param {Number} crop.height\n     * @returns {Object}\n     * @example\n     * // get crop\n     * var crop = image.crop();\n     *\n     * // set crop\n     * image.crop({\n     *   x: 20,\n     *   y: 20,\n     *   width: 20,\n     *   height: 20\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Image, 'cropX', 0);\n  /**\n     * get/set crop x\n     * @method\n     * @name cropX\n     * @memberof Konva.Image.prototype\n     * @param {Number} x\n     * @returns {Number}\n     * @example\n     * // get crop x\n     * var cropX = image.cropX();\n     *\n     * // set crop x\n     * image.cropX(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Image, 'cropY', 0);\n  /**\n     * get/set crop y\n     * @name cropY\n     * @method\n     * @memberof Konva.Image.prototype\n     * @param {Number} y\n     * @returns {Number}\n     * @example\n     * // get crop y\n     * var cropY = image.cropY();\n     *\n     * // set crop y\n     * image.cropY(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Image, 'cropWidth', 0);\n  /**\n     * get/set crop width\n     * @name cropWidth\n     * @method\n     * @memberof Konva.Image.prototype\n     * @param {Number} width\n     * @returns {Number}\n     * @example\n     * // get crop width\n     * var cropWidth = image.cropWidth();\n     *\n     * // set crop width\n     * image.cropWidth(20);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Image, 'cropHeight', 0);\n  /**\n     * get/set crop height\n     * @name cropHeight\n     * @method\n     * @memberof Konva.Image.prototype\n     * @param {Number} height\n     * @returns {Number}\n     * @example\n     * // get crop height\n     * var cropHeight = image.cropHeight();\n     *\n     * // set crop height\n     * image.cropHeight(20);\n     */\n\n  Konva.Collection.mapMethods(Konva.Image);\n\n  /**\n     * load image from given url and create `Konva.Image` instance\n     * @method\n     * @memberof Konva.Image\n     * @param {String} url image source\n     * @param {Function} callback with Konva.Image instance as first argument\n     * @example\n     *  Konva.Image.fromURL(imageURL, function(image){\n     *    // image is Konva.Image instance\n     *    layer.add(image);\n     *    layer.draw();\n     *  });\n     */\n  Konva.Image.fromURL = function(url, callback) {\n    var img = new Image();\n    img.onload = function() {\n      var image = new Konva.Image({\n        image: img\n      });\n      callback(image);\n    };\n    img.src = url;\n  };\n})();\n\n/*eslint-disable max-depth */\n(function() {\n  'use strict';\n  // var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n  // constants\n  var AUTO = 'auto',\n    //CANVAS = 'canvas',\n    CENTER = 'center',\n    JUSTIFY = 'justify',\n    CHANGE_KONVA = 'Change.konva',\n    CONTEXT_2D = '2d',\n    DASH = '-',\n    EMPTY_STRING = '',\n    LEFT = 'left',\n    TEXT = 'text',\n    TEXT_UPPER = 'Text',\n    MIDDLE = 'middle',\n    NORMAL = 'normal',\n    PX_SPACE = 'px ',\n    SPACE = ' ',\n    RIGHT = 'right',\n    WORD = 'word',\n    CHAR = 'char',\n    NONE = 'none',\n    ATTR_CHANGE_LIST = [\n      'fontFamily',\n      'fontSize',\n      'fontStyle',\n      'fontVariant',\n      'padding',\n      'align',\n      'lineHeight',\n      'text',\n      'width',\n      'height',\n      'wrap',\n      'letterSpacing'\n    ],\n    // cached variables\n    attrChangeListLen = ATTR_CHANGE_LIST.length;\n  var dummyContext;\n  function getDummyContext() {\n    if (dummyContext) {\n      return dummyContext;\n    }\n    dummyContext = Konva.Util.createCanvasElement().getContext(CONTEXT_2D);\n    return dummyContext;\n  }\n\n  /**\n     * Text constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {String} [config.fontFamily] default is Arial\n     * @param {Number} [config.fontSize] in pixels.  Default is 12\n     * @param {String} [config.fontStyle] can be normal, bold, or italic.  Default is normal\n     * @param {String} [config.fontVariant] can be normal or small-caps.  Default is normal\n     * @param {String} config.text\n     * @param {String} [config.align] can be left, center, or right\n     * @param {Number} [config.padding]\n     * @param {Number} [config.lineHeight] default is 1\n     * @param {String} [config.wrap] can be word, char, or none. Default is word\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var text = new Konva.Text({\n     *   x: 10,\n     *   y: 15,\n     *   text: 'Simple Text',\n     *   fontSize: 30,\n     *   fontFamily: 'Calibri',\n     *   fill: 'green'\n     * });\n     */\n  Konva.Text = function(config) {\n    this.___init(config);\n  };\n  function _fillFunc(context) {\n    context.fillText(this.partialText, 0, 0);\n  }\n  function _strokeFunc(context) {\n    context.strokeText(this.partialText, 0, 0);\n  }\n\n  Konva.Text.prototype = {\n    ___init: function(config) {\n      config = config || {};\n\n      // set default color to black\n      if (\n        !config.fillLinearGradientColorStops &&\n        !config.fillRadialGradientColorStops\n      ) {\n        config.fill = config.fill || 'black';\n      }\n      //\n      // if (config.width === undefined) {\n      //     config.width = AUTO;\n      // }\n      // if (config.height === undefined) {\n      //     config.height = AUTO;\n      // }\n\n      // call super constructor\n      Konva.Shape.call(this, config);\n\n      this._fillFunc = _fillFunc;\n      this._strokeFunc = _strokeFunc;\n      this.className = TEXT_UPPER;\n\n      // update text data for certain attr changes\n      for (var n = 0; n < attrChangeListLen; n++) {\n        this.on(ATTR_CHANGE_LIST[n] + CHANGE_KONVA, this._setTextData);\n      }\n\n      this._setTextData();\n      this.sceneFunc(this._sceneFunc);\n      this.hitFunc(this._hitFunc);\n    },\n    _sceneFunc: function(context) {\n      var p = this.getPadding(),\n        textHeight = this.getTextHeight(),\n        lineHeightPx = this.getLineHeight() * textHeight,\n        textArr = this.textArr,\n        textArrLen = textArr.length,\n        align = this.getAlign(),\n        totalWidth = this.getWidth(),\n        letterSpacing = this.getLetterSpacing(),\n        textDecoration = this.textDecoration(),\n        fill = this.fill(),\n        fontSize = this.fontSize(),\n        n;\n\n      context.setAttr('font', this._getContextFont());\n\n      context.setAttr('textBaseline', MIDDLE);\n      context.setAttr('textAlign', LEFT);\n      context.save();\n      if (p) {\n        context.translate(p, 0);\n        context.translate(0, p + textHeight / 2);\n      } else {\n        context.translate(0, textHeight / 2);\n      }\n\n      // draw text lines\n      for (n = 0; n < textArrLen; n++) {\n        var obj = textArr[n],\n          text = obj.text,\n          width = obj.width;\n\n        // horizontal alignment\n        context.save();\n        if (align === RIGHT) {\n          context.translate(totalWidth - width - p * 2, 0);\n        } else if (align === CENTER) {\n          context.translate((totalWidth - width - p * 2) / 2, 0);\n        }\n\n        if (textDecoration.indexOf('underline') !== -1) {\n          context.save();\n          context.beginPath();\n          context.moveTo(0, Math.round(lineHeightPx / 2));\n          context.lineTo(Math.round(width), Math.round(lineHeightPx / 2));\n          // TODO: I have no idea what is real ratio\n          // just /20 looks good enough\n          context.lineWidth = fontSize / 15;\n          context.strokeStyle = fill;\n          context.stroke();\n          context.restore();\n        }\n        if (textDecoration.indexOf('line-through') !== -1) {\n          context.save();\n          context.beginPath();\n          context.moveTo(0, 0);\n          context.lineTo(Math.round(width), 0);\n          context.lineWidth = fontSize / 15;\n          context.strokeStyle = fill;\n          context.stroke();\n          context.restore();\n        }\n        if (letterSpacing !== 0 || align === JUSTIFY) {\n          //   var words = text.split(' ');\n          var spacesNumber = text.split(' ').length - 1;\n          for (var li = 0; li < text.length; li++) {\n            var letter = text[li];\n            // skip justify for the last line\n            if (letter === ' ' && n !== textArrLen - 1 && align === JUSTIFY) {\n              context.translate(\n                Math.floor((totalWidth - width) / spacesNumber),\n                0\n              );\n            }\n            this.partialText = letter;\n            context.fillStrokeShape(this);\n            context.translate(\n              Math.round(this._getTextSize(letter).width) + letterSpacing,\n              0\n            );\n          }\n        } else {\n          this.partialText = text;\n\n          context.fillStrokeShape(this);\n        }\n        context.restore();\n        context.translate(0, lineHeightPx);\n      }\n      context.restore();\n    },\n    _hitFunc: function(context) {\n      var width = this.getWidth(),\n        height = this.getHeight();\n\n      context.beginPath();\n      context.rect(0, 0, width, height);\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    // _useBufferCanvas: function(caching) {\n    //     var useIt = Konva.Shape.prototype._useBufferCanvas.call(this, caching);\n    //     if (useIt) {\n    //       return true;\n    //     }\n    //     return false;\n    //     // return isFirefox && this.hasFill() && this.hasShadow();\n    // },\n    setText: function(text) {\n      var str = Konva.Util._isString(text) ? text : (text || '').toString();\n      this._setAttr(TEXT, str);\n      return this;\n    },\n    /**\n         * get width of text area, which includes padding\n         * @method\n         * @memberof Konva.Text.prototype\n         * @returns {Number}\n         */\n    getWidth: function() {\n      var isAuto = this.attrs.width === AUTO || this.attrs.width === undefined;\n      return isAuto\n        ? this.getTextWidth() + this.getPadding() * 2\n        : this.attrs.width;\n    },\n    /**\n         * get the height of the text area, which takes into account multi-line text, line heights, and padding\n         * @method\n         * @memberof Konva.Text.prototype\n         * @returns {Number}\n         */\n    getHeight: function() {\n      var isAuto =\n        this.attrs.height === AUTO || this.attrs.height === undefined;\n      return isAuto\n        ? this.getTextHeight() * this.textArr.length * this.getLineHeight() +\n          this.getPadding() * 2\n        : this.attrs.height;\n    },\n    /**\n         * get text width\n         * @method\n         * @memberof Konva.Text.prototype\n         * @returns {Number}\n         */\n    getTextWidth: function() {\n      return this.textWidth;\n    },\n    /**\n         * get text height\n         * @method\n         * @memberof Konva.Text.prototype\n         * @returns {Number}\n         */\n    getTextHeight: function() {\n      return this.textHeight;\n    },\n    _getTextSize: function(text) {\n      var _context = getDummyContext(),\n        fontSize = this.getFontSize(),\n        metrics;\n\n      _context.save();\n      _context.font = this._getContextFont();\n\n      metrics = _context.measureText(text);\n      _context.restore();\n      return {\n        width: metrics.width,\n        height: parseInt(fontSize, 10)\n      };\n    },\n    _getContextFont: function() {\n      // IE don't want to work with usual font style\n      // bold was not working\n      // removing font variant will solve\n      // fix for: https://github.com/konvajs/konva/issues/94\n      if (Konva.UA.isIE) {\n        return (\n          this.getFontStyle() +\n          SPACE +\n          this.getFontSize() +\n          PX_SPACE +\n          this.getFontFamily()\n        );\n      }\n      return (\n        this.getFontStyle() +\n        SPACE +\n        this.getFontVariant() +\n        SPACE +\n        this.getFontSize() +\n        PX_SPACE +\n        this.getFontFamily()\n      );\n    },\n    _addTextLine: function(line) {\n      if (this.align() === JUSTIFY) {\n        line = line.trim();\n      }\n      var width = this._getTextWidth(line);\n      return this.textArr.push({ text: line, width: width });\n    },\n    _getTextWidth: function(text) {\n      var latterSpacing = this.getLetterSpacing();\n      var length = text.length;\n      return (\n        getDummyContext().measureText(text).width +\n        (length ? latterSpacing * (length - 1) : 0)\n      );\n    },\n    _setTextData: function() {\n      var lines = this.getText().split('\\n'),\n        fontSize = +this.getFontSize(),\n        textWidth = 0,\n        lineHeightPx = this.getLineHeight() * fontSize,\n        width = this.attrs.width,\n        height = this.attrs.height,\n        fixedWidth = width !== AUTO,\n        fixedHeight = height !== AUTO,\n        padding = this.getPadding(),\n        maxWidth = width - padding * 2,\n        maxHeightPx = height - padding * 2,\n        currentHeightPx = 0,\n        wrap = this.getWrap(),\n        shouldWrap = wrap !== NONE,\n        wrapAtWord = wrap !== CHAR && shouldWrap;\n\n      this.textArr = [];\n      getDummyContext().save();\n      getDummyContext().font = this._getContextFont();\n      for (var i = 0, max = lines.length; i < max; ++i) {\n        var line = lines[i];\n\n        var lineWidth = this._getTextWidth(line);\n        if (fixedWidth && lineWidth > maxWidth) {\n          /*\n                     * if width is fixed and line does not fit entirely\n                     * break the line into multiple fitting lines\n                     */\n          while (line.length > 0) {\n            /*\n                         * use binary search to find the longest substring that\n                         * that would fit in the specified width\n                         */\n            var low = 0,\n              high = line.length,\n              match = '',\n              matchWidth = 0;\n            while (low < high) {\n              var mid = (low + high) >>> 1,\n                substr = line.slice(0, mid + 1),\n                substrWidth = this._getTextWidth(substr);\n              if (substrWidth <= maxWidth) {\n                low = mid + 1;\n                match = substr;\n                matchWidth = substrWidth;\n              } else {\n                high = mid;\n              }\n            }\n            /*\n                         * 'low' is now the index of the substring end\n                         * 'match' is the substring\n                         * 'matchWidth' is the substring width in px\n                         */\n            if (match) {\n              // a fitting substring was found\n              if (wrapAtWord) {\n                // try to find a space or dash where wrapping could be done\n                var wrapIndex =\n                  Math.max(match.lastIndexOf(SPACE), match.lastIndexOf(DASH)) +\n                  1;\n                if (wrapIndex > 0) {\n                  // re-cut the substring found at the space/dash position\n                  low = wrapIndex;\n                  match = match.slice(0, low);\n                  matchWidth = this._getTextWidth(match);\n                }\n              }\n              this._addTextLine(match);\n              textWidth = Math.max(textWidth, matchWidth);\n              currentHeightPx += lineHeightPx;\n              if (\n                !shouldWrap ||\n                (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx)\n              ) {\n                /*\n                                 * stop wrapping if wrapping is disabled or if adding\n                                 * one more line would overflow the fixed height\n                                 */\n                break;\n              }\n              line = line.slice(low);\n              if (line.length > 0) {\n                // Check if the remaining text would fit on one line\n                lineWidth = this._getTextWidth(line);\n                if (lineWidth <= maxWidth) {\n                  // if it does, add the line and break out of the loop\n                  this._addTextLine(line);\n                  currentHeightPx += lineHeightPx;\n                  textWidth = Math.max(textWidth, lineWidth);\n                  break;\n                }\n              }\n            } else {\n              // not even one character could fit in the element, abort\n              break;\n            }\n          }\n        } else {\n          // element width is automatically adjusted to max line width\n          this._addTextLine(line);\n          currentHeightPx += lineHeightPx;\n          textWidth = Math.max(textWidth, lineWidth);\n        }\n        // if element height is fixed, abort if adding one more line would overflow\n        if (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx) {\n          break;\n        }\n      }\n      getDummyContext().restore();\n      this.textHeight = fontSize;\n      // var maxTextWidth = 0;\n      // for(var j = 0; j < this.textArr.length; j++) {\n      //     maxTextWidth = Math.max(maxTextWidth, this.textArr[j].width);\n      // }\n      this.textWidth = textWidth;\n    }\n  };\n  Konva.Util.extend(Konva.Text, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Text, 'fontFamily', 'Arial');\n\n  /**\n     * get/set font family\n     * @name fontFamily\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} fontFamily\n     * @returns {String}\n     * @example\n     * // get font family\n     * var fontFamily = text.fontFamily();\n     *\n     * // set font family\n     * text.fontFamily('Arial');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'fontSize', 12);\n\n  /**\n     * get/set font size in pixels\n     * @name fontSize\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {Number} fontSize\n     * @returns {Number}\n     * @example\n     * // get font size\n     * var fontSize = text.fontSize();\n     *\n     * // set font size to 22px\n     * text.fontSize(22);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'fontStyle', NORMAL);\n\n  /**\n     * set font style.  Can be 'normal', 'italic', or 'bold'.  'normal' is the default.\n     * @name fontStyle\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} fontStyle\n     * @returns {String}\n     * @example\n     * // get font style\n     * var fontStyle = text.fontStyle();\n     *\n     * // set font style\n     * text.fontStyle('bold');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'fontVariant', NORMAL);\n\n  /**\n     * set font variant.  Can be 'normal' or 'small-caps'.  'normal' is the default.\n     * @name fontVariant\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} fontVariant\n     * @returns {String}\n     * @example\n     * // get font variant\n     * var fontVariant = text.fontVariant();\n     *\n     * // set font variant\n     * text.fontVariant('small-caps');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'padding', 0);\n\n  /**\n     * set padding\n     * @name padding\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {Number} padding\n     * @returns {Number}\n     * @example\n     * // get padding\n     * var padding = text.padding();\n     *\n     * // set padding to 10 pixels\n     * text.padding(10);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'align', LEFT);\n\n  /**\n     * get/set horizontal align of text.  Can be 'left', 'center', 'right' or 'justify'\n     * @name align\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} align\n     * @returns {String}\n     * @example\n     * // get text align\n     * var align = text.align();\n     *\n     * // center text\n     * text.align('center');\n     *\n     * // align text to right\n     * text.align('right');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'lineHeight', 1);\n\n  /**\n     * get/set line height.  The default is 1.\n     * @name lineHeight\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {Number} lineHeight\n     * @returns {Number}\n     * @example\n     * // get line height\n     * var lineHeight = text.lineHeight();\n     *\n     * // set the line height\n     * text.lineHeight(2);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'wrap', WORD);\n\n  /**\n     * get/set wrap.  Can be word, char, or none. Default is word.\n     * @name wrap\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} wrap\n     * @returns {String}\n     * @example\n     * // get wrap\n     * var wrap = text.wrap();\n     *\n     * // set wrap\n     * text.wrap('word');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'letterSpacing', 0);\n\n  /**\n       * set letter spacing property. Default value is 0.\n       * @name letterSpacing\n       * @method\n       * @memberof Konva.TextPath.prototype\n       * @param {Number} letterSpacing\n       */\n\n  Konva.Factory.addGetter(Konva.Text, 'text', EMPTY_STRING);\n  Konva.Factory.addOverloadedGetterSetter(Konva.Text, 'text');\n\n  /**\n     * get/set text\n     * @name getText\n     * @method\n     * @memberof Konva.Text.prototype\n     * @param {String} text\n     * @returns {String}\n     * @example\n     * // get text\n     * var text = text.text();\n     *\n     * // set text\n     * text.text('Hello world!');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Text, 'textDecoration', EMPTY_STRING);\n\n  /**\n      * get/set text decoration of a text.  Possible values are 'underline', 'line-through' or combination of these values separated by space\n      * @name textDecoration\n      * @method\n      * @memberof Konva.Text.prototype\n      * @param {String} textDecoration\n      * @returns {String}\n      * @example\n      * // get text decoration\n      * var textDecoration = text.textDecoration();\n      *\n      * // underline text\n      * text.textDecoration('underline');\n      *\n      * // strike text\n      * text.textDecoration('line-through');\n      *\n      * // underline and strike text\n      * text.textDecoration('underline line-through');\n      */\n\n  Konva.Collection.mapMethods(Konva.Text);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Line constructor.&nbsp; Lines are defined by an array of points and\n     *  a tension\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Array} config.points\n     * @param {Number} [config.tension] Higher values will result in a more curvy line.  A value of 0 will result in no interpolation.\n     *   The default is 0\n     * @param {Boolean} [config.closed] defines whether or not the line shape is closed, creating a polygon or blob\n     * @param {Boolean} [config.bezier] if no tension is provided but bezier=true, we draw the line as a bezier using the passed points\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var line = new Konva.Line({\n     *   x: 100,\n     *   y: 50,\n     *   points: [73, 70, 340, 23, 450, 60, 500, 20],\n     *   stroke: 'red',\n     *   tension: 1\n     * });\n     */\n  Konva.Line = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Line.prototype = {\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Line';\n\n      this.on(\n        'pointsChange.konva tensionChange.konva closedChange.konva bezierChange.konva',\n        function() {\n          this._clearCache('tensionPoints');\n        }\n      );\n\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var points = this.getPoints(),\n        length = points.length,\n        tension = this.getTension(),\n        closed = this.getClosed(),\n        bezier = this.getBezier(),\n        tp,\n        len,\n        n;\n\n      if (!length) {\n        return;\n      }\n\n      context.beginPath();\n      context.moveTo(points[0], points[1]);\n\n      // tension\n      if (tension !== 0 && length > 4) {\n        tp = this.getTensionPoints();\n        len = tp.length;\n        n = closed ? 0 : 4;\n\n        if (!closed) {\n          context.quadraticCurveTo(tp[0], tp[1], tp[2], tp[3]);\n        }\n\n        while (n < len - 2) {\n          context.bezierCurveTo(\n            tp[n++],\n            tp[n++],\n            tp[n++],\n            tp[n++],\n            tp[n++],\n            tp[n++]\n          );\n        }\n\n        if (!closed) {\n          context.quadraticCurveTo(\n            tp[len - 2],\n            tp[len - 1],\n            points[length - 2],\n            points[length - 1]\n          );\n        }\n      } else if (bezier) {\n        // no tension but bezier\n        n = 2;\n\n        while (n < length) {\n          context.bezierCurveTo(\n            points[n++],\n            points[n++],\n            points[n++],\n            points[n++],\n            points[n++],\n            points[n++]\n          );\n        }\n      } else {\n        // no tension\n        for (n = 2; n < length; n += 2) {\n          context.lineTo(points[n], points[n + 1]);\n        }\n      }\n\n      // closed e.g. polygons and blobs\n      if (closed) {\n        context.closePath();\n        context.fillStrokeShape(this);\n      } else {\n        // open e.g. lines and splines\n        context.strokeShape(this);\n      }\n    },\n    getTensionPoints: function() {\n      return this._getCache('tensionPoints', this._getTensionPoints);\n    },\n    _getTensionPoints: function() {\n      if (this.getClosed()) {\n        return this._getTensionPointsClosed();\n      } else {\n        return Konva.Util._expandPoints(this.getPoints(), this.getTension());\n      }\n    },\n    _getTensionPointsClosed: function() {\n      var p = this.getPoints(),\n        len = p.length,\n        tension = this.getTension(),\n        util = Konva.Util,\n        firstControlPoints = util._getControlPoints(\n          p[len - 2],\n          p[len - 1],\n          p[0],\n          p[1],\n          p[2],\n          p[3],\n          tension\n        ),\n        lastControlPoints = util._getControlPoints(\n          p[len - 4],\n          p[len - 3],\n          p[len - 2],\n          p[len - 1],\n          p[0],\n          p[1],\n          tension\n        ),\n        middle = Konva.Util._expandPoints(p, tension),\n        tp = [firstControlPoints[2], firstControlPoints[3]]\n          .concat(middle)\n          .concat([\n            lastControlPoints[0],\n            lastControlPoints[1],\n            p[len - 2],\n            p[len - 1],\n            lastControlPoints[2],\n            lastControlPoints[3],\n            firstControlPoints[0],\n            firstControlPoints[1],\n            p[0],\n            p[1]\n          ]);\n\n      return tp;\n    },\n    getWidth: function() {\n      return this.getSelfRect().width;\n    },\n    getHeight: function() {\n      return this.getSelfRect().height;\n    },\n    // overload size detection\n    getSelfRect: function() {\n      var points;\n      if (this.getTension() !== 0) {\n        points = this._getTensionPoints();\n      } else {\n        points = this.getPoints();\n      }\n      var minX = points[0];\n      var maxX = points[0];\n      var minY = points[1];\n      var maxY = points[1];\n      var x, y;\n      for (var i = 0; i < points.length / 2; i++) {\n        x = points[i * 2];\n        y = points[i * 2 + 1];\n        minX = Math.min(minX, x);\n        maxX = Math.max(maxX, x);\n        minY = Math.min(minY, y);\n        maxY = Math.max(maxY, y);\n      }\n      return {\n        x: Math.round(minX),\n        y: Math.round(minY),\n        width: Math.round(maxX - minX),\n        height: Math.round(maxY - minY)\n      };\n    }\n  };\n  Konva.Util.extend(Konva.Line, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Line, 'closed', false);\n\n  /**\n     * get/set closed flag.  The default is false\n     * @name closed\n     * @method\n     * @memberof Konva.Line.prototype\n     * @param {Boolean} closed\n     * @returns {Boolean}\n     * @example\n     * // get closed flag\n     * var closed = line.closed();\n     *\n     * // close the shape\n     * line.closed(true);\n     *\n     * // open the shape\n     * line.closed(false);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Line, 'bezier', false);\n\n  /**\n    * get/set bezier flag.  The default is false\n    * @name bezier\n    * @method\n    * @memberof Konva.Line.prototype\n    * @param {Boolean} bezier\n    * @returns {Boolean}\n    * @example\n    * // get whether the line is a bezier\n    * var isBezier = line.bezier();\n    *\n    * // set whether the line is a bezier\n    * line.bezier(true);\n    */\n\n  Konva.Factory.addGetterSetter(Konva.Line, 'tension', 0);\n\n  /**\n     * get/set tension\n     * @name tension\n     * @method\n     * @memberof Konva.Line.prototype\n     * @param {Number} Higher values will result in a more curvy line.  A value of 0 will result in no interpolation.\n     *   The default is 0\n     * @returns {Number}\n     * @example\n     * // get tension\n     * var tension = line.tension();\n     *\n     * // set tension\n     * line.tension(3);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Line, 'points', []);\n  /**\n     * get/set points array\n     * @name points\n     * @method\n     * @memberof Konva.Line.prototype\n     * @param {Array} points\n     * @returns {Array}\n     * @example\n     * // get points\n     * var points = line.points();\n     *\n     * // set points\n     * line.points([10, 20, 30, 40, 50, 60]);\n     *\n     * // push a new point\n     * line.points(line.points().concat([70, 80]));\n     */\n\n  Konva.Collection.mapMethods(Konva.Line);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Sprite constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {String} config.animation animation key\n     * @param {Object} config.animations animation map\n     * @param {Integer} [config.frameIndex] animation frame index\n     * @param {Image} config.image image object\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var imageObj = new Image();\n     * imageObj.onload = function() {\n     *   var sprite = new Konva.Sprite({\n     *     x: 200,\n     *     y: 100,\n     *     image: imageObj,\n     *     animation: 'standing',\n     *     animations: {\n     *       standing: [\n     *         // x, y, width, height (6 frames)\n     *         0, 0, 49, 109,\n     *         52, 0, 49, 109,\n     *         105, 0, 49, 109,\n     *         158, 0, 49, 109,\n     *         210, 0, 49, 109,\n     *         262, 0, 49, 109\n     *       ],\n     *       kicking: [\n     *         // x, y, width, height (6 frames)\n     *         0, 109, 45, 98,\n     *         45, 109, 45, 98,\n     *         95, 109, 63, 98,\n     *         156, 109, 70, 98,\n     *         229, 109, 60, 98,\n     *         287, 109, 41, 98\n     *       ]\n     *     },\n     *     frameRate: 7,\n     *     frameIndex: 0\n     *   });\n     * };\n     * imageObj.src = '/path/to/image.jpg'\n     */\n  Konva.Sprite = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Sprite.prototype = {\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Sprite';\n\n      this._updated = true;\n      var that = this;\n      this.anim = new Konva.Animation(function() {\n        // if we don't need to redraw layer we should return false\n        var updated = that._updated;\n        that._updated = false;\n        return updated;\n      });\n      this.on('animationChange.konva', function() {\n        // reset index when animation changes\n        this.frameIndex(0);\n      });\n      this.on('frameIndexChange.konva', function() {\n        this._updated = true;\n      });\n      // smooth change for frameRate\n      this.on('frameRateChange.konva', function() {\n        if (!this.anim.isRunning()) {\n          return;\n        }\n        clearInterval(this.interval);\n        this._setInterval();\n      });\n\n      this.sceneFunc(this._sceneFunc);\n      this.hitFunc(this._hitFunc);\n    },\n    _sceneFunc: function(context) {\n      var anim = this.getAnimation(),\n        index = this.frameIndex(),\n        ix4 = index * 4,\n        set = this.getAnimations()[anim],\n        offsets = this.frameOffsets(),\n        x = set[ix4 + 0],\n        y = set[ix4 + 1],\n        width = set[ix4 + 2],\n        height = set[ix4 + 3],\n        image = this.getImage();\n\n      if (this.hasFill() || this.hasStroke()) {\n        context.beginPath();\n        context.rect(0, 0, width, height);\n        context.closePath();\n        context.fillStrokeShape(this);\n      }\n\n      if (image) {\n        if (offsets) {\n          var offset = offsets[anim], ix2 = index * 2;\n          context.drawImage(\n            image,\n            x,\n            y,\n            width,\n            height,\n            offset[ix2 + 0],\n            offset[ix2 + 1],\n            width,\n            height\n          );\n        } else {\n          context.drawImage(image, x, y, width, height, 0, 0, width, height);\n        }\n      }\n    },\n    _hitFunc: function(context) {\n      var anim = this.getAnimation(),\n        index = this.frameIndex(),\n        ix4 = index * 4,\n        set = this.getAnimations()[anim],\n        offsets = this.frameOffsets(),\n        width = set[ix4 + 2],\n        height = set[ix4 + 3];\n\n      context.beginPath();\n      if (offsets) {\n        var offset = offsets[anim];\n        var ix2 = index * 2;\n        context.rect(offset[ix2 + 0], offset[ix2 + 1], width, height);\n      } else {\n        context.rect(0, 0, width, height);\n      }\n      context.closePath();\n      context.fillShape(this);\n    },\n    _useBufferCanvas: function() {\n      return (\n        (this.hasShadow() || this.getAbsoluteOpacity() !== 1) &&\n        this.hasStroke()\n      );\n    },\n    _setInterval: function() {\n      var that = this;\n      this.interval = setInterval(function() {\n        that._updateIndex();\n      }, 1000 / this.getFrameRate());\n    },\n    /**\n         * start sprite animation\n         * @method\n         * @memberof Konva.Sprite.prototype\n         */\n    start: function() {\n      var layer = this.getLayer();\n\n      /*\n             * animation object has no executable function because\n             *  the updates are done with a fixed FPS with the setInterval\n             *  below.  The anim object only needs the layer reference for\n             *  redraw\n             */\n      this.anim.setLayers(layer);\n      this._setInterval();\n      this.anim.start();\n    },\n    /**\n         * stop sprite animation\n         * @method\n         * @memberof Konva.Sprite.prototype\n         */\n    stop: function() {\n      this.anim.stop();\n      clearInterval(this.interval);\n    },\n    /**\n         * determine if animation of sprite is running or not.  returns true or false\n         * @method\n         * @memberof Konva.Animation.prototype\n         * @returns {Boolean}\n         */\n    isRunning: function() {\n      return this.anim.isRunning();\n    },\n    _updateIndex: function() {\n      var index = this.frameIndex(),\n        animation = this.getAnimation(),\n        animations = this.getAnimations(),\n        anim = animations[animation],\n        len = anim.length / 4;\n\n      if (index < len - 1) {\n        this.frameIndex(index + 1);\n      } else {\n        this.frameIndex(0);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.Sprite, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'animation');\n\n  /**\n     * get/set animation key\n     * @name animation\n     * @method\n     * @memberof Konva.Sprite.prototype\n     * @param {String} anim animation key\n     * @returns {String}\n     * @example\n     * // get animation key\n     * var animation = sprite.animation();\n     *\n     * // set animation key\n     * sprite.animation('kicking');\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'animations');\n\n  /**\n     * get/set animations map\n     * @name animations\n     * @method\n     * @memberof Konva.Sprite.prototype\n     * @param {Object} animations\n     * @returns {Object}\n     * @example\n     * // get animations map\n     * var animations = sprite.animations();\n     *\n     * // set animations map\n     * sprite.animations({\n     *   standing: [\n     *     // x, y, width, height (6 frames)\n     *     0, 0, 49, 109,\n     *     52, 0, 49, 109,\n     *     105, 0, 49, 109,\n     *     158, 0, 49, 109,\n     *     210, 0, 49, 109,\n     *     262, 0, 49, 109\n     *   ],\n     *   kicking: [\n     *     // x, y, width, height (6 frames)\n     *     0, 109, 45, 98,\n     *     45, 109, 45, 98,\n     *     95, 109, 63, 98,\n     *     156, 109, 70, 98,\n     *     229, 109, 60, 98,\n     *     287, 109, 41, 98\n     *   ]\n     * });\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'frameOffsets');\n\n  /**\n    * get/set offsets map\n    * @name offsets\n    * @method\n    * @memberof Konva.Sprite.prototype\n    * @param {Object} offsets\n    * @returns {Object}\n    * @example\n    * // get offsets map\n    * var offsets = sprite.offsets();\n    *\n    * // set offsets map\n    * sprite.offsets({\n    *   standing: [\n    *     // x, y (6 frames)\n    *     0, 0,\n    *     0, 0,\n    *     5, 0,\n    *     0, 0,\n    *     0, 3,\n    *     2, 0\n    *   ],\n    *   kicking: [\n    *     // x, y (6 frames)\n    *     0, 5,\n    *     5, 0,\n    *     10, 0,\n    *     0, 0,\n    *     2, 1,\n    *     0, 0\n    *   ]\n    * });\n    */\n\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'image');\n\n  /**\n     * get/set image\n     * @name image\n     * @method\n     * @memberof Konva.Sprite.prototype\n     * @param {Image} image\n     * @returns {Image}\n     * @example\n     * // get image\n     * var image = sprite.image();\n     *\n     * // set image\n     * sprite.image(imageObj);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'frameIndex', 0);\n\n  /**\n     * set/set animation frame index\n     * @name frameIndex\n     * @method\n     * @memberof Konva.Sprite.prototype\n     * @param {Integer} frameIndex\n     * @returns {Integer}\n     * @example\n     * // get animation frame index\n     * var frameIndex = sprite.frameIndex();\n     *\n     * // set animation frame index\n     * sprite.frameIndex(3);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Sprite, 'frameRate', 17);\n\n  /**\n     * get/set frame rate in frames per second.  Increase this number to make the sprite\n     *  animation run faster, and decrease the number to make the sprite animation run slower\n     *  The default is 17 frames per second\n     * @name frameRate\n     * @method\n     * @memberof Konva.Sprite.prototype\n     * @param {Integer} frameRate\n     * @returns {Integer}\n     * @example\n     * // get frame rate\n     * var frameRate = sprite.frameRate();\n     *\n     * // set frame rate to 2 frames per second\n     * sprite.frameRate(2);\n     */\n\n  Konva.Factory.backCompat(Konva.Sprite, {\n    index: 'frameIndex',\n    getIndex: 'getFrameIndex',\n    setIndex: 'setFrameIndex'\n  });\n\n  Konva.Collection.mapMethods(Konva.Sprite);\n})();\n\n/*eslint-disable  no-shadow, max-len, max-depth */\n(function() {\n  'use strict';\n  /**\n     * Path constructor.\n     * @author Jason Follas\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {String} config.data SVG data string\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var path = new Konva.Path({\n     *   x: 240,\n     *   y: 40,\n     *   data: 'M12.582,9.551C3.251,16.237,0.921,29.021,7.08,38.564l-2.36,1.689l4.893,2.262l4.893,2.262l-0.568-5.36l-0.567-5.359l-2.365,1.694c-4.657-7.375-2.83-17.185,4.352-22.33c7.451-5.338,17.817-3.625,23.156,3.824c5.337,7.449,3.625,17.813-3.821,23.152l2.857,3.988c9.617-6.893,11.827-20.277,4.935-29.896C35.591,4.87,22.204,2.658,12.582,9.551z',\n     *   fill: 'green',\n     *   scale: 2\n     * });\n     */\n  Konva.Path = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Path.prototype = {\n    ___init: function(config) {\n      this.dataArray = [];\n      var that = this;\n\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Path';\n\n      this.dataArray = Konva.Path.parsePathData(this.getData());\n      this.on('dataChange.konva', function() {\n        that.dataArray = Konva.Path.parsePathData(this.getData());\n      });\n\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var ca = this.dataArray;\n\n      // context position\n      context.beginPath();\n      for (var n = 0; n < ca.length; n++) {\n        var c = ca[n].command;\n        var p = ca[n].points;\n        switch (c) {\n          case 'L':\n            context.lineTo(p[0], p[1]);\n            break;\n          case 'M':\n            context.moveTo(p[0], p[1]);\n            break;\n          case 'C':\n            context.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]);\n            break;\n          case 'Q':\n            context.quadraticCurveTo(p[0], p[1], p[2], p[3]);\n            break;\n          case 'A':\n            var cx = p[0],\n              cy = p[1],\n              rx = p[2],\n              ry = p[3],\n              theta = p[4],\n              dTheta = p[5],\n              psi = p[6],\n              fs = p[7];\n\n            var r = rx > ry ? rx : ry;\n            var scaleX = rx > ry ? 1 : rx / ry;\n            var scaleY = rx > ry ? ry / rx : 1;\n\n            context.translate(cx, cy);\n            context.rotate(psi);\n            context.scale(scaleX, scaleY);\n            context.arc(0, 0, r, theta, theta + dTheta, 1 - fs);\n            context.scale(1 / scaleX, 1 / scaleY);\n            context.rotate(-psi);\n            context.translate(-cx, -cy);\n\n            break;\n          case 'z':\n            context.closePath();\n            break;\n        }\n      }\n\n      context.fillStrokeShape(this);\n    },\n    getSelfRect: function() {\n      var points = [];\n      this.dataArray.forEach(function(data) {\n        points = points.concat(data.points);\n      });\n      var minX = points[0];\n      var maxX = points[0];\n      var minY = points[1];\n      var maxY = points[1];\n      var x, y;\n      for (var i = 0; i < points.length / 2; i++) {\n        x = points[i * 2];\n        y = points[i * 2 + 1];\n        minX = Math.min(minX, x);\n        maxX = Math.max(maxX, x);\n        minY = Math.min(minY, y);\n        maxY = Math.max(maxY, y);\n      }\n      return {\n        x: Math.round(minX),\n        y: Math.round(minY),\n        width: Math.round(maxX - minX),\n        height: Math.round(maxY - minY)\n      };\n    }\n  };\n  Konva.Util.extend(Konva.Path, Konva.Shape);\n\n  Konva.Path.getLineLength = function(x1, y1, x2, y2) {\n    return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n  };\n  Konva.Path.getPointOnLine = function(dist, P1x, P1y, P2x, P2y, fromX, fromY) {\n    if (fromX === undefined) {\n      fromX = P1x;\n    }\n    if (fromY === undefined) {\n      fromY = P1y;\n    }\n\n    var m = (P2y - P1y) / (P2x - P1x + 0.00000001);\n    var run = Math.sqrt(dist * dist / (1 + m * m));\n    if (P2x < P1x) {\n      run *= -1;\n    }\n    var rise = m * run;\n    var pt;\n\n    if (P2x === P1x) {\n      // vertical line\n      pt = {\n        x: fromX,\n        y: fromY + rise\n      };\n    } else if ((fromY - P1y) / (fromX - P1x + 0.00000001) === m) {\n      pt = {\n        x: fromX + run,\n        y: fromY + rise\n      };\n    } else {\n      var ix, iy;\n\n      var len = this.getLineLength(P1x, P1y, P2x, P2y);\n      if (len < 0.00000001) {\n        return undefined;\n      }\n      var u = (fromX - P1x) * (P2x - P1x) + (fromY - P1y) * (P2y - P1y);\n      u = u / (len * len);\n      ix = P1x + u * (P2x - P1x);\n      iy = P1y + u * (P2y - P1y);\n\n      var pRise = this.getLineLength(fromX, fromY, ix, iy);\n      var pRun = Math.sqrt(dist * dist - pRise * pRise);\n      run = Math.sqrt(pRun * pRun / (1 + m * m));\n      if (P2x < P1x) {\n        run *= -1;\n      }\n      rise = m * run;\n      pt = {\n        x: ix + run,\n        y: iy + rise\n      };\n    }\n\n    return pt;\n  };\n\n  Konva.Path.getPointOnCubicBezier = function(\n    pct,\n    P1x,\n    P1y,\n    P2x,\n    P2y,\n    P3x,\n    P3y,\n    P4x,\n    P4y\n  ) {\n    function CB1(t) {\n      return t * t * t;\n    }\n    function CB2(t) {\n      return 3 * t * t * (1 - t);\n    }\n    function CB3(t) {\n      return 3 * t * (1 - t) * (1 - t);\n    }\n    function CB4(t) {\n      return (1 - t) * (1 - t) * (1 - t);\n    }\n    var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct);\n    var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct);\n\n    return {\n      x: x,\n      y: y\n    };\n  };\n  Konva.Path.getPointOnQuadraticBezier = function(\n    pct,\n    P1x,\n    P1y,\n    P2x,\n    P2y,\n    P3x,\n    P3y\n  ) {\n    function QB1(t) {\n      return t * t;\n    }\n    function QB2(t) {\n      return 2 * t * (1 - t);\n    }\n    function QB3(t) {\n      return (1 - t) * (1 - t);\n    }\n    var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct);\n    var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct);\n\n    return {\n      x: x,\n      y: y\n    };\n  };\n  Konva.Path.getPointOnEllipticalArc = function(cx, cy, rx, ry, theta, psi) {\n    var cosPsi = Math.cos(psi), sinPsi = Math.sin(psi);\n    var pt = {\n      x: rx * Math.cos(theta),\n      y: ry * Math.sin(theta)\n    };\n    return {\n      x: cx + (pt.x * cosPsi - pt.y * sinPsi),\n      y: cy + (pt.x * sinPsi + pt.y * cosPsi)\n    };\n  };\n  /*\n     * get parsed data array from the data\n     *  string.  V, v, H, h, and l data are converted to\n     *  L data for the purpose of high performance Path\n     *  rendering\n     */\n  Konva.Path.parsePathData = function(data) {\n    // Path Data Segment must begin with a moveTo\n    //m (x y)+  Relative moveTo (subsequent points are treated as lineTo)\n    //M (x y)+  Absolute moveTo (subsequent points are treated as lineTo)\n    //l (x y)+  Relative lineTo\n    //L (x y)+  Absolute LineTo\n    //h (x)+    Relative horizontal lineTo\n    //H (x)+    Absolute horizontal lineTo\n    //v (y)+    Relative vertical lineTo\n    //V (y)+    Absolute vertical lineTo\n    //z (closepath)\n    //Z (closepath)\n    //c (x1 y1 x2 y2 x y)+ Relative Bezier curve\n    //C (x1 y1 x2 y2 x y)+ Absolute Bezier curve\n    //q (x1 y1 x y)+       Relative Quadratic Bezier\n    //Q (x1 y1 x y)+       Absolute Quadratic Bezier\n    //t (x y)+    Shorthand/Smooth Relative Quadratic Bezier\n    //T (x y)+    Shorthand/Smooth Absolute Quadratic Bezier\n    //s (x2 y2 x y)+       Shorthand/Smooth Relative Bezier curve\n    //S (x2 y2 x y)+       Shorthand/Smooth Absolute Bezier curve\n    //a (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+     Relative Elliptical Arc\n    //A (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+  Absolute Elliptical Arc\n\n    // return early if data is not defined\n    if (!data) {\n      return [];\n    }\n\n    // command string\n    var cs = data;\n\n    // command chars\n    var cc = [\n      'm',\n      'M',\n      'l',\n      'L',\n      'v',\n      'V',\n      'h',\n      'H',\n      'z',\n      'Z',\n      'c',\n      'C',\n      'q',\n      'Q',\n      't',\n      'T',\n      's',\n      'S',\n      'a',\n      'A'\n    ];\n    // convert white spaces to commas\n    cs = cs.replace(new RegExp(' ', 'g'), ',');\n    // create pipes so that we can split the data\n    for (var n = 0; n < cc.length; n++) {\n      cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);\n    }\n    // create array\n    var arr = cs.split('|');\n    var ca = [];\n    // init context point\n    var cpx = 0;\n    var cpy = 0;\n    for (n = 1; n < arr.length; n++) {\n      var str = arr[n];\n      var c = str.charAt(0);\n      str = str.slice(1);\n      // remove ,- for consistency\n      str = str.replace(new RegExp(',-', 'g'), '-');\n      // add commas so that it's easy to split\n      str = str.replace(new RegExp('-', 'g'), ',-');\n      str = str.replace(new RegExp('e,-', 'g'), 'e-');\n      var p = str.split(',');\n      if (p.length > 0 && p[0] === '') {\n        p.shift();\n      }\n      // convert strings to floats\n      for (var i = 0; i < p.length; i++) {\n        p[i] = parseFloat(p[i]);\n      }\n      while (p.length > 0) {\n        if (isNaN(p[0])) {\n          // case for a trailing comma before next command\n          break;\n        }\n\n        var cmd = null;\n        var points = [];\n        var startX = cpx, startY = cpy;\n        // Move var from within the switch to up here (jshint)\n        var prevCmd, ctlPtx, ctlPty; // Ss, Tt\n        var rx, ry, psi, fa, fs, x1, y1; // Aa\n\n        // convert l, H, h, V, and v to L\n        switch (c) {\n          // Note: Keep the lineTo's above the moveTo's in this switch\n          case 'l':\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'L';\n            points.push(cpx, cpy);\n            break;\n          case 'L':\n            cpx = p.shift();\n            cpy = p.shift();\n            points.push(cpx, cpy);\n            break;\n          // Note: lineTo handlers need to be above this point\n          case 'm':\n            var dx = p.shift();\n            var dy = p.shift();\n            cpx += dx;\n            cpy += dy;\n            cmd = 'M';\n            // After closing the path move the current position\n            // to the the first point of the path (if any).\n            if (ca.length > 2 && ca[ca.length - 1].command === 'z') {\n              for (var idx = ca.length - 2; idx >= 0; idx--) {\n                if (ca[idx].command === 'M') {\n                  cpx = ca[idx].points[0] + dx;\n                  cpy = ca[idx].points[1] + dy;\n                  break;\n                }\n              }\n            }\n            points.push(cpx, cpy);\n            c = 'l';\n            // subsequent points are treated as relative lineTo\n            break;\n          case 'M':\n            cpx = p.shift();\n            cpy = p.shift();\n            cmd = 'M';\n            points.push(cpx, cpy);\n            c = 'L';\n            // subsequent points are treated as absolute lineTo\n            break;\n\n          case 'h':\n            cpx += p.shift();\n            cmd = 'L';\n            points.push(cpx, cpy);\n            break;\n          case 'H':\n            cpx = p.shift();\n            cmd = 'L';\n            points.push(cpx, cpy);\n            break;\n          case 'v':\n            cpy += p.shift();\n            cmd = 'L';\n            points.push(cpx, cpy);\n            break;\n          case 'V':\n            cpy = p.shift();\n            cmd = 'L';\n            points.push(cpx, cpy);\n            break;\n          case 'C':\n            points.push(p.shift(), p.shift(), p.shift(), p.shift());\n            cpx = p.shift();\n            cpy = p.shift();\n            points.push(cpx, cpy);\n            break;\n          case 'c':\n            points.push(\n              cpx + p.shift(),\n              cpy + p.shift(),\n              cpx + p.shift(),\n              cpy + p.shift()\n            );\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'C';\n            points.push(cpx, cpy);\n            break;\n          case 'S':\n            ctlPtx = cpx;\n            ctlPty = cpy;\n            prevCmd = ca[ca.length - 1];\n            if (prevCmd.command === 'C') {\n              ctlPtx = cpx + (cpx - prevCmd.points[2]);\n              ctlPty = cpy + (cpy - prevCmd.points[3]);\n            }\n            points.push(ctlPtx, ctlPty, p.shift(), p.shift());\n            cpx = p.shift();\n            cpy = p.shift();\n            cmd = 'C';\n            points.push(cpx, cpy);\n            break;\n          case 's':\n            ctlPtx = cpx;\n            ctlPty = cpy;\n            prevCmd = ca[ca.length - 1];\n            if (prevCmd.command === 'C') {\n              ctlPtx = cpx + (cpx - prevCmd.points[2]);\n              ctlPty = cpy + (cpy - prevCmd.points[3]);\n            }\n            points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift());\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'C';\n            points.push(cpx, cpy);\n            break;\n          case 'Q':\n            points.push(p.shift(), p.shift());\n            cpx = p.shift();\n            cpy = p.shift();\n            points.push(cpx, cpy);\n            break;\n          case 'q':\n            points.push(cpx + p.shift(), cpy + p.shift());\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'Q';\n            points.push(cpx, cpy);\n            break;\n          case 'T':\n            ctlPtx = cpx;\n            ctlPty = cpy;\n            prevCmd = ca[ca.length - 1];\n            if (prevCmd.command === 'Q') {\n              ctlPtx = cpx + (cpx - prevCmd.points[0]);\n              ctlPty = cpy + (cpy - prevCmd.points[1]);\n            }\n            cpx = p.shift();\n            cpy = p.shift();\n            cmd = 'Q';\n            points.push(ctlPtx, ctlPty, cpx, cpy);\n            break;\n          case 't':\n            ctlPtx = cpx;\n            ctlPty = cpy;\n            prevCmd = ca[ca.length - 1];\n            if (prevCmd.command === 'Q') {\n              ctlPtx = cpx + (cpx - prevCmd.points[0]);\n              ctlPty = cpy + (cpy - prevCmd.points[1]);\n            }\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'Q';\n            points.push(ctlPtx, ctlPty, cpx, cpy);\n            break;\n          case 'A':\n            rx = p.shift();\n            ry = p.shift();\n            psi = p.shift();\n            fa = p.shift();\n            fs = p.shift();\n            x1 = cpx;\n            y1 = cpy;\n            cpx = p.shift();\n            cpy = p.shift();\n            cmd = 'A';\n            points = this.convertEndpointToCenterParameterization(\n              x1,\n              y1,\n              cpx,\n              cpy,\n              fa,\n              fs,\n              rx,\n              ry,\n              psi\n            );\n            break;\n          case 'a':\n            rx = p.shift();\n            ry = p.shift();\n            psi = p.shift();\n            fa = p.shift();\n            fs = p.shift();\n            x1 = cpx;\n            y1 = cpy;\n            cpx += p.shift();\n            cpy += p.shift();\n            cmd = 'A';\n            points = this.convertEndpointToCenterParameterization(\n              x1,\n              y1,\n              cpx,\n              cpy,\n              fa,\n              fs,\n              rx,\n              ry,\n              psi\n            );\n            break;\n        }\n\n        ca.push({\n          command: cmd || c,\n          points: points,\n          start: {\n            x: startX,\n            y: startY\n          },\n          pathLength: this.calcLength(startX, startY, cmd || c, points)\n        });\n      }\n\n      if (c === 'z' || c === 'Z') {\n        ca.push({\n          command: 'z',\n          points: [],\n          start: undefined,\n          pathLength: 0\n        });\n      }\n    }\n\n    return ca;\n  };\n  Konva.Path.calcLength = function(x, y, cmd, points) {\n    var len, p1, p2, t;\n    var path = Konva.Path;\n\n    switch (cmd) {\n      case 'L':\n        return path.getLineLength(x, y, points[0], points[1]);\n      case 'C':\n        // Approximates by breaking curve into 100 line segments\n        len = 0.0;\n        p1 = path.getPointOnCubicBezier(\n          0,\n          x,\n          y,\n          points[0],\n          points[1],\n          points[2],\n          points[3],\n          points[4],\n          points[5]\n        );\n        for (t = 0.01; t <= 1; t += 0.01) {\n          p2 = path.getPointOnCubicBezier(\n            t,\n            x,\n            y,\n            points[0],\n            points[1],\n            points[2],\n            points[3],\n            points[4],\n            points[5]\n          );\n          len += path.getLineLength(p1.x, p1.y, p2.x, p2.y);\n          p1 = p2;\n        }\n        return len;\n      case 'Q':\n        // Approximates by breaking curve into 100 line segments\n        len = 0.0;\n        p1 = path.getPointOnQuadraticBezier(\n          0,\n          x,\n          y,\n          points[0],\n          points[1],\n          points[2],\n          points[3]\n        );\n        for (t = 0.01; t <= 1; t += 0.01) {\n          p2 = path.getPointOnQuadraticBezier(\n            t,\n            x,\n            y,\n            points[0],\n            points[1],\n            points[2],\n            points[3]\n          );\n          len += path.getLineLength(p1.x, p1.y, p2.x, p2.y);\n          p1 = p2;\n        }\n        return len;\n      case 'A':\n        // Approximates by breaking curve into line segments\n        len = 0.0;\n        var start = points[4];\n        // 4 = theta\n        var dTheta = points[5];\n        // 5 = dTheta\n        var end = points[4] + dTheta;\n        var inc = Math.PI / 180.0;\n        // 1 degree resolution\n        if (Math.abs(start - end) < inc) {\n          inc = Math.abs(start - end);\n        }\n        // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi\n        p1 = path.getPointOnEllipticalArc(\n          points[0],\n          points[1],\n          points[2],\n          points[3],\n          start,\n          0\n        );\n        if (dTheta < 0) {\n          // clockwise\n          for (t = start - inc; t > end; t -= inc) {\n            p2 = path.getPointOnEllipticalArc(\n              points[0],\n              points[1],\n              points[2],\n              points[3],\n              t,\n              0\n            );\n            len += path.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n        } else {\n          // counter-clockwise\n          for (t = start + inc; t < end; t += inc) {\n            p2 = path.getPointOnEllipticalArc(\n              points[0],\n              points[1],\n              points[2],\n              points[3],\n              t,\n              0\n            );\n            len += path.getLineLength(p1.x, p1.y, p2.x, p2.y);\n            p1 = p2;\n          }\n        }\n        p2 = path.getPointOnEllipticalArc(\n          points[0],\n          points[1],\n          points[2],\n          points[3],\n          end,\n          0\n        );\n        len += path.getLineLength(p1.x, p1.y, p2.x, p2.y);\n\n        return len;\n    }\n\n    return 0;\n  };\n  Konva.Path.convertEndpointToCenterParameterization = function(\n    x1,\n    y1,\n    x2,\n    y2,\n    fa,\n    fs,\n    rx,\n    ry,\n    psiDeg\n  ) {\n    // Derived from: http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n    var psi = psiDeg * (Math.PI / 180.0);\n    var xp = Math.cos(psi) * (x1 - x2) / 2.0 + Math.sin(psi) * (y1 - y2) / 2.0;\n    var yp =\n      -1 * Math.sin(psi) * (x1 - x2) / 2.0 + Math.cos(psi) * (y1 - y2) / 2.0;\n\n    var lambda = xp * xp / (rx * rx) + yp * yp / (ry * ry);\n\n    if (lambda > 1) {\n      rx *= Math.sqrt(lambda);\n      ry *= Math.sqrt(lambda);\n    }\n\n    var f = Math.sqrt(\n      (rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) /\n        (rx * rx * (yp * yp) + ry * ry * (xp * xp))\n    );\n\n    if (fa === fs) {\n      f *= -1;\n    }\n    if (isNaN(f)) {\n      f = 0;\n    }\n\n    var cxp = f * rx * yp / ry;\n    var cyp = f * -ry * xp / rx;\n\n    var cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp;\n    var cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp;\n\n    var vMag = function(v) {\n      return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n    };\n    var vRatio = function(u, v) {\n      return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));\n    };\n    var vAngle = function(u, v) {\n      return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));\n    };\n    var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);\n    var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n    var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n    var dTheta = vAngle(u, v);\n\n    if (vRatio(u, v) <= -1) {\n      dTheta = Math.PI;\n    }\n    if (vRatio(u, v) >= 1) {\n      dTheta = 0;\n    }\n    if (fs === 0 && dTheta > 0) {\n      dTheta = dTheta - 2 * Math.PI;\n    }\n    if (fs === 1 && dTheta < 0) {\n      dTheta = dTheta + 2 * Math.PI;\n    }\n    return [cx, cy, rx, ry, theta, dTheta, psi, fs];\n  };\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Path, 'data');\n\n  /**\n     * set SVG path data string.  This method\n     *  also automatically parses the data string\n     *  into a data array.  Currently supported SVG data:\n     *  M, m, L, l, H, h, V, v, Q, q, T, t, C, c, S, s, A, a, Z, z\n     * @name setData\n     * @method\n     * @memberof Konva.Path.prototype\n     * @param {String} SVG path command string\n     */\n\n  /**\n     * get SVG path data string\n     * @name getData\n     * @method\n     * @memberof Konva.Path.prototype\n     */\n\n  Konva.Collection.mapMethods(Konva.Path);\n})();\n\n(function() {\n  'use strict';\n  var EMPTY_STRING = '',\n    //CALIBRI = 'Calibri',\n    NORMAL = 'normal';\n\n  /**\n     * Path constructor.\n     * @author Jason Follas\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {String} [config.fontFamily] default is Calibri\n     * @param {Number} [config.fontSize] default is 12\n     * @param {String} [config.fontStyle] can be normal, bold, or italic.  Default is normal\n     * @param {String} [config.fontVariant] can be normal or small-caps.  Default is normal\n     * @param {String} config.text\n     * @param {String} config.data SVG data string\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var textpath = new Konva.TextPath({\n     *   x: 100,\n     *   y: 50,\n     *   fill: '#333',\n     *   fontSize: '24',\n     *   fontFamily: 'Arial',\n     *   text: 'All the world\\'s a stage, and all the men and women merely players.',\n     *   data: 'M10,10 C0,0 10,150 100,100 S300,150 400,50'\n     * });\n     */\n  Konva.TextPath = function(config) {\n    this.___init(config);\n  };\n\n  function _fillFunc(context) {\n    context.fillText(this.partialText, 0, 0);\n  }\n  function _strokeFunc(context) {\n    context.strokeText(this.partialText, 0, 0);\n  }\n\n  Konva.TextPath.prototype = {\n    ___init: function(config) {\n      var that = this;\n      this.dummyCanvas = Konva.Util.createCanvasElement();\n      this.dataArray = [];\n\n      // call super constructor\n      Konva.Shape.call(this, config);\n\n      // overrides\n      // TODO: shouldn't this be on the prototype?\n      this._fillFunc = _fillFunc;\n      this._strokeFunc = _strokeFunc;\n      this._fillFuncHit = _fillFunc;\n      this._strokeFuncHit = _strokeFunc;\n\n      this.className = 'TextPath';\n\n      this.dataArray = Konva.Path.parsePathData(this.attrs.data);\n      this.on('dataChange.konva', function() {\n        that.dataArray = Konva.Path.parsePathData(this.attrs.data);\n        that._setTextData();\n      });\n\n      // update text data for certain attr changes\n      this.on(\n        'textChange.konva alignChange.konva letterSpacingChange.konva',\n        that._setTextData\n      );\n      that._setTextData();\n      this.sceneFunc(this._sceneFunc);\n      this.hitFunc(this._hitFunc);\n    },\n    _sceneFunc: function(context) {\n      context.setAttr('font', this._getContextFont());\n      context.setAttr('textBaseline', this.getTextBaseline());\n      context.setAttr('textAlign', 'left');\n      context.save();\n\n      var textDecoration = this.textDecoration();\n      var fill = this.fill();\n      var fontSize = this.fontSize();\n\n      var glyphInfo = this.glyphInfo;\n      if (textDecoration === 'underline') {\n        context.beginPath();\n      }\n      for (var i = 0; i < glyphInfo.length; i++) {\n        context.save();\n\n        var p0 = glyphInfo[i].p0;\n\n        context.translate(p0.x, p0.y);\n        context.rotate(glyphInfo[i].rotation);\n        this.partialText = glyphInfo[i].text;\n\n        context.fillStrokeShape(this);\n        if (textDecoration === 'underline') {\n          if (i === 0) {\n            context.moveTo(0, fontSize / 2 + 1);\n          }\n\n          context.lineTo(fontSize, fontSize / 2 + 1);\n        }\n        context.restore();\n\n        //// To assist with debugging visually, uncomment following\n        //\n        // if (i % 2)\n        // context.strokeStyle = 'cyan';\n        // else\n        // context.strokeStyle = 'green';\n        // var p1 = glyphInfo[i].p1;\n        // context.moveTo(p0.x, p0.y);\n        // context.lineTo(p1.x, p1.y);\n        // context.stroke();\n      }\n      if (textDecoration === 'underline') {\n        context.strokeStyle = fill;\n        context.lineWidth = fontSize / 20;\n        context.stroke();\n      }\n\n      context.restore();\n    },\n    _hitFunc: function(context) {\n      context.beginPath();\n\n      var glyphInfo = this.glyphInfo;\n      if (glyphInfo.length >= 1) {\n        var p0 = glyphInfo[0].p0;\n        context.moveTo(p0.x, p0.y);\n      }\n      for (var i = 0; i < glyphInfo.length; i++) {\n        var p1 = glyphInfo[i].p1;\n        context.lineTo(p1.x, p1.y);\n      }\n      context.setAttr('lineWidth', this.getFontSize());\n      context.setAttr('strokeStyle', this.colorKey);\n      context.stroke();\n    },\n    /**\n         * get text width in pixels\n         * @method\n         * @memberof Konva.TextPath.prototype\n         */\n    getTextWidth: function() {\n      return this.textWidth;\n    },\n    /**\n         * get text height in pixels\n         * @method\n         * @memberof Konva.TextPath.prototype\n         */\n    getTextHeight: function() {\n      return this.textHeight;\n    },\n    /**\n         * set text\n         * @method\n         * @memberof Konva.TextPath.prototype\n         * @param {String} text\n         */\n    setText: function(text) {\n      Konva.Text.prototype.setText.call(this, text);\n    },\n    _getTextSize: function(text) {\n      var dummyCanvas = this.dummyCanvas;\n      var _context = dummyCanvas.getContext('2d');\n\n      _context.save();\n\n      _context.font = this._getContextFont();\n      var metrics = _context.measureText(text);\n\n      _context.restore();\n\n      return {\n        width: metrics.width,\n        height: parseInt(this.attrs.fontSize, 10)\n      };\n    },\n    _setTextData: function() {\n      var that = this;\n      var size = this._getTextSize(this.attrs.text);\n      var letterSpacing = this.getLetterSpacing();\n      var align = this.align();\n\n      this.textWidth = size.width;\n      this.textHeight = size.height;\n\n      var textFullWidth = Math.max(\n        this.textWidth + ((this.attrs.text || '').length - 1) * letterSpacing,\n        0\n      );\n\n      this.glyphInfo = [];\n\n      var fullPathWidth = 0;\n      for (var l = 0; l < that.dataArray.length; l++) {\n        if (that.dataArray[l].pathLength > 0) {\n          fullPathWidth += that.dataArray[l].pathLength;\n        }\n      }\n\n      var offset = 0;\n      if (align === 'center') {\n        offset = Math.max(0, fullPathWidth / 2 - textFullWidth / 2);\n      }\n      if (align === 'right') {\n        offset = Math.max(0, fullPathWidth - textFullWidth);\n      }\n\n      var charArr = this.getText().split('');\n      var spacesNumber = this.getText().split(' ').length - 1;\n\n      var p0, p1, pathCmd;\n\n      var pIndex = -1;\n      var currentT = 0;\n      // var sumLength = 0;\n      // for(var j = 0; j < that.dataArray.length; j++) {\n      //   if(that.dataArray[j].pathLength > 0) {\n      //\n      //     if (sumLength + that.dataArray[j].pathLength > offset) {}\n      //       fullPathWidth += that.dataArray[j].pathLength;\n      //   }\n      // }\n\n      var getNextPathSegment = function() {\n        currentT = 0;\n        var pathData = that.dataArray;\n\n        for (var j = pIndex + 1; j < pathData.length; j++) {\n          if (pathData[j].pathLength > 0) {\n            pIndex = j;\n\n            return pathData[j];\n          } else if (pathData[j].command === 'M') {\n            p0 = {\n              x: pathData[j].points[0],\n              y: pathData[j].points[1]\n            };\n          }\n        }\n\n        return {};\n      };\n\n      var findSegmentToFitCharacter = function(c) {\n        var glyphWidth = that._getTextSize(c).width + letterSpacing;\n\n        if (c === ' ' && align === 'justify') {\n          glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;\n        }\n\n        var currLen = 0;\n        var attempts = 0;\n\n        p1 = undefined;\n        while (\n          Math.abs(glyphWidth - currLen) / glyphWidth > 0.01 &&\n          attempts < 25\n        ) {\n          attempts++;\n          var cumulativePathLength = currLen;\n          while (pathCmd === undefined) {\n            pathCmd = getNextPathSegment();\n\n            if (\n              pathCmd &&\n              cumulativePathLength + pathCmd.pathLength < glyphWidth\n            ) {\n              cumulativePathLength += pathCmd.pathLength;\n              pathCmd = undefined;\n            }\n          }\n\n          if (pathCmd === {} || p0 === undefined) {\n            return undefined;\n          }\n\n          var needNewSegment = false;\n\n          switch (pathCmd.command) {\n            case 'L':\n              if (\n                Konva.Path.getLineLength(\n                  p0.x,\n                  p0.y,\n                  pathCmd.points[0],\n                  pathCmd.points[1]\n                ) > glyphWidth\n              ) {\n                p1 = Konva.Path.getPointOnLine(\n                  glyphWidth,\n                  p0.x,\n                  p0.y,\n                  pathCmd.points[0],\n                  pathCmd.points[1],\n                  p0.x,\n                  p0.y\n                );\n              } else {\n                pathCmd = undefined;\n              }\n              break;\n            case 'A':\n              var start = pathCmd.points[4];\n              // 4 = theta\n              var dTheta = pathCmd.points[5];\n              // 5 = dTheta\n              var end = pathCmd.points[4] + dTheta;\n\n              if (currentT === 0) {\n                currentT = start + 0.00000001;\n              } else if (glyphWidth > currLen) {\n                // Just in case start is 0\n                currentT += Math.PI / 180.0 * dTheta / Math.abs(dTheta);\n              } else {\n                currentT -= Math.PI / 360.0 * dTheta / Math.abs(dTheta);\n              }\n\n              // Credit for bug fix: @therth https://github.com/ericdrowell/KonvaJS/issues/249\n              // Old code failed to render text along arc of this path: \"M 50 50 a 150 50 0 0 1 250 50 l 50 0\"\n              if (\n                (dTheta < 0 && currentT < end) ||\n                (dTheta >= 0 && currentT > end)\n              ) {\n                currentT = end;\n                needNewSegment = true;\n              }\n              p1 = Konva.Path.getPointOnEllipticalArc(\n                pathCmd.points[0],\n                pathCmd.points[1],\n                pathCmd.points[2],\n                pathCmd.points[3],\n                currentT,\n                pathCmd.points[6]\n              );\n              break;\n            case 'C':\n              if (currentT === 0) {\n                if (glyphWidth > pathCmd.pathLength) {\n                  currentT = 0.00000001;\n                } else {\n                  currentT = glyphWidth / pathCmd.pathLength;\n                }\n              } else if (glyphWidth > currLen) {\n                currentT += (glyphWidth - currLen) / pathCmd.pathLength;\n              } else {\n                currentT -= (currLen - glyphWidth) / pathCmd.pathLength;\n              }\n\n              if (currentT > 1.0) {\n                currentT = 1.0;\n                needNewSegment = true;\n              }\n              p1 = Konva.Path.getPointOnCubicBezier(\n                currentT,\n                pathCmd.start.x,\n                pathCmd.start.y,\n                pathCmd.points[0],\n                pathCmd.points[1],\n                pathCmd.points[2],\n                pathCmd.points[3],\n                pathCmd.points[4],\n                pathCmd.points[5]\n              );\n              break;\n            case 'Q':\n              if (currentT === 0) {\n                currentT = glyphWidth / pathCmd.pathLength;\n              } else if (glyphWidth > currLen) {\n                currentT += (glyphWidth - currLen) / pathCmd.pathLength;\n              } else {\n                currentT -= (currLen - glyphWidth) / pathCmd.pathLength;\n              }\n\n              if (currentT > 1.0) {\n                currentT = 1.0;\n                needNewSegment = true;\n              }\n              p1 = Konva.Path.getPointOnQuadraticBezier(\n                currentT,\n                pathCmd.start.x,\n                pathCmd.start.y,\n                pathCmd.points[0],\n                pathCmd.points[1],\n                pathCmd.points[2],\n                pathCmd.points[3]\n              );\n              break;\n          }\n\n          if (p1 !== undefined) {\n            currLen = Konva.Path.getLineLength(p0.x, p0.y, p1.x, p1.y);\n          }\n\n          if (needNewSegment) {\n            needNewSegment = false;\n            pathCmd = undefined;\n          }\n        }\n      };\n\n      // fake search for offset, this is very bad approach\n      // TODO: find other way to add offset from start (for align)\n      var testChar = 'C';\n      var glyphWidth = that._getTextSize(testChar).width + letterSpacing;\n      for (var k = 0; k < offset / glyphWidth; k++) {\n        findSegmentToFitCharacter(testChar);\n        if (p0 === undefined || p1 === undefined) {\n          break;\n        }\n        p0 = p1;\n      }\n\n      for (var i = 0; i < charArr.length; i++) {\n        // Find p1 such that line segment between p0 and p1 is approx. width of glyph\n        findSegmentToFitCharacter(charArr[i]);\n\n        if (p0 === undefined || p1 === undefined) {\n          break;\n        }\n\n        var width = Konva.Path.getLineLength(p0.x, p0.y, p1.x, p1.y);\n\n        // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.\n        // Can foresee having a rough pair table built in that the developer can override as needed.\n\n        var kern = 0;\n        // placeholder for future implementation\n\n        var midpoint = Konva.Path.getPointOnLine(\n          kern + width / 2.0,\n          p0.x,\n          p0.y,\n          p1.x,\n          p1.y\n        );\n\n        var rotation = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n        this.glyphInfo.push({\n          transposeX: midpoint.x,\n          transposeY: midpoint.y,\n          text: charArr[i],\n          rotation: rotation,\n          p0: p0,\n          p1: p1\n        });\n        p0 = p1;\n      }\n    },\n    getSelfRect: function() {\n      var points = [];\n\n      this.glyphInfo.forEach(function(info) {\n        points.push(info.p0.x);\n        points.push(info.p0.y);\n        points.push(info.p1.x);\n        points.push(info.p1.y);\n      });\n      var minX = points[0];\n      var maxX = points[0];\n      var minY = points[0];\n      var maxY = points[0];\n      var x, y;\n      for (var i = 0; i < points.length / 2; i++) {\n        x = points[i * 2];\n        y = points[i * 2 + 1];\n        minX = Math.min(minX, x);\n        maxX = Math.max(maxX, x);\n        minY = Math.min(minY, y);\n        maxY = Math.max(maxY, y);\n      }\n      var fontSize = this.fontSize();\n      return {\n        x: Math.round(minX) - fontSize / 2,\n        y: Math.round(minY) - fontSize / 2,\n        width: Math.round(maxX - minX) + fontSize,\n        height: Math.round(maxY - minY) + fontSize\n      };\n    }\n  };\n\n  // map TextPath methods to Text\n  Konva.TextPath.prototype._getContextFont =\n    Konva.Text.prototype._getContextFont;\n\n  Konva.Util.extend(Konva.TextPath, Konva.Shape);\n\n  // add setters and getters\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'fontFamily', 'Arial');\n\n  /**\n     * set font family\n     * @name setFontFamily\n     * @method\n     * @memberof Konva.TextPath.prototype\n     * @param {String} fontFamily\n     */\n\n  /**\n     * get font family\n     * @name getFontFamily\n     * @method\n     * @memberof Konva.TextPath.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'fontSize', 12);\n\n  /**\n     * set font size\n     * @name setFontSize\n     * @method\n     * @memberof Konva.TextPath.prototype\n     * @param {int} fontSize\n     */\n\n  /**\n     * get font size\n     * @name getFontSize\n     * @method\n     * @memberof Konva.TextPath.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'fontStyle', NORMAL);\n\n  /**\n     * set font style.  Can be 'normal', 'italic', or 'bold'.  'normal' is the default.\n     * @name setFontStyle\n     * @method\n     * @memberof Konva.TextPath.prototype\n     * @param {String} fontStyle\n     */\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'align', 'left');\n\n  /**\n      * get/set horizontal align of text.  Can be 'left', 'center', 'right' or 'justify'\n      * @name align\n      * @method\n      * @memberof Konva.Text.prototype\n      * @param {String} align\n      * @returns {String}\n      * @example\n      * // get text align\n      * var align = text.align();\n      *\n      * // center text\n      * text.align('center');\n      *\n      * // align text to right\n      * text.align('right');\n      */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'letterSpacing', 0);\n\n  /**\n      * set letter spacing property. Default value is 0.\n      * @name letterSpacing\n      * @method\n      * @memberof Konva.TextPath.prototype\n      * @param {Number} letterSpacing\n      */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'textBaseline', 'middle');\n\n  /**\n      * set textBaseline property. Default value is 'middle'.\n      * Can be 'top', 'bottom', 'middle', 'alphabetic', 'hanging'\n      * @name textBaseline\n      * @method\n      * @memberof Konva.TextPath.prototype\n      * @param {Number} textBaseline\n      */\n\n  /**\n     * get font style\n     * @name getFontStyle\n     * @method\n     * @memberof Konva.TextPath.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'fontVariant', NORMAL);\n\n  /**\n     * set font variant.  Can be 'normal' or 'small-caps'.  'normal' is the default.\n     * @name setFontVariant\n     * @method\n     * @memberof Konva.TextPath.prototype\n     * @param {String} fontVariant\n     */\n\n  /**\n     * @get font variant\n     * @name getFontVariant\n     * @method\n     * @memberof Konva.TextPath.prototype\n     */\n\n  Konva.Factory.addGetter(Konva.TextPath, 'text', EMPTY_STRING);\n\n  /**\n     * get text\n     * @name getText\n     * @method\n     * @memberof Konva.TextPath.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.TextPath, 'textDecoration', null);\n\n  /**\n      * get/set text decoration of a text.  Can be '' or 'underline'\n      * @name textDecoration\n      * @method\n      * @memberof Konva.Text.prototype\n      * @param {String} textDecoration\n      * @returns {String}\n      * @example\n      * // get text decoration\n      * var textDecoration = text.textDecoration();\n      *\n      * // center text\n      * text.textDecoration('underline');\n      */\n\n  Konva.Collection.mapMethods(Konva.TextPath);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * RegularPolygon constructor.&nbsp; Examples include triangles, squares, pentagons, hexagons, etc.\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Number} config.sides\n     * @param {Number} config.radius\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var hexagon = new Konva.RegularPolygon({\n     *   x: 100,\n     *   y: 200,\n     *   sides: 6,\n     *   radius: 70,\n     *   fill: 'red',\n     *   stroke: 'black',\n     *   strokeWidth: 4\n     * });\n     */\n  Konva.RegularPolygon = function(config) {\n    this.___init(config);\n  };\n\n  Konva.RegularPolygon.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'RegularPolygon';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var sides = this.attrs.sides, radius = this.attrs.radius, n, x, y;\n\n      context.beginPath();\n      context.moveTo(0, 0 - radius);\n\n      for (n = 1; n < sides; n++) {\n        x = radius * Math.sin(n * 2 * Math.PI / sides);\n        y = -1 * radius * Math.cos(n * 2 * Math.PI / sides);\n        context.lineTo(x, y);\n      }\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    getWidth: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.radius() !== width / 2) {\n        this.setRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.radius() !== height / 2) {\n        this.setRadius(height / 2);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.RegularPolygon, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.RegularPolygon, 'radius', 0);\n\n  /**\n     * set radius\n     * @name setRadius\n     * @method\n     * @memberof Konva.RegularPolygon.prototype\n     * @param {Number} radius\n     */\n\n  /**\n     * get radius\n     * @name getRadius\n     * @method\n     * @memberof Konva.RegularPolygon.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.RegularPolygon, 'sides', 0);\n\n  /**\n     * set number of sides\n     * @name setSides\n     * @method\n     * @memberof Konva.RegularPolygon.prototype\n     * @param {int} sides\n     */\n\n  /**\n     * get number of sides\n     * @name getSides\n     * @method\n     * @memberof Konva.RegularPolygon.prototype\n     */\n\n  Konva.Collection.mapMethods(Konva.RegularPolygon);\n})();\n\n(function() {\n  'use strict';\n  /**\n     * Star constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Integer} config.numPoints\n     * @param {Number} config.innerRadius\n     * @param {Number} config.outerRadius\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var star = new Konva.Star({\n     *   x: 100,\n     *   y: 200,\n     *   numPoints: 5,\n     *   innerRadius: 70,\n     *   outerRadius: 70,\n     *   fill: 'red',\n     *   stroke: 'black',\n     *   strokeWidth: 4\n     * });\n     */\n  Konva.Star = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Star.prototype = {\n    _centroid: true,\n    ___init: function(config) {\n      // call super constructor\n      Konva.Shape.call(this, config);\n      this.className = 'Star';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var innerRadius = this.innerRadius(),\n        outerRadius = this.outerRadius(),\n        numPoints = this.numPoints();\n\n      context.beginPath();\n      context.moveTo(0, 0 - outerRadius);\n\n      for (var n = 1; n < numPoints * 2; n++) {\n        var radius = n % 2 === 0 ? outerRadius : innerRadius;\n        var x = radius * Math.sin(n * Math.PI / numPoints);\n        var y = -1 * radius * Math.cos(n * Math.PI / numPoints);\n        context.lineTo(x, y);\n      }\n      context.closePath();\n\n      context.fillStrokeShape(this);\n    },\n    // implements Shape.prototype.getWidth()\n    getWidth: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.getHeight()\n    getHeight: function() {\n      return this.getOuterRadius() * 2;\n    },\n    // implements Shape.prototype.setWidth()\n    setWidth: function(width) {\n      Konva.Node.prototype.setWidth.call(this, width);\n      if (this.outerRadius() !== width / 2) {\n        this.setOuterRadius(width / 2);\n      }\n    },\n    // implements Shape.prototype.setHeight()\n    setHeight: function(height) {\n      Konva.Node.prototype.setHeight.call(this, height);\n      if (this.outerRadius() !== height / 2) {\n        this.setOuterRadius(height / 2);\n      }\n    }\n  };\n  Konva.Util.extend(Konva.Star, Konva.Shape);\n\n  // add getters setters\n  Konva.Factory.addGetterSetter(Konva.Star, 'numPoints', 5);\n\n  /**\n     * set number of points\n     * @name setNumPoints\n     * @method\n     * @memberof Konva.Star.prototype\n     * @param {Integer} points\n     */\n\n  /**\n     * get number of points\n     * @name getNumPoints\n     * @method\n     * @memberof Konva.Star.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Star, 'innerRadius', 0);\n\n  /**\n     * set inner radius\n     * @name setInnerRadius\n     * @method\n     * @memberof Konva.Star.prototype\n     * @param {Number} radius\n     */\n\n  /**\n     * get inner radius\n     * @name getInnerRadius\n     * @method\n     * @memberof Konva.Star.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Star, 'outerRadius', 0);\n\n  /**\n     * set outer radius\n     * @name setOuterRadius\n     * @method\n     * @memberof Konva.Star.prototype\n     * @param {Number} radius\n     */\n\n  /**\n     * get outer radius\n     * @name getOuterRadius\n     * @method\n     * @memberof Konva.Star.prototype\n     */\n\n  Konva.Collection.mapMethods(Konva.Star);\n})();\n\n(function() {\n  'use strict';\n  // constants\n  var ATTR_CHANGE_LIST = [\n    'fontFamily',\n    'fontSize',\n    'fontStyle',\n    'padding',\n    'lineHeight',\n    'text',\n    'width'\n  ],\n    CHANGE_KONVA = 'Change.konva',\n    NONE = 'none',\n    UP = 'up',\n    RIGHT = 'right',\n    DOWN = 'down',\n    LEFT = 'left',\n    LABEL = 'Label',\n    // cached variables\n    attrChangeListLen = ATTR_CHANGE_LIST.length;\n\n  /**\n     * Label constructor.&nbsp; Labels are groups that contain a Text and Tag shape\n     * @constructor\n     * @memberof Konva\n     * @param {Object} config\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * // create label\n     * var label = new Konva.Label({\n     *   x: 100,\n     *   y: 100,\n     *   draggable: true\n     * });\n     *\n     * // add a tag to the label\n     * label.add(new Konva.Tag({\n     *   fill: '#bbb',\n     *   stroke: '#333',\n     *   shadowColor: 'black',\n     *   shadowBlur: 10,\n     *   shadowOffset: [10, 10],\n     *   shadowOpacity: 0.2,\n     *   lineJoin: 'round',\n     *   pointerDirection: 'up',\n     *   pointerWidth: 20,\n     *   pointerHeight: 20,\n     *   cornerRadius: 5\n     * }));\n     *\n     * // add text to the label\n     * label.add(new Konva.Text({\n     *   text: 'Hello World!',\n     *   fontSize: 50,\n     *   lineHeight: 1.2,\n     *   padding: 10,\n     *   fill: 'green'\n     *  }));\n     */\n  Konva.Label = function(config) {\n    this.____init(config);\n  };\n\n  Konva.Label.prototype = {\n    ____init: function(config) {\n      var that = this;\n\n      Konva.Group.call(this, config);\n      this.className = LABEL;\n\n      this.on('add.konva', function(evt) {\n        that._addListeners(evt.child);\n        that._sync();\n      });\n    },\n    /**\n         * get Text shape for the label.  You need to access the Text shape in order to update\n         * the text properties\n         * @name getText\n         * @method\n         * @memberof Konva.Label.prototype\n         */\n    getText: function() {\n      return this.find('Text')[0];\n    },\n    /**\n         * get Tag shape for the label.  You need to access the Tag shape in order to update\n         * the pointer properties and the corner radius\n         * @name getTag\n         * @method\n         * @memberof Konva.Label.prototype\n         */\n    getTag: function() {\n      return this.find('Tag')[0];\n    },\n    _addListeners: function(text) {\n      var that = this, n;\n      var func = function() {\n        that._sync();\n      };\n\n      // update text data for certain attr changes\n      for (n = 0; n < attrChangeListLen; n++) {\n        text.on(ATTR_CHANGE_LIST[n] + CHANGE_KONVA, func);\n      }\n    },\n    getWidth: function() {\n      return this.getText().getWidth();\n    },\n    getHeight: function() {\n      return this.getText().getHeight();\n    },\n    _sync: function() {\n      var text = this.getText(),\n        tag = this.getTag(),\n        width,\n        height,\n        pointerDirection,\n        pointerWidth,\n        x,\n        y,\n        pointerHeight;\n\n      if (text && tag) {\n        width = text.getWidth();\n        height = text.getHeight();\n        pointerDirection = tag.getPointerDirection();\n        pointerWidth = tag.getPointerWidth();\n        pointerHeight = tag.getPointerHeight();\n        x = 0;\n        y = 0;\n\n        switch (pointerDirection) {\n          case UP:\n            x = width / 2;\n            y = -1 * pointerHeight;\n            break;\n          case RIGHT:\n            x = width + pointerWidth;\n            y = height / 2;\n            break;\n          case DOWN:\n            x = width / 2;\n            y = height + pointerHeight;\n            break;\n          case LEFT:\n            x = -1 * pointerWidth;\n            y = height / 2;\n            break;\n        }\n\n        tag.setAttrs({\n          x: -1 * x,\n          y: -1 * y,\n          width: width,\n          height: height\n        });\n\n        text.setAttrs({\n          x: -1 * x,\n          y: -1 * y\n        });\n      }\n    }\n  };\n\n  Konva.Util.extend(Konva.Label, Konva.Group);\n\n  Konva.Collection.mapMethods(Konva.Label);\n\n  /**\n     * Tag constructor.&nbsp; A Tag can be configured\n     *  to have a pointer element that points up, right, down, or left\n     * @constructor\n     * @memberof Konva\n     * @param {Object} config\n     * @param {String} [config.pointerDirection] can be up, right, down, left, or none; the default\n     *  is none.  When a pointer is present, the positioning of the label is relative to the tip of the pointer.\n     * @param {Number} [config.pointerWidth]\n     * @param {Number} [config.pointerHeight]\n     * @param {Number} [config.cornerRadius]\n     */\n  Konva.Tag = function(config) {\n    this.___init(config);\n  };\n\n  Konva.Tag.prototype = {\n    ___init: function(config) {\n      Konva.Shape.call(this, config);\n      this.className = 'Tag';\n      this.sceneFunc(this._sceneFunc);\n    },\n    _sceneFunc: function(context) {\n      var width = this.getWidth(),\n        height = this.getHeight(),\n        pointerDirection = this.getPointerDirection(),\n        pointerWidth = this.getPointerWidth(),\n        pointerHeight = this.getPointerHeight(),\n        cornerRadius = Math.min(this.getCornerRadius(), width / 2, height / 2);\n\n      context.beginPath();\n      if (!cornerRadius) {\n        context.moveTo(0, 0);\n      } else {\n        context.moveTo(cornerRadius, 0);\n      }\n\n      if (pointerDirection === UP) {\n        context.lineTo((width - pointerWidth) / 2, 0);\n        context.lineTo(width / 2, -1 * pointerHeight);\n        context.lineTo((width + pointerWidth) / 2, 0);\n      }\n\n      if (!cornerRadius) {\n        context.lineTo(width, 0);\n      } else {\n        context.lineTo(width - cornerRadius, 0);\n        context.arc(\n          width - cornerRadius,\n          cornerRadius,\n          cornerRadius,\n          Math.PI * 3 / 2,\n          0,\n          false\n        );\n      }\n\n      if (pointerDirection === RIGHT) {\n        context.lineTo(width, (height - pointerHeight) / 2);\n        context.lineTo(width + pointerWidth, height / 2);\n        context.lineTo(width, (height + pointerHeight) / 2);\n      }\n\n      if (!cornerRadius) {\n        context.lineTo(width, height);\n      } else {\n        context.lineTo(width, height - cornerRadius);\n        context.arc(\n          width - cornerRadius,\n          height - cornerRadius,\n          cornerRadius,\n          0,\n          Math.PI / 2,\n          false\n        );\n      }\n\n      if (pointerDirection === DOWN) {\n        context.lineTo((width + pointerWidth) / 2, height);\n        context.lineTo(width / 2, height + pointerHeight);\n        context.lineTo((width - pointerWidth) / 2, height);\n      }\n\n      if (!cornerRadius) {\n        context.lineTo(0, height);\n      } else {\n        context.lineTo(cornerRadius, height);\n        context.arc(\n          cornerRadius,\n          height - cornerRadius,\n          cornerRadius,\n          Math.PI / 2,\n          Math.PI,\n          false\n        );\n      }\n\n      if (pointerDirection === LEFT) {\n        context.lineTo(0, (height + pointerHeight) / 2);\n        context.lineTo(-1 * pointerWidth, height / 2);\n        context.lineTo(0, (height - pointerHeight) / 2);\n      }\n\n      if (cornerRadius) {\n        context.lineTo(0, cornerRadius);\n        context.arc(\n          cornerRadius,\n          cornerRadius,\n          cornerRadius,\n          Math.PI,\n          Math.PI * 3 / 2,\n          false\n        );\n      }\n\n      context.closePath();\n      context.fillStrokeShape(this);\n    },\n    getSelfRect: function() {\n      var x = 0,\n        y = 0,\n        pointerWidth = this.getPointerWidth(),\n        pointerHeight = this.getPointerHeight(),\n        direction = this.pointerDirection(),\n        width = this.getWidth(),\n        height = this.getHeight();\n\n      if (direction === UP) {\n        y -= pointerHeight;\n        height += pointerHeight;\n      } else if (direction === DOWN) {\n        height += pointerHeight;\n      } else if (direction === LEFT) {\n        // ARGH!!! I have no idea why should I used magic 1.5!!!!!!!!!\n        x -= pointerWidth * 1.5;\n        width += pointerWidth;\n      } else if (direction === RIGHT) {\n        width += pointerWidth * 1.5;\n      }\n      return {\n        x: x,\n        y: y,\n        width: width,\n        height: height\n      };\n    }\n  };\n\n  Konva.Util.extend(Konva.Tag, Konva.Shape);\n  Konva.Factory.addGetterSetter(Konva.Tag, 'pointerDirection', NONE);\n\n  /**\n     * set pointer Direction\n     * @name setPointerDirection\n     * @method\n     * @memberof Konva.Tag.prototype\n     * @param {String} pointerDirection can be up, right, down, left, or none.  The\n     *  default is none\n     */\n\n  /**\n     * get pointer Direction\n     * @name getPointerDirection\n     * @method\n     * @memberof Konva.Tag.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Tag, 'pointerWidth', 0);\n\n  /**\n     * set pointer width\n     * @name setPointerWidth\n     * @method\n     * @memberof Konva.Tag.prototype\n     * @param {Number} pointerWidth\n     */\n\n  /**\n     * get pointer width\n     * @name getPointerWidth\n     * @method\n     * @memberof Konva.Tag.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Tag, 'pointerHeight', 0);\n\n  /**\n     * set pointer height\n     * @name setPointerHeight\n     * @method\n     * @memberof Konva.Tag.prototype\n     * @param {Number} pointerHeight\n     */\n\n  /**\n     * get pointer height\n     * @name getPointerHeight\n     * @method\n     * @memberof Konva.Tag.prototype\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Tag, 'cornerRadius', 0);\n\n  /**\n     * set corner radius\n     * @name setCornerRadius\n     * @method\n     * @memberof Konva.Tag.prototype\n     * @param {Number} corner radius\n     */\n\n  /**\n     * get corner radius\n     * @name getCornerRadius\n     * @method\n     * @memberof Konva.Tag.prototype\n     */\n\n  Konva.Collection.mapMethods(Konva.Tag);\n})();\n\n(function(Konva) {\n  'use strict';\n  /**\n     * Arrow constructor\n     * @constructor\n     * @memberof Konva\n     * @augments Konva.Shape\n     * @param {Object} config\n     * @param {Array} config.points\n     * @param {Number} [config.tension] Higher values will result in a more curvy line.  A value of 0 will result in no interpolation.\n     *   The default is 0\n     * @param {Number} config.pointerLength\n     * @param {Number} config.pointerWidth\n     * @param {String} [config.fill] fill color\n     * @param {Image} [config.fillPatternImage] fill pattern image\n     * @param {Number} [config.fillPatternX]\n     * @param {Number} [config.fillPatternY]\n     * @param {Object} [config.fillPatternOffset] object with x and y component\n     * @param {Number} [config.fillPatternOffsetX] \n     * @param {Number} [config.fillPatternOffsetY] \n     * @param {Object} [config.fillPatternScale] object with x and y component\n     * @param {Number} [config.fillPatternScaleX]\n     * @param {Number} [config.fillPatternScaleY]\n     * @param {Number} [config.fillPatternRotation]\n     * @param {String} [config.fillPatternRepeat] can be \"repeat\", \"repeat-x\", \"repeat-y\", or \"no-repeat\".  The default is \"no-repeat\"\n     * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientStartPointX]\n     * @param {Number} [config.fillLinearGradientStartPointY]\n     * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillLinearGradientEndPointX]\n     * @param {Number} [config.fillLinearGradientEndPointY]\n     * @param {Array} [config.fillLinearGradientColorStops] array of color stops\n     * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientStartPointX]\n     * @param {Number} [config.fillRadialGradientStartPointY]\n     * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component\n     * @param {Number} [config.fillRadialGradientEndPointX] \n     * @param {Number} [config.fillRadialGradientEndPointY] \n     * @param {Number} [config.fillRadialGradientStartRadius]\n     * @param {Number} [config.fillRadialGradientEndRadius]\n     * @param {Array} [config.fillRadialGradientColorStops] array of color stops\n     * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill.  The default value is true\n     * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern.  The default value is color.  The fillPriority property makes it really easy to toggle between different fill types.  For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration\n     * @param {String} [config.stroke] stroke color\n     * @param {Number} [config.strokeWidth] stroke width\n     * @param {Boolean} [config.strokeHitEnabled] flag which enables or disables stroke hit region.  The default is true\n     * @param {Boolean} [config.perfectDrawEnabled] flag which enables or disables using buffer canvas.  The default is true\n     * @param {Boolean} [config.shadowForStrokeEnabled] flag which enables or disables shasow for stroke.  The default is true\n     * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale.  The default is true\n     * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke.  The default value is true\n     * @param {String} [config.lineJoin] can be miter, round, or bevel.  The default\n     *  is miter\n     * @param {String} [config.lineCap] can be butt, round, or sqare.  The default\n     *  is butt\n     * @param {String} [config.shadowColor]\n     * @param {Number} [config.shadowBlur]\n     * @param {Object} [config.shadowOffset] object with x and y component\n     * @param {Number} [config.shadowOffsetX]\n     * @param {Number} [config.shadowOffsetY]\n     * @param {Number} [config.shadowOpacity] shadow opacity.  Can be any real number\n     *  between 0 and 1\n     * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow.  The default value is true\n     * @param {Array} [config.dash]\n     * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray.  The default value is true\n     * @param {Number} [config.x]\n     * @param {Number} [config.y]\n     * @param {Number} [config.width]\n     * @param {Number} [config.height]\n     * @param {Boolean} [config.visible]\n     * @param {Boolean} [config.listening] whether or not the node is listening for events\n     * @param {String} [config.id] unique id\n     * @param {String} [config.name] non-unique name\n     * @param {Number} [config.opacity] determines node opacity.  Can be any number between 0 and 1\n     * @param {Object} [config.scale] set scale\n     * @param {Number} [config.scaleX] set scale x\n     * @param {Number} [config.scaleY] set scale y\n     * @param {Number} [config.rotation] rotation in degrees\n     * @param {Object} [config.offset] offset from center point and rotation point\n     * @param {Number} [config.offsetX] set offset x\n     * @param {Number} [config.offsetY] set offset y\n     * @param {Boolean} [config.draggable] makes the node draggable.  When stages are draggable, you can drag and drop\n     *  the entire stage by dragging any portion of the stage\n     * @param {Number} [config.dragDistance]\n     * @param {Function} [config.dragBoundFunc]\n     * @example\n     * var line = new Konva.Line({\n     *   points: [73, 70, 340, 23, 450, 60, 500, 20],\n     *   stroke: 'red',\n     *   tension: 1,\n     *   pointerLength : 10,\n     *   pointerWidth : 12\n     * });\n     */\n  Konva.Arrow = function(config) {\n    this.____init(config);\n  };\n\n  Konva.Arrow.prototype = {\n    ____init: function(config) {\n      // call super constructor\n      Konva.Line.call(this, config);\n      this.className = 'Arrow';\n    },\n    _sceneFunc: function(ctx) {\n      Konva.Line.prototype._sceneFunc.apply(this, arguments);\n      var PI2 = Math.PI * 2;\n      var points = this.points();\n      var n = points.length;\n      var dx = points[n - 2] - points[n - 4];\n      var dy = points[n - 1] - points[n - 3];\n      var radians = (Math.atan2(dy, dx) + PI2) % PI2;\n      var length = this.pointerLength();\n      var width = this.pointerWidth();\n\n      ctx.save();\n      ctx.beginPath();\n      ctx.translate(points[n - 2], points[n - 1]);\n      ctx.rotate(radians);\n      ctx.moveTo(0, 0);\n      ctx.lineTo(-length, width / 2);\n      ctx.lineTo(-length, -width / 2);\n      ctx.closePath();\n      ctx.restore();\n\n      if (this.pointerAtBeginning()) {\n        ctx.save();\n        ctx.translate(points[0], points[1]);\n        dx = points[2] - points[0];\n        dy = points[3] - points[1];\n        ctx.rotate((Math.atan2(-dy, -dx) + PI2) % PI2);\n        ctx.moveTo(0, 0);\n        ctx.lineTo(-length, width / 2);\n        ctx.lineTo(-length, -width / 2);\n        ctx.closePath();\n        ctx.restore();\n      }\n      ctx.fillStrokeShape(this);\n    }\n  };\n\n  Konva.Util.extend(Konva.Arrow, Konva.Line);\n  /**\n     * get/set pointerLength\n     * @name pointerLength\n     * @method\n     * @memberof Konva.Arrow.prototype\n     * @param {Number} Length of pointer of arrow.\n     *   The default is 10.\n     * @returns {Number}\n     * @example\n     * // get tension\n     * var pointerLength = line.pointerLength();\n     *\n     * // set tension\n     * line.pointerLength(15);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arrow, 'pointerLength', 10);\n  /**\n     * get/set pointerWidth\n     * @name pointerWidth\n     * @method\n     * @memberof Konva.Arrow.prototype\n     * @param {Number} Width of pointer of arrow.\n     *   The default is 10.\n     * @returns {Number}\n     * @example\n     * // get tension\n     * var pointerWidth = line.pointerWidth();\n     *\n     * // set tension\n     * line.pointerWidth(15);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arrow, 'pointerWidth', 10);\n  /**\n     * get/set pointerAtBeginning\n     * @name pointerAtBeginning\n     * @method\n     * @memberof Konva.Arrow.prototype\n     * @param {Number} Should pointer displayed at beginning of arrow.\n     *   The default is false.\n     * @returns {Boolean}\n     * @example\n     * // get tension\n     * var pointerAtBeginning = line.pointerAtBeginning();\n     *\n     * // set tension\n     * line.pointerAtBeginning(true);\n     */\n\n  Konva.Factory.addGetterSetter(Konva.Arrow, 'pointerAtBeginning', false);\n  Konva.Collection.mapMethods(Konva.Arrow);\n})(Konva);\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _from = require(\"../core-js/array/from\");\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  } else {\n    return (0, _from2.default)(arr);\n  }\n};","\"use strict\";\n\nexports.__esModule = true;\n\nvar _getPrototypeOf = require(\"../core-js/object/get-prototype-of\");\n\nvar _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);\n\nvar _getOwnPropertyDescriptor = require(\"../core-js/object/get-own-property-descriptor\");\n\nvar _getOwnPropertyDescriptor2 = _interopRequireDefault(_getOwnPropertyDescriptor);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function get(object, property, receiver) {\n  if (object === null) object = Function.prototype;\n  var desc = (0, _getOwnPropertyDescriptor2.default)(object, property);\n\n  if (desc === undefined) {\n    var parent = (0, _getPrototypeOf2.default)(object);\n\n    if (parent === null) {\n      return undefined;\n    } else {\n      return get(parent, property, receiver);\n    }\n  } else if (\"value\" in desc) {\n    return desc.value;\n  } else {\n    var getter = desc.get;\n\n    if (getter === undefined) {\n      return undefined;\n    }\n\n    return getter.call(receiver);\n  }\n};","//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n  var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n\n  if (ret !== void 0) {\n    return !!ret;\n  }\n\n  if (objA === objB) {\n    return true;\n  }\n\n  if (typeof objA !== \"object\" || !objA || typeof objB !== \"object\" || !objB) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n  // Test for A's keys different from B.\n  for (var idx = 0; idx < keysA.length; idx++) {\n    var key = keysA[idx];\n\n    if (!bHasOwnProperty(key)) {\n      return false;\n    }\n\n    var valueA = objA[key];\n    var valueB = objB[key];\n\n    ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n\n    if (ret === false || (ret === void 0 && valueA !== valueB)) {\n      return false;\n    }\n  }\n\n  return true;\n};\n","require('./_wks-define')('asyncIterator');\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n","module.exports = { \"default\": require(\"core-js/library/fn/object/assign\"), __esModule: true };","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements utility methods used by the rest of the VexFlow\n// codebase.\n//\n\n/* eslint max-classes-per-file: \"off\" */\n\nconst Vex = () => { };\n\n// Default log function sends all arguments to console.\nVex.L = (block, args) => {\n  if (!args) return;\n  const line = Array.prototype.slice.call(args).join(' ');\n  window.console.log(block + ': ' + line);\n};\n\nVex.MakeException = (name) => {\n  const exception = class extends Error {\n    constructor(message, data) {\n      super(message);\n      this.name = name;\n      this.message = message;\n      this.data = data;\n    }\n  };\n\n  return exception;\n};\n\n// Default runtime exception.\nclass RuntimeError {\n  constructor(code, message) {\n    this.code = code;\n    this.message = message;\n  }\n\n  toString() {\n    return '[RuntimeError] ' + this.code + ':' + this.message;\n  }\n}\n\n// Shortcut method for `RuntimeError`.\nVex.RuntimeError = RuntimeError;\nVex.RERR = Vex.RuntimeError;\n\n// Merge `destination` hash with `source` hash, overwriting like keys\n// in `source` if necessary.\nVex.Merge = (destination, source) => {\n  for (const property in source) { // eslint-disable-line guard-for-in\n    destination[property] = source[property];\n  }\n  return destination;\n};\n\n// DEPRECATED. Use `Math.*`.\nVex.Min = Math.min;\nVex.Max = Math.max;\nVex.forEach = (a, fn) => {\n  for (let i = 0; i < a.length; i++) {\n    fn(a[i], i);\n  }\n};\n\n// Round number to nearest fractional value (`.5`, `.25`, etc.)\nVex.RoundN = (x, n) =>\n  (x % n) >= (n / 2)\n    ? parseInt(x / n, 10) * n + n\n    : parseInt(x / n, 10) * n;\n\n// Locate the mid point between stave lines. Returns a fractional line if a space.\nVex.MidLine = (a, b) => {\n  let mid_line = b + (a - b) / 2;\n  if (mid_line % 2 > 0) {\n    mid_line = Vex.RoundN(mid_line * 10, 5) / 10;\n  }\n  return mid_line;\n};\n\n// Take `arr` and return a new list consisting of the sorted, unique,\n// contents of arr. Does not modify `arr`.\nVex.SortAndUnique = (arr, cmp, eq) => {\n  if (arr.length > 1) {\n    const newArr = [];\n    let last;\n    arr.sort(cmp);\n\n    for (let i = 0; i < arr.length; ++i) {\n      if (i === 0 || !eq(arr[i], last)) {\n        newArr.push(arr[i]);\n      }\n      last = arr[i];\n    }\n\n    return newArr;\n  } else {\n    return arr;\n  }\n};\n\n// Check if array `a` contains `obj`.\nVex.Contains = (a, obj) => {\n  let i = a.length;\n  while (i--) {\n    if (a[i] === obj) {\n      return true;\n    }\n  }\n  return false;\n};\n\n// Get the 2D Canvas context from DOM element `canvas_sel`.\nVex.getCanvasContext = canvas_sel => {\n  if (!canvas_sel) {\n    throw new Vex.RERR('BadArgument', 'Invalid canvas selector: ' + canvas_sel);\n  }\n\n  const canvas = document.getElementById(canvas_sel);\n  if (!(canvas && canvas.getContext)) {\n    throw new Vex.RERR(\n      'UnsupportedBrowserError', 'This browser does not support HTML5 Canvas'\n    );\n  }\n\n  return canvas.getContext('2d');\n};\n\n// Draw a tiny dot marker on the specified canvas. A great debugging aid.\n//\n// `ctx`: Canvas context.\n// `x`, `y`: Dot coordinates.\nVex.drawDot = (ctx, x, y, color = '#55') => {\n  ctx.save();\n  ctx.setFillStyle(color);\n\n  // draw a circle\n  ctx.beginPath();\n  ctx.arc(x, y, 3, 0, Math.PI * 2, true);\n  ctx.closePath();\n  ctx.fill();\n  ctx.restore();\n};\n\n// Benchmark. Run function `f` once and report time elapsed shifted by `s` milliseconds.\nVex.BM = (s, f) => {\n  const start_time = new Date().getTime();\n  f();\n  const elapsed = new Date().getTime() - start_time;\n  Vex.L(s + elapsed + 'ms');\n};\n\n// Get stack trace.\nVex.StackTrace = () => {\n  const err = new Error();\n  return err.stack;\n};\n\n// Dump warning to console.\nVex.W = (...args) => {\n  const line = args.join(' ');\n  window.console.log('Warning: ', line, Vex.StackTrace());\n};\n\n// Used by various classes (e.g., SVGContext) to provide a\n// unique prefix to element names (or other keys in shared namespaces).\nVex.Prefix = text => Vex.Prefix.prefix + text;\nVex.Prefix.prefix = 'vf-';\n\nexport { Vex };\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Fraction class that represents a rational number\n//\n// @author zz85\n// @author incompleteopus (modifications)\n\n/* eslint-disable no-underscore-dangle */\n\nimport { Vex } from './vex';\nexport class Fraction {\n  /**\n   * GCD: Find greatest common divisor using Euclidean algorithm\n   */\n  static GCD(a, b) {\n    if (typeof a !== 'number' || typeof b !== 'number') {\n      throw new Vex.RERR('BadArgument', `Invalid numbers: ${a}, ${b}`);\n    }\n\n    let t;\n\n    while (b !== 0) {\n      t = b;\n      b = a % b;\n      a = t;\n    }\n\n    return a;\n  }\n\n  /**\n   * LCM: Lowest common multiple\n   */\n  static LCM(a, b) {\n    return ((a * b) / Fraction.GCD(a, b));\n  }\n\n  /**\n   * LCMM: Lowest common multiple for more than two numbers\n   */\n  static LCMM(args) {\n    if (args.length === 0) {\n      return 0;\n    } else if (args.length === 1) {\n      return args[0];\n    } else if (args.length === 2) {\n      return Fraction.LCM(args[0], args[1]);\n    } else {\n      const arg0 = args[0];\n      args.shift();\n      return Fraction.LCM(arg0, Fraction.LCMM(args));\n    }\n  }\n\n  constructor(numerator, denominator) {\n    this.set(numerator, denominator);\n  }\n  set(numerator, denominator) {\n    this.numerator = numerator === undefined ? 1 : numerator;\n    this.denominator = denominator === undefined ? 1 : denominator;\n    return this;\n  }\n  value() {\n    return this.numerator / this.denominator;\n  }\n  simplify() {\n    let u = this.numerator;\n    let d = this.denominator;\n\n    const gcd = Fraction.GCD(u, d);\n    u /= gcd;\n    d /= gcd;\n\n    if (d < 0) {\n      d = -d;\n      u = -u;\n    }\n    return this.set(u, d);\n  }\n  add(param1, param2) {\n    let otherNumerator;\n    let otherDenominator;\n\n    if (param1 instanceof Fraction) {\n      otherNumerator = param1.numerator;\n      otherDenominator = param1.denominator;\n    } else {\n      if (param1 !== undefined) {\n        otherNumerator = param1;\n      } else {\n        otherNumerator = 0;\n      }\n\n      if (param2 !== undefined) {\n        otherDenominator = param2;\n      } else {\n        otherDenominator = 1;\n      }\n    }\n\n    const lcm = Fraction.LCM(this.denominator, otherDenominator);\n    const a = lcm / this.denominator;\n    const b = lcm / otherDenominator;\n\n    const u = this.numerator * a + otherNumerator * b;\n    return this.set(u, lcm);\n  }\n  subtract(param1, param2) {\n    let otherNumerator;\n    let otherDenominator;\n\n    if (param1 instanceof Fraction) {\n      otherNumerator = param1.numerator;\n      otherDenominator = param1.denominator;\n    } else {\n      if (param1 !== undefined) {\n        otherNumerator = param1;\n      } else {\n        otherNumerator = 0;\n      }\n\n      if (param2 !== undefined) {\n        otherDenominator = param2;\n      } else {\n        otherDenominator = 1;\n      }\n    }\n\n    const lcm = Fraction.LCM(this.denominator, otherDenominator);\n    const a = lcm / this.denominator;\n    const b = lcm / otherDenominator;\n\n    const u = this.numerator * a - otherNumerator * b;\n    return this.set(u, lcm);\n  }\n  multiply(param1, param2) {\n    let otherNumerator;\n    let otherDenominator;\n\n    if (param1 instanceof Fraction) {\n      otherNumerator = param1.numerator;\n      otherDenominator = param1.denominator;\n    } else {\n      if (param1 !== undefined) {\n        otherNumerator = param1;\n      } else {\n        otherNumerator = 1;\n      }\n\n      if (param2 !== undefined) {\n        otherDenominator = param2;\n      } else {\n        otherDenominator = 1;\n      }\n    }\n\n    return this.set(this.numerator * otherNumerator, this.denominator * otherDenominator);\n  }\n  divide(param1, param2) {\n    let otherNumerator;\n    let otherDenominator;\n\n    if (param1 instanceof Fraction) {\n      otherNumerator = param1.numerator;\n      otherDenominator = param1.denominator;\n    } else {\n      if (param1 !== undefined) {\n        otherNumerator = param1;\n      } else {\n        otherNumerator = 1;\n      }\n\n      if (param2 !== undefined) {\n        otherDenominator = param2;\n      } else {\n        otherDenominator = 1;\n      }\n    }\n\n    return this.set(this.numerator * otherDenominator, this.denominator * otherNumerator);\n  }\n\n  // Simplifies both sides and checks if they are equal.\n  equals(compare) {\n    const a = Fraction.__compareA.copy(compare).simplify();\n    const b = Fraction.__compareB.copy(this).simplify();\n\n    return (a.numerator === b.numerator) && (a.denominator === b.denominator);\n  }\n\n  // Greater than operator.\n  greaterThan(compare) {\n    const a = Fraction.__compareB.copy(this);\n    a.subtract(compare);\n    return (a.numerator > 0);\n  }\n\n  // Greater than or equals operator.\n  greaterThanEquals(compare) {\n    const a = Fraction.__compareB.copy(this);\n    a.subtract(compare);\n    return (a.numerator >= 0);\n  }\n\n  // Less than operator.\n  lessThan(compare) {\n    return !(this.greaterThanEquals(compare));\n  }\n\n  // Less than or equals operator.\n  lessThanEquals(compare) {\n    return !(this.greaterThan(compare));\n  }\n\n  // Creates a new copy with this current values.\n  clone() {\n    return new Fraction(this.numerator, this.denominator);\n  }\n\n  // Copies value of another Fraction into itself.\n  copy(copy) {\n    if (typeof copy === 'number') {\n      return this.set(copy || 0, 1);\n    }\n    return this.set(copy.numerator, copy.denominator);\n  }\n\n  // Returns the integer component eg. (4/2) == 2\n  quotient() {\n    return Math.floor(this.numerator / this.denominator);\n  }\n\n  // Returns the fraction component when reduced to a mixed number\n  fraction() {\n    return this.numerator % this.denominator;\n  }\n\n  // Returns the absolute value\n  abs() {\n    this.denominator = Math.abs(this.denominator);\n    this.numerator = Math.abs(this.numerator);\n    return this;\n  }\n\n  // Returns a raw string representation\n  toString() {\n    return this.numerator + '/' + this.denominator;\n  }\n\n  // Returns a simplified string respresentation\n  toSimplifiedString() {\n    return Fraction.__tmp.copy(this).simplify().toString();\n  }\n\n  // Returns string representation in mixed form\n  toMixedString() {\n    let s = '';\n    const q = this.quotient();\n    const f = Fraction.__tmp.copy(this);\n\n    if (q < 0) {\n      f.abs().fraction();\n    } else {\n      f.fraction();\n    }\n\n    if (q !== 0) {\n      s += q;\n\n      if (f.numerator !== 0) {\n        s += ' ' + f.toSimplifiedString();\n      }\n    } else {\n      if (f.numerator === 0) {\n        s = '0';\n      } else {\n        s = f.toSimplifiedString();\n      }\n    }\n\n    return s;\n  }\n\n  // Parses a fraction string\n  parse(str) {\n    const i = str.split('/');\n    const n = parseInt(i[0], 10);\n    const d = (i[1]) ? parseInt(i[1], 10) : 1;\n\n    return this.set(n, d);\n  }\n}\n\n// Temporary cached objects\nFraction.__compareA = new Fraction();\nFraction.__compareB = new Fraction();\nFraction.__tmp = new Fraction();\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a registry for VexFlow elements. It allows users\n// to track, query, and manage some subset of generated elements, and\n// dynamically get and set attributes.\n//\n// There are two ways to regiser with a registry:\n//\n// 1) Explicitly call `element.register(registry)`, or,\n// 2) Call `Registry.enableDefaultRegistry(registry)` when ready, and all future\n//    elements will automatically register with it.\n//\n// Once an element is registered, selected attributes are tracked and indexed by\n// the registry. This allows fast look up of elements by attributes like id, type,\n// and class.\n\nimport { Vex } from './vex';\n\nexport const X = Vex.MakeException('RegistryError');\n\nfunction setIndexValue(index, name, value, id, elem) {\n  if (!index[name][value]) index[name][value] = {};\n  index[name][value][id] = elem;\n}\n\nexport class Registry {\n  static get INDEXES() { return ['type']; }\n\n  constructor() {\n    this.clear();\n  }\n\n  // If you call `enableDefaultRegistry`, any new elements will auto-register with\n  // the provided registry as soon as they're constructed.\n  static enableDefaultRegistry(registry) {\n    Registry.defaultRegistry = registry;\n  }\n\n  static getDefaultRegistry() {\n    return Registry.defaultRegistry;\n  }\n\n  static disableDefaultRegistry() {\n    Registry.defaultRegistry = null;\n  }\n\n  clear() {\n    // Indexes are represented as maps of maps (of maps). This allows\n    // for both multi-labeling (e.g., an element can have multiple classes)\n    // and efficient lookup.\n    this.index = {\n      id: {},\n      type: {},\n      class: {},\n    };\n    return this;\n  }\n\n  // Updates the indexes for element 'id'. If an element's attribute changes\n  // from A -> B, make sure to remove the element from A.\n  updateIndex({ id, name, value, oldValue }) {\n    const elem = this.getElementById(id);\n    if (oldValue !== null && this.index[name][oldValue]) {\n      delete this.index[name][oldValue][id];\n    }\n    if (value !== null) {\n      setIndexValue(this.index, name, value, elem.getAttribute('id'), elem);\n    }\n  }\n\n  // Register element `elem` with this registry. This adds the element to its index and watches\n  // it for attribute changes.\n  register(elem, id) {\n    id = id || elem.getAttribute('id');\n\n    if (!id) {\n      throw new X('Can\\'t add element without `id` attribute to registry', elem);\n    }\n\n    // Manually add id to index, then update other indexes.\n    elem.setAttribute('id', id);\n    setIndexValue(this.index, 'id', id, id, elem);\n    Registry.INDEXES.forEach(name => {\n      this.updateIndex({ id, name, value: elem.getAttribute(name), oldValue: null });\n    });\n    elem.onRegister(this);\n    return this;\n  }\n\n  getElementById(id) {\n    return this.index.id[id] ? this.index.id[id][id] : null;\n  }\n\n  getElementsByAttribute(attrName, value) {\n    const index = this.index[attrName];\n    if (index && index[value]) {\n      return Object.keys(index[value]).map(i => index[value][i]);\n    } else {\n      return [];\n    }\n  }\n\n  getElementsByType(type) { return this.getElementsByAttribute('type', type); }\n  getElementsByClass(className) { return this.getElementsByAttribute('class', className); }\n\n  // This is called by the element when an attribute value changes. If an indexed\n  // attribute changes, then update the local index.\n  onUpdate({ id, name, value, oldValue }) {\n    function includes(array, value) {\n      return array.filter(x => x === value).length > 0;\n    }\n\n    if (!includes(Registry.INDEXES.concat(['id', 'class']), name)) return this;\n    this.updateIndex({ id, name, value, oldValue });\n    return this;\n  }\n}\n\nRegistry.defaultRegistry = null;\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a generic base class for VexFlow, with implementations\n// of general functions and properties that can be inherited by all VexFlow elements.\n\nimport { Vex } from './vex';\nimport { Registry } from './registry';\n\nexport class Element {\n  static newID() { return 'auto' + (Element.ID++); }\n\n  constructor({ type } = {}) {\n    this.attrs = {\n      id: Element.newID(),\n      el: null,\n      type: type || 'Base',\n      classes: {},\n    };\n\n    this.boundingBox = null;\n    this.context = null;\n    this.rendered = false;\n\n    // If a default registry exist, then register with it right away.\n    if (Registry.getDefaultRegistry()) {\n      Registry.getDefaultRegistry().register(this);\n    }\n  }\n\n  // set the draw style of a stemmable note:\n  setStyle(style) { this.style = style; return this; }\n  getStyle() { return this.style; }\n\n  // Apply current style to Canvas `context`\n  applyStyle(context = this.context, style = this.getStyle()) {\n    if (!style) return this;\n\n    context.save();\n    if (style.shadowColor) context.setShadowColor(style.shadowColor);\n    if (style.shadowBlur) context.setShadowBlur(style.shadowBlur);\n    if (style.fillStyle) context.setFillStyle(style.fillStyle);\n    if (style.strokeStyle) context.setStrokeStyle(style.strokeStyle);\n    if (style.lineWidth) context.setLineWidth(style.lineWidth);\n    return this;\n  }\n\n  restoreStyle(context = this.context, style = this.getStyle()) {\n    if (!style) return this;\n    context.restore();\n    return this;\n  }\n\n  // draw with style of an element.\n  drawWithStyle() {\n    this.checkContext();\n    this.applyStyle();\n    this.draw();\n    this.restoreStyle();\n  }\n\n  // An element can have multiple class labels.\n  hasClass(className) { return (this.attrs.classes[className] === true); }\n  addClass(className) {\n    this.attrs.classes[className] = true;\n    if (this.registry) {\n      this.registry.onUpdate({\n        id: this.getAttribute('id'),\n        name: 'class',\n        value: className,\n        oldValue: null,\n      });\n    }\n    return this;\n  }\n\n  removeClass(className) {\n    delete this.attrs.classes[className];\n    if (this.registry) {\n      this.registry.onUpdate({\n        id: this.getAttribute('id'),\n        name: 'class',\n        value: null,\n        oldValue: className,\n      });\n    }\n    return this;\n  }\n\n  // This is called by the registry after the element is registered.\n  onRegister(registry) { this.registry = registry; return this; }\n  isRendered() { return this.rendered; }\n  setRendered(rendered = true) { this.rendered = rendered; return this; }\n\n  getAttributes() { return this.attrs; }\n  getAttribute(name) { return this.attrs[name]; }\n  setAttribute(name, value) {\n    const id = this.attrs.id;\n    const oldValue = this.attrs[name];\n    this.attrs[name] = value;\n    if (this.registry) {\n      // Register with old id to support id changes.\n      this.registry.onUpdate({ id, name, value, oldValue });\n    }\n    return this;\n  }\n\n  getContext() { return this.context; }\n  setContext(context) { this.context = context; return this; }\n  getBoundingBox() { return this.boundingBox; }\n\n  // Validators\n  checkContext() {\n    if (!this.context) {\n      throw new Vex.RERR('NoContext', 'No rendering context attached to instance');\n    }\n    return this.context;\n  }\n}\n\nElement.ID = 1000;\n","// ## Description\n//\n// Object which computes metrics for a bounding box by continuously\n// taking canvas path commands\n\n// Warning: This file is merely a crutch to get bounding box information without\n// explicit metadata. This is likely to get deprecated following SMuFL support.\n//\n// taken from: https://github.com/gabelerner/canvg/blob/860e418aca67b9a41e858a223d74d375793ec364/ca\n// nvg.js#L449\n\nexport class BoundingBoxComputation {\n  constructor(x1, y1, x2, y2) { // pass in initial points if you want\n    this.x1 = Number.NaN;\n    this.y1 = Number.NaN;\n    this.x2 = Number.NaN;\n    this.y2 = Number.NaN;\n\n    this.addPoint(x1, y1);\n    this.addPoint(x2, y2);\n  }\n\n  width() {\n    return this.x2 - this.x1;\n  }\n\n  height() {\n    return this.y2 - this.y1;\n  }\n\n  addPoint(x, y) {\n    if (x != null) {\n      if (isNaN(this.x1) || isNaN(this.x2)) {\n        this.x1 = x;\n        this.x2 = x;\n      }\n      if (x < this.x1) this.x1 = x;\n      if (x > this.x2) this.x2 = x;\n    }\n\n    if (y != null) {\n      if (isNaN(this.y1) || isNaN(this.y2)) {\n        this.y1 = y;\n        this.y2 = y;\n      }\n      if (y < this.y1) this.y1 = y;\n      if (y > this.y2) this.y2 = y;\n    }\n  }\n\n  addX(x) {\n    this.addPoint(x, null);\n  }\n\n  addY(y) {\n    this.addPoint(null, y);\n  }\n\n  addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n    const cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n    const cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n    const cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n    const cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n    this.addBezierCurve(p0x, p0y, cp1x, cp1y, cp2x, cp2y, p2x, p2y);\n  }\n\n  addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n    // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n    const p0 = [p0x, p0y];\n    const p1 = [p1x, p1y];\n    const p2 = [p2x, p2y];\n    const p3 = [p3x, p3y];\n    let i;\n\n    this.addPoint(p0[0], p0[1]);\n    this.addPoint(p3[0], p3[1]);\n\n    const f = (t, i) => Math.pow(1 - t, 3) * p0[i] +\n      3 * Math.pow(1 - t, 2) * t * p1[i] +\n      3 * (1 - t) * Math.pow(t, 2) * p2[i] +\n      Math.pow(t, 3) * p3[i];\n\n    for (i = 0; i <= 1; i++) {\n      const b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n      const a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n      const c = 3 * p1[i] - 3 * p0[i];\n\n      if (a === 0) {\n        if (b === 0) continue;\n        const t = -c / b;\n        if (0 < t && t < 1) {\n          if (i === 0) this.addX(f(t, i));\n          if (i === 1) this.addY(f(t, i));\n        }\n        continue;\n      }\n\n      const b2ac = Math.pow(b, 2) - 4 * c * a;\n      if (b2ac < 0) continue;\n      const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n      if (0 < t1 && t1 < 1) {\n        if (i === 0) this.addX(f(t1, i));\n        if (i === 1) this.addY(f(t1, i));\n      }\n      const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n      if (0 < t2 && t2 < 1) {\n        if (i === 0) this.addX(f(t2, i));\n        if (i === 1) this.addY(f(t2, i));\n      }\n    }\n  }\n}\n","// Vex Music Notation\n// Mohit Muthanna <mohit@muthanna.com>\n//\n// Copyright Mohit Muthanna 2010\n\n// Bounding boxes for interactive notation\n\nexport class BoundingBox {\n  static copy(that) {\n    return new BoundingBox(that.x, that.y, that.w, that.h);\n  }\n\n  constructor(x, y, w, h) {\n    this.x = x;\n    this.y = y;\n    this.w = w;\n    this.h = h;\n  }\n  getX() { return this.x; }\n  getY() { return this.y; }\n  getW() { return this.w; }\n  getH() { return this.h; }\n  setX(x) { this.x = x; return this; }\n  setY(y) { this.y = y; return this; }\n  setW(w) { this.w = w; return this; }\n  setH(h) { this.h = h; return this; }\n  move(x, y) { this.x += x; this.y += y; }\n  clone() { return BoundingBox.copy(this); }\n\n  // Merge my box with given box. Creates a bigger bounding box unless\n  // the given box is contained in this one.\n  mergeWith(boundingBox, ctx) {\n    const that = boundingBox;\n\n    const new_x = this.x < that.x ? this.x : that.x;\n    const new_y = this.y < that.y ? this.y : that.y;\n    const new_w = Math.max(this.x + this.w, that.x + that.w) - new_x;\n    const new_h = Math.max(this.y + this.h, that.y + that.h) - new_y;\n\n    this.x = new_x;\n    this.y = new_y;\n    this.w = new_w;\n    this.h = new_h;\n\n    if (ctx) this.draw(ctx);\n    return this;\n  }\n\n  draw(ctx, x, y) {\n    if (!x) x = 0;\n    if (!y) y = 0;\n    ctx.rect(this.x + x, this.y + y, this.w, this.h);\n    ctx.stroke();\n  }\n}\n","export const Font = {\n\"glyphs\":{\n\"v0\":{\"x_min\":0,\"x_max\":514.5,\"ha\":525,\"o\":\"m 236 648 b 246 648 238 648 242 648 b 288 646 261 648 283 648 b 472 513 364 634 428 587 b 514 347 502 464 514 413 b 462 163 514 272 499 217 b 257 44 409 83 333 44 b 50 163 181 44 103 83 b 0 347 14 217 0 272 b 40 513 0 413 12 464 b 236 648 87 591 155 638 m 277 614 b 253 616 273 616 261 616 b 242 616 247 616 243 616 b 170 499 193 609 181 589 b 159 348 163 446 159 398 b 166 222 159 308 161 266 b 201 91 174 138 183 106 b 257 76 215 81 235 76 b 311 91 277 76 299 81 b 347 222 330 106 338 138 b 353 348 352 266 353 308 b 344 499 353 398 351 446 b 277 614 333 587 322 606 m 257 -1 l 258 -1 l 255 -1 l 257 -1 m 257 673 l 258 673 l 255 673 l 257 673 \"},\n\"v1\":{\"x_min\":-1.359375,\"x_max\":344.359375,\"ha\":351,\"o\":\"m 126 637 l 129 638 l 198 638 l 266 638 l 269 635 b 274 631 272 634 273 632 l 277 627 l 277 395 b 279 156 277 230 277 161 b 329 88 281 123 295 106 b 344 69 341 81 344 79 b 337 55 344 62 343 59 l 333 54 l 197 54 l 61 54 l 58 55 b 50 69 53 59 50 62 b 65 88 50 79 53 81 b 80 97 72 91 74 93 b 117 156 103 113 112 129 b 117 345 117 161 117 222 l 117 528 l 100 503 l 38 406 b 14 383 24 384 23 383 b -1 398 5 383 -1 390 b 4 415 -1 403 1 409 b 16 437 5 416 10 426 l 72 539 l 100 596 b 121 632 119 631 119 631 b 126 637 122 634 125 635 m 171 -1 l 172 -1 l 170 -1 l 171 -1 m 171 673 l 172 673 l 170 673 l 171 673 \"},\n\"v2\":{\"x_min\":-1.359375,\"x_max\":458.6875,\"ha\":468,\"o\":\"m 197 648 b 216 648 201 648 208 648 b 258 646 232 648 253 648 b 419 546 333 637 393 599 b 432 489 428 528 432 509 b 356 342 432 440 405 384 b 235 278 322 313 288 295 b 69 170 166 256 107 217 b 69 169 69 170 69 169 b 69 169 69 169 69 169 b 74 173 69 169 72 170 b 209 222 112 204 163 222 b 310 195 247 222 274 215 b 371 179 332 184 352 179 b 396 181 379 179 387 179 b 428 202 409 184 423 194 b 442 212 431 209 436 212 b 458 197 450 212 458 206 b 441 148 458 190 449 165 b 299 44 409 84 353 44 b 288 45 295 44 292 44 b 250 61 274 45 268 49 b 122 99 212 86 164 99 b 73 91 104 99 88 97 b 28 63 53 84 34 72 b 14 54 25 56 20 54 b 1 62 9 54 4 56 l -1 65 l -1 79 b 0 99 -1 91 0 95 b 2 113 1 102 2 108 b 164 309 20 197 81 272 b 285 470 232 341 277 398 b 287 487 287 476 287 481 b 171 595 287 551 239 595 b 155 595 166 595 160 595 b 142 592 145 594 142 594 b 145 589 142 592 142 591 b 179 527 168 576 179 551 b 132 455 179 496 163 467 b 104 451 122 452 112 451 b 27 530 62 451 27 487 b 29 555 27 538 27 546 b 197 648 44 601 115 639 m 228 -1 l 230 -1 l 227 -1 l 228 -1 m 228 673 l 230 673 l 227 673 l 228 673 \"},\n\"v3\":{\"x_min\":-1.359375,\"x_max\":409.6875,\"ha\":418,\"o\":\"m 174 648 b 191 648 176 648 183 648 b 225 648 204 648 220 648 b 402 523 317 638 389 588 b 404 503 404 517 404 510 b 402 484 404 495 404 488 b 264 373 389 437 334 394 b 257 370 259 371 257 371 b 257 370 257 370 257 370 b 264 369 258 370 261 369 b 409 202 359 334 409 267 b 318 72 409 152 381 104 b 200 43 281 52 240 43 b 23 113 134 43 69 68 b 0 169 6 129 0 149 b 77 249 0 210 29 249 l 77 249 b 152 174 125 249 152 212 b 103 102 152 145 137 116 b 103 102 103 102 103 102 b 147 94 103 101 132 95 b 153 94 149 94 151 94 b 265 206 219 94 265 141 b 264 226 265 213 265 219 b 147 355 253 299 204 353 b 126 371 133 356 126 362 b 147 388 126 383 132 388 b 254 474 196 391 238 424 b 259 502 258 484 259 494 b 182 592 259 544 228 582 b 156 595 175 595 166 595 b 115 592 142 595 129 594 l 111 591 l 115 588 b 152 524 141 574 152 549 b 92 449 152 491 130 458 b 76 448 87 448 81 448 b -1 530 32 448 -1 488 b 20 581 -1 548 5 566 b 174 648 55 619 108 641 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 \"},\n\"v4\":{\"x_min\":0,\"x_max\":468.21875,\"ha\":478,\"o\":\"m 174 637 b 232 638 175 638 189 638 b 277 638 245 638 259 638 l 378 638 l 381 635 b 389 623 386 632 389 627 b 382 609 389 617 386 613 b 366 589 381 606 372 598 l 313 528 l 245 451 l 209 410 l 155 348 l 84 267 b 59 240 72 252 59 240 b 59 240 59 240 59 240 b 151 238 59 238 68 238 l 242 238 l 242 303 b 243 371 242 369 242 370 b 289 426 245 374 254 385 l 303 441 l 317 456 l 338 483 l 360 506 l 371 520 b 386 527 375 526 381 527 b 400 519 392 527 397 524 b 401 440 401 516 401 514 b 401 377 401 423 401 402 l 401 238 l 426 238 b 453 237 449 238 450 238 b 465 217 461 234 465 226 b 460 202 465 212 464 206 b 426 197 454 197 453 197 l 401 197 l 401 180 b 451 88 402 129 412 109 b 468 69 465 81 468 79 b 461 55 468 62 466 59 l 458 54 l 321 54 l 185 54 l 182 55 b 175 69 176 59 175 62 b 191 88 175 79 176 81 b 240 180 230 109 240 129 l 240 197 l 125 197 b 73 195 104 195 87 195 b 8 197 10 195 9 197 b 0 212 2 199 0 205 b 0 212 0 212 0 212 b 20 242 0 219 0 219 b 163 610 104 344 163 492 b 174 637 163 628 166 634 m 234 -1 l 235 -1 l 232 -1 l 234 -1 m 234 673 l 235 673 l 232 673 l 234 673 \"},\n\"v5\":{\"x_min\":0,\"x_max\":409.6875,\"ha\":418,\"o\":\"m 47 637 b 53 638 49 638 50 638 b 69 634 55 638 61 637 b 210 610 114 619 161 610 b 363 634 259 610 311 619 b 382 638 372 637 378 638 b 392 634 386 638 389 637 b 397 623 396 630 397 627 b 393 610 397 620 396 616 b 298 505 368 552 338 520 b 212 494 277 498 246 494 b 65 517 163 494 106 502 b 61 517 62 517 61 517 b 61 517 61 517 61 517 b 51 408 61 517 51 412 b 51 408 51 408 51 408 b 51 408 51 408 51 408 b 61 412 53 408 55 409 b 125 434 80 421 103 430 b 185 441 145 440 166 441 b 409 244 310 441 409 353 b 401 191 409 227 406 209 b 197 43 375 105 287 43 b 159 47 183 43 171 44 b 23 123 112 56 61 86 b 0 180 6 140 0 159 b 76 260 0 220 31 260 b 92 259 81 260 87 259 b 152 183 132 251 152 216 b 100 112 152 152 134 122 b 95 111 98 112 95 111 b 95 111 95 111 95 111 b 129 98 95 109 119 101 b 148 97 136 97 141 97 b 264 235 206 97 261 158 b 265 248 265 240 265 244 b 210 398 265 312 243 373 b 179 408 201 406 194 408 b 174 408 178 408 176 408 b 53 369 130 408 88 394 b 34 359 39 359 38 359 b 17 374 24 359 17 365 b 39 628 17 384 38 625 b 47 637 40 631 43 635 m 204 -1 l 205 -1 l 202 -1 l 204 -1 m 204 673 l 205 673 l 202 673 l 204 673 \"},\n\"v6\":{\"x_min\":0,\"x_max\":475.03125,\"ha\":485,\"o\":\"m 255 648 b 274 648 259 648 266 648 b 314 646 288 648 307 648 b 450 555 374 637 438 594 b 454 530 453 546 454 538 b 375 451 454 485 416 451 b 328 467 359 451 343 455 b 300 526 310 483 300 503 b 352 598 300 557 319 589 b 356 599 355 598 356 599 b 352 602 356 599 355 601 b 288 616 330 612 308 616 b 210 584 257 616 230 605 b 164 433 189 559 174 508 b 160 374 163 415 160 381 b 160 374 160 374 160 374 b 160 374 160 374 160 374 b 168 377 160 374 164 376 b 258 395 200 390 228 395 b 366 367 294 395 328 387 b 475 223 436 333 475 283 b 472 197 475 215 473 206 b 349 65 462 141 419 95 b 259 43 317 51 288 43 b 167 69 230 43 200 52 b 4 290 80 113 20 195 b 0 349 1 309 0 328 b 20 467 0 391 6 433 b 255 648 58 563 155 637 m 269 363 b 257 363 265 363 261 363 b 210 345 236 363 220 356 b 186 226 196 324 186 272 b 187 198 186 216 186 206 b 213 95 191 151 202 112 b 257 76 221 83 238 76 b 270 77 261 76 266 76 b 321 156 299 81 310 99 b 329 229 326 183 329 206 b 321 301 329 252 326 274 b 269 363 311 342 298 359 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 \"},\n\"v7\":{\"x_min\":0,\"x_max\":442.359375,\"ha\":451,\"o\":\"m 147 648 b 166 649 153 649 160 649 b 313 598 217 649 273 630 b 340 587 323 588 328 587 l 341 587 b 412 628 367 587 390 601 b 427 638 416 635 421 638 b 439 632 431 638 435 637 b 442 623 441 630 442 628 b 430 569 442 616 439 603 b 352 369 408 492 377 410 b 300 259 325 324 313 298 b 273 84 283 205 273 140 b 265 55 273 65 272 59 l 261 54 l 181 54 l 99 54 l 96 55 b 91 61 95 56 92 59 l 89 63 l 89 77 b 147 263 89 133 111 202 b 261 401 176 313 212 355 b 378 541 315 449 349 489 l 382 548 l 375 544 b 240 495 333 512 285 495 b 129 535 198 495 160 509 b 84 560 108 552 95 560 b 76 559 81 560 78 560 b 31 487 59 555 43 530 b 14 470 27 473 24 470 b 1 477 8 470 4 471 l 0 480 l 0 553 l 0 627 l 1 630 b 16 638 4 635 9 638 b 23 635 17 638 20 637 b 49 626 36 626 39 626 b 96 638 59 626 80 630 b 104 639 99 638 102 639 b 117 644 107 641 112 642 b 147 648 125 645 137 648 m 220 -1 l 221 -1 l 219 -1 l 220 -1 m 220 673 l 221 673 l 219 673 l 220 673 \"},\n\"v8\":{\"x_min\":0,\"x_max\":488.640625,\"ha\":499,\"o\":\"m 217 648 b 245 649 225 648 235 649 b 453 516 343 649 430 595 b 458 478 455 503 458 491 b 412 370 458 440 441 398 b 411 369 412 369 411 369 b 415 365 411 367 412 367 b 488 231 462 331 488 281 b 472 165 488 208 483 186 b 243 43 434 86 338 43 b 63 104 178 43 112 62 b 0 233 20 140 0 186 b 73 365 0 283 24 331 l 77 369 l 72 374 b 29 476 42 406 29 441 b 217 648 29 557 103 635 m 258 605 b 242 606 253 605 247 606 b 157 552 198 606 157 580 b 160 541 157 548 159 544 b 319 413 176 503 242 452 l 337 403 l 338 406 b 359 476 352 428 359 452 b 258 605 359 537 318 595 m 138 326 b 130 330 134 328 130 330 b 130 330 130 330 130 330 b 107 305 127 330 112 313 b 84 231 91 281 84 256 b 243 86 84 156 151 86 b 249 87 245 86 246 87 b 347 156 303 88 347 120 b 344 172 347 162 345 167 b 156 319 325 227 257 281 b 138 326 151 322 144 324 m 243 -1 l 245 -1 l 242 -1 l 243 -1 m 243 673 l 245 673 l 242 673 l 243 673 \"},\n\"v9\":{\"x_min\":0,\"x_max\":475.03125,\"ha\":485,\"o\":\"m 191 646 b 212 649 198 648 205 649 b 255 644 227 649 243 646 b 458 448 348 616 428 539 b 475 342 469 415 475 378 b 460 244 475 308 469 274 b 193 44 421 124 303 44 b 91 69 157 44 122 51 b 19 161 43 97 19 126 b 21 181 19 167 20 174 b 98 241 32 220 65 241 b 170 186 129 241 160 223 b 172 166 171 179 172 173 b 121 94 172 134 152 102 b 117 93 118 94 117 93 b 121 90 117 93 118 91 b 185 76 142 80 164 76 b 270 119 220 76 251 91 b 308 259 287 145 300 194 b 313 317 310 277 313 310 b 313 317 313 317 313 317 b 313 317 313 317 313 317 b 304 315 313 317 308 316 b 216 295 273 302 245 295 b 145 308 193 295 170 299 b 19 398 88 327 42 360 b 0 469 5 420 0 444 b 24 551 0 496 8 526 b 191 646 54 596 125 637 m 227 614 b 215 616 224 616 220 616 b 202 614 210 616 206 616 b 152 535 174 610 163 592 b 144 463 147 509 144 485 b 152 391 144 440 147 417 b 216 328 163 344 179 328 b 280 391 253 328 269 344 b 288 463 285 417 288 440 b 280 535 288 485 285 509 b 227 614 269 594 258 610 m 236 -1 l 238 -1 l 235 -1 l 236 -1 m 236 673 l 238 673 l 235 673 l 236 673 \"},\n\"va\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -8 -1 b -1 0 -5 -1 -4 0 b 16 -11 5 0 13 -4 b 83 -186 17 -12 47 -90 l 148 -358 l 148 -363 b 127 -385 148 -376 138 -385 b 112 -378 122 -385 118 -383 b 54 -226 110 -374 114 -385 b 0 -81 24 -147 0 -81 b -55 -226 -1 -81 -25 -147 b -114 -378 -115 -385 -111 -374 b -129 -385 -119 -383 -123 -385 b -149 -363 -140 -385 -149 -376 l -149 -358 l -84 -186 b -19 -11 -49 -90 -19 -12 b -8 -1 -17 -8 -12 -4 \"},\n\"vb\":{\"x_min\":0,\"x_max\":428.75,\"ha\":438,\"o\":\"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 \"},\n\"vc\":{\"x_min\":0,\"x_max\":447.8125,\"ha\":457,\"o\":\"m 0 86 l 0 173 l 223 173 l 447 173 l 447 86 l 447 0 l 223 0 l 0 0 l 0 86 \"},\n\"vf\":{\"x_min\":0,\"x_max\":370.21875,\"ha\":378,\"o\":\"m 0 0 l 0 277 l 61 277 l 122 277 l 122 0 l 122 -278 l 61 -278 l 0 -278 l 0 0 m 246 -1 l 246 277 l 308 277 l 370 277 l 370 -1 l 370 -278 l 308 -278 l 246 -278 l 246 -1 \"},\n\"v10\":{\"x_min\":0,\"x_max\":559.421875,\"ha\":571,\"o\":\"m 5 127 b 14 127 6 127 9 127 b 51 126 25 127 43 127 b 175 98 93 122 138 112 l 186 94 b 279 51 210 86 255 65 b 285 47 280 51 283 48 b 319 27 291 44 311 31 l 326 22 b 359 0 332 19 352 4 l 367 -6 b 371 -9 368 -6 370 -8 l 379 -15 b 387 -22 383 -18 386 -20 l 398 -30 l 411 -40 l 417 -47 l 427 -55 l 434 -61 b 441 -66 436 -62 439 -65 l 446 -72 l 453 -77 l 462 -87 b 558 -188 490 -113 549 -176 b 559 -195 559 -191 559 -194 b 548 -205 559 -201 555 -205 b 541 -204 547 -205 544 -205 b 534 -198 539 -201 536 -199 l 525 -191 b 481 -162 518 -187 490 -167 b 472 -155 477 -159 472 -156 b 468 -152 470 -155 469 -154 b 461 -149 466 -152 464 -151 b 428 -130 454 -145 441 -137 b 371 -99 413 -122 372 -99 b 363 -95 371 -99 367 -98 b 353 -91 357 -94 353 -91 b 348 -90 353 -91 352 -91 b 332 -81 343 -87 341 -86 b 27 -12 230 -37 127 -13 b 0 -5 4 -11 2 -11 b 0 58 0 -2 0 27 b 0 122 0 88 0 120 b 5 127 1 124 4 126 \"},\n\"v11\":{\"x_min\":-155.171875,\"x_max\":153.8125,\"ha\":157,\"o\":\"m -137 353 b -130 353 -136 353 -133 353 b -112 349 -125 353 -119 352 b -100 342 -110 347 -104 344 b 0 317 -69 326 -35 317 b 111 349 38 317 76 328 b 129 353 117 352 123 353 b 153 327 142 353 153 344 b 144 302 153 320 153 317 b 27 6 93 226 50 113 b 21 -13 24 -11 24 -11 b 0 -26 17 -22 8 -26 b -24 -12 -9 -26 -19 -22 b -28 5 -24 -9 -27 -2 b -145 302 -53 117 -95 224 b -155 327 -155 317 -155 320 b -137 353 -155 340 -148 349 \"},\n\"v18\":{\"x_min\":0,\"x_max\":323.9375,\"ha\":331,\"o\":\"m 217 535 b 225 537 220 537 221 537 b 245 524 235 537 242 533 l 246 521 l 247 390 l 247 258 l 273 265 b 306 270 288 269 299 270 b 322 259 315 270 319 267 b 323 208 323 256 323 233 b 322 158 323 184 323 159 b 288 140 318 148 315 147 b 247 130 254 131 247 130 b 247 65 247 130 247 104 b 247 20 247 51 247 36 l 247 -88 l 273 -81 b 306 -76 289 -77 299 -76 b 318 -81 311 -76 315 -77 b 323 -123 323 -87 323 -86 l 323 -138 l 323 -154 b 318 -195 323 -191 323 -190 b 269 -210 314 -199 315 -199 b 249 -216 259 -213 250 -216 l 247 -216 l 247 -349 l 246 -483 l 245 -487 b 225 -499 242 -495 234 -499 b 206 -487 219 -499 210 -495 l 205 -483 l 205 -355 l 205 -227 l 204 -227 l 181 -233 l 138 -244 b 117 -249 127 -247 117 -249 b 115 -385 115 -249 115 -256 l 115 -523 l 114 -526 b 95 -538 110 -534 102 -538 b 74 -526 87 -538 78 -534 l 73 -523 l 73 -391 b 72 -260 73 -269 73 -260 b 72 -260 72 -260 72 -260 b 19 -273 61 -263 23 -273 b 0 -260 10 -273 4 -267 b 0 -209 0 -256 0 -256 l 0 -162 l 1 -158 b 61 -134 5 -148 5 -148 l 73 -131 l 73 -22 b 72 86 73 79 73 86 b 72 86 72 86 72 86 b 19 74 61 83 23 74 b 0 86 10 74 4 79 b 0 137 0 90 0 90 l 0 184 l 1 188 b 61 212 5 198 5 198 l 73 215 l 73 348 l 73 481 l 74 485 b 95 498 78 492 87 498 b 103 495 98 498 100 496 b 114 485 107 494 111 489 l 115 481 l 115 353 l 115 226 l 121 226 b 159 235 123 227 141 231 l 198 247 l 205 248 l 205 384 l 205 521 l 206 524 b 217 535 209 528 212 533 m 205 9 b 205 119 205 70 205 119 l 205 119 b 182 113 204 119 194 116 l 138 102 b 117 97 127 99 117 97 b 115 -12 115 97 115 91 l 115 -122 l 121 -120 b 159 -111 123 -119 141 -115 l 198 -101 l 205 -98 l 205 9 \"},\n\"v1b\":{\"x_min\":0,\"x_max\":559.421875,\"ha\":571,\"o\":\"m 544 204 b 548 204 545 204 547 204 b 559 194 555 204 559 199 b 559 190 559 192 559 191 b 530 156 559 188 556 184 b 462 86 510 134 481 104 b 453 76 458 81 454 77 l 446 70 l 441 65 b 434 59 439 63 436 61 l 427 54 b 409 37 426 51 416 44 b 392 23 398 29 394 26 b 387 19 389 22 387 20 b 379 13 386 19 383 16 l 371 8 l 367 5 l 359 -1 l 337 -16 b 285 -48 319 -29 298 -41 l 279 -52 b 186 -95 255 -66 210 -87 l 175 -99 b 23 -129 127 -117 68 -129 b 17 -129 20 -129 19 -129 b 1 -123 2 -129 2 -129 b 0 -49 0 -122 0 -83 b 0 4 0 -22 0 1 b 27 11 2 9 4 9 b 185 31 78 12 145 20 b 198 34 186 31 193 33 b 314 73 234 44 277 58 b 349 88 328 79 340 84 b 353 90 352 90 353 90 b 363 94 353 90 357 93 b 371 98 367 97 371 98 b 428 129 372 98 413 120 b 461 148 441 136 454 144 b 468 151 464 149 466 151 b 472 154 469 152 470 154 b 481 161 473 155 477 158 b 525 190 490 166 518 186 l 534 197 b 540 201 536 198 539 199 b 544 204 541 202 544 204 \"},\n\"v1d\":{\"x_min\":0,\"x_max\":619.3125,\"ha\":632,\"o\":\"m 274 184 b 307 186 285 186 296 186 b 616 22 465 186 597 116 b 619 -1 617 13 619 5 b 308 -187 619 -104 483 -187 b 0 -1 133 -187 0 -102 b 5 36 0 11 1 23 b 274 184 29 115 141 176 m 289 161 b 272 162 284 162 277 162 b 171 41 209 162 171 108 b 205 -73 171 5 182 -34 b 345 -163 243 -133 298 -163 b 436 -98 385 -163 420 -142 b 446 -43 443 -80 446 -62 b 289 161 446 47 377 147 \"},\n\"v1e\":{\"x_min\":-402.890625,\"x_max\":401.53125,\"ha\":410,\"o\":\"m -219 173 b -213 174 -217 174 -215 174 b -202 173 -209 174 -205 173 b -114 86 -200 172 -179 151 b -28 0 -66 37 -28 0 b 40 84 -28 0 2 37 b 117 174 111 173 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b -42 -86 27 0 -4 -38 b -118 -174 -112 -174 -111 -173 b -123 -176 -119 -176 -121 -176 b -133 -174 -126 -176 -130 -174 b -296 -12 -136 -173 -172 -137 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 172 -398 -43 -228 167 b -219 173 -223 172 -220 173 \"},\n\"v1f\":{\"x_min\":-340.28125,\"x_max\":338.921875,\"ha\":346,\"o\":\"m -32 520 b -29 521 -31 520 -31 521 b -23 519 -27 521 -24 520 b -20 513 -21 517 -20 516 b -21 506 -20 512 -20 509 b -31 474 -23 502 -27 488 l -53 402 l -66 352 l -68 349 l -57 349 b -32 351 -51 349 -40 351 b 123 370 19 352 74 359 b 137 371 127 370 133 371 b 170 356 152 371 164 366 b 171 355 170 355 170 355 b 216 366 174 355 183 358 b 280 378 268 377 266 377 b 287 378 283 378 284 378 b 332 349 307 378 322 369 b 338 319 336 341 338 330 b 332 301 338 310 336 302 b 242 280 329 299 246 280 b 242 280 242 280 242 280 b 235 288 236 280 235 283 b 235 292 235 290 235 291 b 236 302 236 297 236 299 b 220 337 236 316 230 330 l 216 340 l 210 335 b 159 276 189 322 172 301 b 118 149 152 265 156 274 b 81 34 84 36 85 36 b -8 13 78 33 -4 13 b -8 13 -8 13 -8 13 b -14 20 -12 15 -14 15 b -8 44 -14 24 -12 31 b -2 66 -5 55 -2 65 b -2 66 -2 66 -2 66 l -2 66 b -43 41 -2 66 -21 55 b -114 4 -98 8 -98 8 b -144 0 -123 0 -134 0 b -242 99 -197 0 -242 43 b -242 109 -242 102 -242 105 b -212 219 -240 122 -242 116 b -185 312 -197 270 -185 312 l -185 312 b -189 312 -185 312 -186 312 b -259 312 -200 312 -227 312 b -321 310 -291 312 -310 310 b -334 312 -330 310 -334 312 b -340 319 -338 313 -340 316 b -336 326 -340 322 -338 324 b -291 337 -334 326 -314 331 l -247 347 l -210 348 b -172 348 -190 348 -172 348 b -168 363 -172 348 -171 355 b -145 442 -151 424 -145 441 b -133 452 -144 444 -140 446 l -77 489 b -32 520 -53 506 -32 520 m 57 334 b 53 335 55 335 54 335 b 44 334 50 335 49 335 b -70 316 8 326 -28 320 b -78 309 -78 316 -78 316 b -108 202 -80 305 -88 274 b -141 81 -136 112 -141 93 b -140 74 -141 79 -141 77 b -117 49 -137 59 -127 49 b -107 52 -114 49 -110 51 b 16 127 -106 54 14 126 b 42 217 16 127 42 215 b 49 241 42 222 44 229 b 73 320 53 251 73 317 b 57 334 73 327 65 333 \"},\n\"v20\":{\"x_min\":-571.671875,\"x_max\":570.3125,\"ha\":582,\"o\":\"m -559 351 b -551 352 -556 352 -553 352 b -530 338 -543 352 -533 348 b -529 169 -530 337 -529 291 l -529 1 l -507 27 l -441 112 b -382 174 -394 169 -390 174 b -378 174 -381 174 -379 174 b -281 86 -370 174 -375 179 b -196 0 -234 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 279 172 b 289 174 285 174 288 174 b 300 173 294 174 298 173 b 462 11 303 172 340 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 375 -176 371 -176 b 280 -87 367 -173 347 -152 b 194 0 234 -38 194 0 b 126 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 44 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -140 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -288 -176 b -300 -174 -294 -176 -298 -174 b -464 -11 -303 -173 -374 -102 l -476 0 l -506 -37 b -539 -76 -528 -65 -537 -74 b -551 -80 -543 -79 -547 -80 b -570 -68 -558 -80 -566 -76 l -571 -65 l -571 136 b -570 340 -571 331 -571 337 b -559 351 -568 344 -564 348 \"},\n\"v22\":{\"x_min\":0,\"x_max\":432.828125,\"ha\":442,\"o\":\"m 209 186 b 213 187 210 187 212 187 b 216 187 215 187 216 187 b 224 174 216 186 220 180 b 420 -1 269 105 338 43 b 432 -12 431 -8 432 -9 b 421 -23 432 -15 432 -16 b 228 -180 345 -70 264 -137 b 219 -188 221 -188 221 -188 l 219 -188 b 208 -177 215 -188 215 -188 b 10 1 163 -106 93 -44 b 0 11 0 6 0 8 b 10 22 0 13 0 15 b 202 179 87 69 167 136 b 209 186 206 183 209 186 \"},\n\"v23\":{\"x_min\":0,\"x_max\":133.390625,\"ha\":136,\"o\":\"m 54 66 b 65 68 58 68 61 68 b 122 37 88 68 110 56 b 133 -1 130 26 133 12 b 104 -58 133 -23 123 -44 b 66 -69 92 -65 78 -69 b 10 -38 44 -69 23 -58 b 0 -1 2 -27 0 -13 b 54 66 0 30 20 61 \"},\n\"v25\":{\"x_min\":0,\"x_max\":318.5,\"ha\":325,\"o\":\"m 20 376 b 167 377 23 377 96 377 b 296 376 231 377 294 377 b 318 347 311 371 318 359 b 296 316 318 333 311 320 b 159 315 294 315 227 315 b 21 316 91 315 24 315 b 0 345 6 320 0 333 b 20 376 0 359 6 371 \"},\n\"v26\":{\"x_min\":-21.78125,\"x_max\":483.1875,\"ha\":493,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 179 164 199 187 192 l 210 176 l 210 396 l 210 617 l 212 621 b 231 632 216 628 223 632 b 250 620 239 632 247 628 b 251 383 251 616 251 616 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 \"},\n\"v27\":{\"x_min\":0,\"x_max\":432.828125,\"ha\":442,\"o\":\"m 208 184 b 213 187 209 186 212 187 b 224 176 217 187 221 183 b 245 147 225 172 235 159 b 419 -1 288 90 347 38 b 431 -8 424 -4 431 -8 b 432 -12 432 -9 432 -11 b 430 -18 432 -13 432 -16 b 364 -61 424 -20 383 -47 b 225 -183 307 -102 250 -152 b 223 -187 224 -184 223 -187 b 220 -188 221 -188 220 -188 b 208 -176 216 -188 210 -184 b 187 -148 205 -173 197 -159 b 12 0 144 -90 84 -38 b 0 11 4 5 0 8 b 16 24 0 13 4 18 b 183 158 83 69 141 115 b 208 184 194 169 198 173 m 183 105 b 176 113 181 109 176 113 b 172 109 176 113 175 112 b 92 45 149 90 117 62 l 88 41 l 102 31 b 247 -105 160 -6 210 -55 l 254 -115 l 257 -112 l 269 -102 b 340 -45 287 -87 319 -61 l 344 -43 l 330 -33 b 183 105 272 6 221 54 \"},\n\"v28\":{\"x_min\":-73.5,\"x_max\":72.140625,\"ha\":74,\"o\":\"m -72 252 l -73 254 l 0 254 l 72 254 l 70 252 b 0 -1 70 248 0 -1 b -72 252 -1 -1 -72 248 \"},\n\"v29\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m 175 273 b 182 274 178 273 181 274 b 202 262 190 274 198 269 b 204 158 204 259 204 259 l 204 56 l 250 112 b 303 174 296 172 298 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 208 -6 213 0 210 -2 l 204 -12 l 204 -147 b 204 -210 204 -173 204 -194 b 198 -292 204 -297 204 -287 b 183 -299 194 -297 189 -299 b 164 -287 175 -299 167 -295 b 163 -174 163 -284 163 -284 l 161 -63 l 119 -117 b 65 -176 76 -170 73 -176 b 61 -176 63 -176 62 -176 b -35 -87 51 -174 57 -180 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -363 174 -374 170 -371 174 b -359 174 -362 174 -360 174 b -262 86 -351 174 -356 179 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 147 11 -13 172 35 123 l 157 -1 l 160 1 l 163 4 l 163 130 b 164 260 163 256 163 258 b 175 273 166 266 170 270 \"},\n\"v2a\":{\"x_min\":-21.78125,\"x_max\":366.140625,\"ha\":374,\"o\":\"m 276 1378 b 284 1379 279 1379 281 1379 b 306 1360 292 1379 298 1374 b 352 1247 326 1326 343 1286 b 366 1139 362 1213 366 1175 b 347 1009 366 1093 359 1049 l 344 1002 l 347 992 b 352 971 348 986 351 977 b 366 863 362 936 366 899 b 347 732 366 818 359 773 l 344 725 l 347 716 b 352 695 348 710 351 700 b 366 588 362 659 366 623 b 223 262 366 464 314 345 b 189 233 212 252 212 252 b 35 76 126 183 73 129 b -1 16 20 56 2 27 b -19 4 -4 9 -12 4 l -21 4 l -21 137 l -21 270 l -17 270 b 186 344 59 281 134 308 b 319 606 270 399 319 499 b 317 650 319 620 319 635 l 315 659 l 314 655 b 223 537 288 607 258 570 b 189 509 212 528 212 528 b 35 352 126 459 73 405 b -1 292 20 333 2 303 b -19 280 -4 285 -12 280 l -21 280 l -21 413 l -21 546 l -17 546 b 186 620 59 557 134 584 b 319 882 270 675 319 775 b 317 925 319 896 319 911 l 315 935 l 314 931 b 223 813 288 884 258 846 b 189 785 212 805 212 805 b 35 628 126 735 73 681 b -1 569 20 609 2 580 b -19 556 -4 562 -12 556 l -21 556 l -21 689 l -21 823 l -17 823 b 202 907 68 835 152 867 b 319 1157 280 968 319 1061 b 270 1338 319 1218 303 1281 b 262 1358 264 1349 262 1353 b 262 1364 262 1360 262 1363 b 276 1378 265 1371 269 1376 \"},\n\"v2c\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -413 173 b -408 174 -412 174 -409 174 b -397 173 -404 174 -400 173 b -308 86 -394 172 -374 151 b -223 0 -261 37 -223 0 b -153 84 -223 0 -191 37 b -77 174 -83 173 -84 172 b -72 174 -76 174 -74 174 b -62 173 -68 174 -63 173 b 25 86 -59 172 -39 151 b 112 0 73 37 111 0 b 181 84 112 0 144 37 b 257 174 251 173 251 172 b 262 174 258 174 261 174 b 273 173 266 174 270 173 b 436 9 276 172 347 101 l 447 -1 l 477 36 b 522 79 511 79 513 79 l 522 79 b 552 51 533 79 539 73 b 596 -112 582 6 596 -51 b 567 -262 596 -161 586 -213 b 539 -322 558 -287 544 -316 b 524 -327 534 -326 529 -327 b 504 -315 515 -327 507 -323 b 503 -308 503 -312 503 -309 b 511 -285 503 -302 504 -297 b 555 -113 540 -227 555 -169 b 544 -34 555 -86 551 -59 b 522 19 540 -16 530 8 l 521 22 l 481 -26 l 405 -122 b 353 -176 366 -172 362 -176 b 349 -176 352 -176 351 -176 b 253 -87 341 -176 347 -180 b 167 0 206 -38 167 0 b 99 -86 167 0 136 -38 b 21 -174 27 -174 28 -173 b 17 -176 20 -176 19 -176 b 6 -174 13 -176 9 -174 b -81 -87 4 -173 -14 -152 b -167 0 -129 -38 -167 0 b -236 -86 -167 0 -198 -38 b -313 -174 -307 -174 -306 -173 b -318 -176 -314 -176 -315 -176 b -328 -174 -321 -176 -325 -174 b -491 -12 -330 -173 -367 -137 l -503 0 l -530 -34 b -570 -77 -562 -73 -564 -76 b -577 -79 -571 -79 -574 -79 b -597 -58 -588 -79 -597 -69 b -596 -49 -597 -55 -597 -52 b -417 172 -593 -43 -423 167 b -413 173 -417 172 -415 173 \"},\n\"v2d\":{\"x_min\":0,\"x_max\":438.28125,\"ha\":447,\"o\":\"m 212 190 b 219 191 213 191 216 191 b 236 176 225 191 228 190 b 419 18 277 105 341 49 b 436 5 431 13 434 11 b 438 -1 438 4 438 1 b 424 -16 438 -8 432 -13 b 356 -49 409 -20 379 -36 b 234 -180 306 -83 258 -133 b 219 -192 230 -188 224 -192 b 200 -176 213 -192 206 -187 b 9 -15 157 -102 89 -45 b 0 0 2 -12 0 -6 b 16 18 0 9 2 12 b 200 176 93 48 159 104 b 212 190 205 186 208 188 m 239 113 b 236 117 238 116 238 117 b 230 108 235 117 234 115 b 92 -15 196 58 140 8 b 88 -18 91 -16 88 -18 b 92 -20 88 -18 91 -19 b 198 -116 130 -43 166 -74 b 200 -117 200 -117 200 -117 b 201 -117 200 -117 201 -117 b 264 -43 212 -98 242 -62 b 345 15 288 -19 321 4 b 348 18 347 16 348 16 b 344 20 348 18 347 19 b 239 113 307 41 266 79 \"},\n\"v2f\":{\"x_min\":-1.359375,\"x_max\":680.5625,\"ha\":694,\"o\":\"m 597 1042 b 604 1042 600 1042 602 1042 b 642 1002 627 1042 642 1022 b 619 966 642 988 635 974 b 439 927 574 942 503 927 l 426 927 l 426 921 b 430 838 428 893 430 866 b 345 480 430 696 398 560 b 179 391 307 423 249 391 b 156 392 171 391 164 392 b 138 394 149 394 142 394 b 103 434 115 396 103 416 b 129 471 103 451 111 466 b 141 474 133 473 137 474 b 172 459 153 474 164 469 b 181 455 175 456 176 455 b 187 456 182 455 185 455 b 253 520 212 460 234 483 b 315 836 294 605 315 714 b 311 928 315 867 314 898 b 302 945 310 943 311 942 b 245 953 283 950 262 953 b 130 891 193 953 149 931 b 84 860 119 870 102 860 b 36 905 61 860 39 877 b 36 910 36 907 36 909 b 80 970 36 931 50 949 b 249 1017 125 1000 187 1017 b 322 1009 273 1017 299 1014 l 341 1003 b 436 991 372 995 406 991 b 577 1031 495 991 545 1004 b 597 1042 583 1038 590 1041 m 416 360 b 424 360 419 360 421 360 b 481 309 454 360 479 338 b 503 145 484 280 495 199 b 585 -185 525 16 555 -106 b 630 -245 596 -213 613 -237 l 634 -247 l 638 -245 b 647 -244 641 -245 645 -244 b 680 -278 666 -244 680 -262 b 664 -308 680 -290 675 -301 b 638 -312 658 -310 650 -312 b 613 -309 631 -312 623 -310 b 477 -201 555 -303 502 -260 b 417 -2 460 -159 434 -72 b 416 5 417 1 416 5 b 416 5 416 5 416 5 b 411 -5 415 5 413 0 b 359 -97 397 -33 377 -70 b 353 -106 355 -102 353 -105 b 359 -112 353 -108 355 -109 b 409 -130 375 -123 390 -129 b 426 -134 420 -130 421 -131 b 431 -147 428 -137 431 -141 b 420 -162 431 -152 427 -159 b 382 -169 409 -166 396 -169 b 323 -155 363 -169 341 -165 l 317 -152 l 314 -155 b 62 -303 240 -240 148 -295 b 36 -305 55 -305 44 -305 b 23 -303 29 -305 24 -305 b -1 -273 6 -299 -1 -287 b 31 -240 -1 -256 10 -240 b 36 -240 32 -240 34 -240 b 42 -241 38 -241 39 -241 b 134 -204 63 -241 99 -226 b 367 288 265 -115 357 81 b 375 330 368 313 370 320 b 416 360 383 347 400 358 m 360 -359 b 379 -359 363 -359 371 -359 b 424 -360 396 -359 416 -359 b 646 -502 536 -373 624 -430 b 649 -527 649 -510 649 -519 b 530 -673 649 -578 604 -635 l 521 -677 l 529 -681 b 653 -811 592 -714 637 -762 b 660 -853 658 -827 660 -839 b 645 -911 660 -873 656 -892 b 426 -1021 608 -981 519 -1021 b 283 -989 377 -1021 328 -1011 b 235 -949 249 -972 239 -964 b 234 -936 234 -946 234 -941 b 234 -928 234 -934 234 -931 l 235 -925 l 234 -927 l 225 -934 b 87 -982 186 -966 138 -982 b 80 -982 85 -982 83 -982 b 55 -981 70 -981 58 -981 b 17 -943 32 -981 17 -964 b 54 -904 17 -921 35 -904 b 78 -914 62 -904 72 -909 l 83 -918 l 88 -918 b 190 -831 122 -918 166 -881 b 269 -506 242 -727 269 -612 b 268 -462 269 -492 269 -477 b 266 -449 266 -458 266 -452 b 265 -444 266 -445 266 -444 b 257 -446 264 -444 261 -445 b 132 -545 196 -470 152 -505 b 88 -573 122 -563 104 -573 b 39 -523 63 -573 39 -553 b 63 -476 39 -505 44 -494 b 360 -359 136 -408 235 -369 m 419 -424 b 393 -423 411 -423 406 -423 l 375 -423 l 377 -426 b 379 -439 377 -427 378 -434 b 383 -510 382 -463 383 -487 b 314 -811 383 -609 360 -710 b 266 -893 296 -850 285 -870 b 264 -898 265 -896 264 -898 l 264 -898 b 264 -898 264 -898 264 -898 b 268 -898 264 -898 266 -898 b 273 -898 270 -898 272 -898 b 300 -909 283 -898 291 -900 b 426 -957 340 -941 385 -957 b 476 -949 443 -957 460 -954 b 547 -853 522 -931 547 -893 b 485 -745 547 -816 526 -775 b 397 -707 460 -727 432 -714 b 366 -675 375 -703 366 -692 b 396 -642 366 -657 377 -645 b 530 -557 455 -637 511 -601 b 536 -527 534 -548 536 -537 b 419 -424 536 -480 490 -437 \"},\n\"v30\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 276 1900 b 284 1901 279 1900 281 1901 b 306 1883 291 1901 298 1896 b 367 1686 347 1825 367 1757 b 343 1558 367 1643 359 1600 l 338 1549 l 343 1537 b 367 1411 359 1497 367 1454 b 343 1282 367 1367 359 1324 l 338 1272 l 343 1261 b 367 1135 359 1221 367 1178 b 343 1007 367 1090 359 1047 l 338 996 l 343 985 b 367 859 359 945 367 902 b 343 731 367 814 359 771 l 338 720 l 343 709 b 367 582 359 667 367 626 b 289 362 367 503 340 426 b 239 312 276 345 259 330 b 29 77 152 237 76 152 b -1 18 14 54 2 30 b -19 4 -4 11 -12 4 l -21 4 l -21 133 l -20 260 l -13 262 b 98 299 17 269 62 284 b 111 305 103 302 110 305 b 167 334 123 310 156 327 b 319 595 264 391 319 491 b 313 659 319 616 318 638 b 310 667 311 664 311 667 b 307 663 310 667 308 666 b 240 588 289 637 269 614 b 16 331 141 505 62 413 b -1 294 8 316 1 302 b -19 280 -4 287 -12 280 l -21 280 l -21 408 l -20 537 l -13 538 b 98 576 17 545 62 560 b 111 581 103 578 110 581 b 167 610 123 587 156 603 b 319 871 264 667 319 767 b 313 935 319 892 318 913 b 310 942 311 941 311 942 b 307 939 310 942 308 941 b 240 864 289 913 269 889 b 16 607 141 781 62 689 b -1 570 8 592 1 578 b -19 556 -4 563 -12 556 l -21 556 l -21 684 l -20 813 l -13 814 b 98 852 17 821 62 836 b 111 857 103 855 110 857 b 167 886 123 863 156 880 b 319 1147 264 943 319 1043 b 313 1211 319 1168 318 1189 b 310 1218 311 1217 311 1218 b 307 1215 310 1218 308 1217 b 240 1140 289 1188 269 1165 b 16 884 141 1057 62 966 b -1 846 8 868 1 855 b -19 832 -4 839 -12 832 l -21 832 l -21 960 l -20 1089 l -13 1090 b 98 1128 17 1097 62 1111 b 111 1134 103 1131 110 1134 b 167 1163 123 1139 156 1156 b 319 1424 264 1220 319 1320 b 313 1486 319 1444 318 1465 b 310 1494 311 1493 311 1494 b 307 1492 310 1494 308 1493 b 240 1417 289 1464 269 1442 b 16 1160 141 1333 62 1242 b -1 1121 8 1145 1 1131 b -19 1109 -4 1115 -12 1109 l -21 1109 l -21 1236 l -20 1365 l -13 1367 b 98 1404 17 1374 62 1388 b 111 1410 103 1407 110 1410 b 250 1508 172 1437 215 1467 b 319 1701 296 1564 319 1633 b 270 1859 319 1757 303 1814 b 262 1882 265 1868 262 1875 b 276 1900 262 1890 266 1896 \"},\n\"v31\":{\"x_min\":0,\"x_max\":386.5625,\"ha\":394,\"o\":\"m 0 173 l 0 347 l 193 347 l 386 347 l 386 173 l 386 0 l 193 0 l 0 0 l 0 173 \"},\n\"v33\":{\"x_min\":-423.3125,\"x_max\":421.9375,\"ha\":431,\"o\":\"m -10 276 b -2 277 -8 277 -5 277 b 17 265 5 277 13 273 b 19 163 19 260 19 260 l 19 68 l 39 45 b 277 -95 122 -34 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -54 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 200 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 137 b 421 22 421 37 421 29 b 257 -198 421 -86 347 -188 b 242 -198 251 -198 247 -198 b 20 -105 181 -198 95 -163 l 19 -104 l 19 -183 b 19 -216 19 -195 19 -206 b 12 -273 19 -272 17 -267 b -2 -278 8 -277 2 -278 b -21 -266 -10 -278 -19 -274 b -23 -165 -23 -263 -23 -262 l -23 -69 l -44 -47 b -250 86 -117 23 -183 66 b -295 94 -270 93 -284 94 b -315 91 -302 94 -308 94 b -381 5 -356 81 -381 43 b -355 -56 -381 -16 -372 -40 b -299 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -168 -77 -196 -58 -179 -65 b -151 -122 -156 -90 -151 -105 b -179 -174 -151 -141 -160 -162 b -239 -195 -194 -184 -217 -192 b -257 -197 -245 -195 -250 -197 b -423 -5 -349 -197 -423 -113 b -423 0 -423 -4 -423 -1 b -277 194 -420 97 -362 173 b -247 197 -268 197 -258 197 b -24 104 -185 197 -100 162 l -23 102 l -23 181 b -21 265 -23 260 -23 260 b -10 276 -20 269 -14 274 \"},\n\"v34\":{\"x_min\":0,\"x_max\":622.03125,\"ha\":635,\"o\":\"m 398 417 b 406 419 401 419 404 419 b 427 398 417 419 427 409 b 427 391 427 395 427 392 b 34 -274 424 385 38 -272 b 20 -280 29 -278 25 -280 b 0 -259 9 -280 0 -270 b 0 -252 0 -256 0 -254 b 393 413 2 -247 389 410 b 398 417 394 415 397 416 m 592 417 b 600 419 594 419 597 419 b 622 398 611 419 622 409 b 620 391 622 395 620 392 b 227 -274 617 385 231 -272 b 213 -280 223 -278 219 -280 b 193 -259 202 -280 193 -270 b 194 -252 193 -256 193 -254 b 586 413 196 -247 582 410 b 592 417 588 415 590 416 \"},\n\"v36\":{\"x_min\":-1.359375,\"x_max\":1064.390625,\"ha\":1086,\"o\":\"m 296 692 b 314 694 302 694 307 694 b 386 685 337 694 366 689 b 548 498 480 660 548 580 b 548 481 548 492 548 487 b 455 395 541 426 499 395 b 370 462 420 395 383 417 b 362 496 364 477 362 488 b 377 514 362 509 367 514 b 393 501 386 514 390 510 b 432 474 397 484 413 474 b 470 487 445 474 458 478 b 491 530 484 496 491 510 b 490 544 491 534 491 539 b 333 660 479 606 411 657 l 323 662 l 315 646 b 269 524 285 591 269 556 b 321 431 269 492 287 466 b 349 395 338 413 343 408 b 363 342 359 378 363 362 b 359 312 363 333 362 322 b 285 158 348 266 318 206 b 281 152 283 155 281 152 b 281 152 281 152 281 152 b 287 154 283 152 284 152 b 318 155 298 154 308 155 b 461 98 371 155 419 136 l 464 97 l 483 112 b 503 129 494 120 503 127 b 504 130 503 129 504 129 b 503 138 504 131 503 134 b 500 180 500 152 500 166 b 553 326 500 238 518 288 b 604 366 560 331 592 358 b 649 381 617 376 632 381 b 696 362 665 381 681 374 b 724 302 714 347 724 324 b 695 238 724 278 714 255 b 660 210 691 234 662 212 b 579 148 658 209 582 151 b 579 148 579 148 579 148 b 596 106 579 144 589 119 b 622 77 604 88 609 83 b 657 69 632 72 645 69 b 748 112 688 69 721 84 b 755 123 754 117 755 120 b 755 127 755 124 755 126 b 751 165 752 137 751 151 b 758 219 751 183 754 202 b 894 387 774 290 820 347 b 896 390 896 388 896 388 b 891 398 896 391 895 392 b 622 560 827 477 730 535 b 600 580 605 564 600 569 b 617 596 600 591 607 596 b 628 595 622 596 624 596 b 1057 248 846 552 1020 412 b 1064 191 1061 229 1064 209 b 922 0 1064 94 1005 9 b 902 -1 916 -1 909 -1 b 774 76 847 -1 800 26 b 769 83 770 81 770 83 b 769 81 769 83 769 83 b 627 -1 733 29 677 -1 b 548 27 597 -1 570 8 b 515 88 537 37 525 61 l 513 95 l 510 93 l 453 45 b 390 0 396 0 396 0 b 390 0 390 0 390 0 b 374 15 381 0 377 4 b 268 105 359 69 314 105 b 250 104 262 105 257 105 l 243 102 l 234 90 b 155 1 201 49 159 2 b 147 -1 152 0 149 -1 b 130 15 138 -1 130 6 b 132 20 130 18 132 19 b 136 31 133 22 134 27 b 220 131 149 74 178 109 b 231 137 225 134 230 136 b 302 278 280 202 302 244 b 265 335 302 299 295 309 b 209 442 234 363 213 402 b 209 455 209 446 209 451 b 279 648 209 502 232 564 l 285 659 l 283 659 b 176 627 238 653 210 645 b 57 477 111 594 66 538 b 55 459 55 471 55 464 b 72 409 55 437 61 415 b 93 403 78 405 87 403 b 152 467 123 403 151 431 b 168 488 153 483 157 488 b 185 462 181 488 185 483 l 185 460 b 137 344 183 409 168 369 b 78 322 119 328 98 322 b 13 360 50 322 25 335 b -1 426 4 380 -1 402 b 89 610 -1 488 32 559 b 296 692 147 659 210 685 m 926 348 b 921 353 924 351 922 353 b 914 348 920 353 918 351 b 823 167 857 306 823 237 b 828 124 823 154 826 138 b 890 31 837 79 862 40 b 896 31 892 31 894 31 b 956 104 916 31 940 59 b 970 191 965 129 970 159 b 966 241 970 208 969 224 b 926 348 959 277 945 313 m 627 326 b 619 326 624 326 622 326 b 598 316 611 326 604 323 b 568 215 579 288 568 255 b 568 208 568 213 568 210 b 571 183 570 195 570 184 l 571 183 b 594 201 571 183 582 191 l 634 231 b 660 259 653 247 656 248 b 664 278 662 266 664 272 b 627 326 664 299 649 320 \"},\n\"v38\":{\"x_min\":-1.359375,\"x_max\":651.96875,\"ha\":665,\"o\":\"m 389 644 b 405 645 394 645 400 645 b 504 566 450 645 492 613 b 507 541 506 557 507 549 b 480 471 507 514 498 489 l 477 467 l 483 470 b 609 591 539 485 586 531 b 613 601 611 595 613 599 b 631 609 619 607 624 609 b 651 588 641 609 651 602 b 200 -946 651 584 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 537 313 478 300 508 b 389 644 300 585 334 635 \"},\n\"v39\":{\"x_min\":-171.5,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 553 20 616 20 614 b 20 491 20 503 20 491 l 20 491 b 153 535 47 501 149 535 b 174 514 167 535 174 524 b 164 496 174 508 171 501 b 92 470 164 495 132 484 l 20 445 l 20 390 b 20 363 20 378 20 370 b 20 333 20 340 20 333 l 20 333 b 153 377 47 344 149 377 b 174 356 167 377 174 367 b 164 338 174 349 171 342 b 92 312 164 338 132 326 l 20 288 l 20 219 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b -1 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 30 -21 -212 -21 -212 b -21 273 -21 163 -21 273 b -84 252 -21 273 -50 263 b -152 230 -133 234 -145 230 b -157 231 -155 230 -156 231 b -171 252 -166 234 -171 244 b -160 270 -171 259 -167 266 b -27 316 -159 270 -93 294 l -21 319 l -21 374 b -21 431 -21 406 -21 431 b -84 409 -21 431 -50 421 b -152 388 -133 392 -145 388 b -157 390 -155 388 -156 388 b -171 409 -166 392 -171 401 b -160 428 -171 417 -167 424 b -27 474 -159 428 -93 451 l -21 476 l -21 546 b -20 620 -21 614 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"v3b\":{\"x_min\":0,\"x_max\":484.5625,\"ha\":494,\"o\":\"m 228 245 b 239 247 234 247 239 247 b 243 247 240 247 242 247 b 303 238 257 247 287 242 b 484 -2 417 208 484 104 b 412 -177 484 -65 461 -127 b 243 -248 363 -226 303 -248 b 6 -63 138 -248 36 -180 b 0 -1 1 -41 0 -20 b 228 245 0 127 98 240 m 255 181 b 240 183 247 183 245 183 b 232 181 238 183 235 183 b 142 152 200 180 168 170 l 138 149 l 190 97 l 242 44 l 294 97 l 345 149 l 340 152 b 255 181 315 169 284 180 m 147 -54 l 197 -1 l 147 51 l 95 104 l 91 99 b 62 -1 72 70 62 34 b 66 -43 62 -15 63 -29 b 91 -101 72 -63 80 -84 l 95 -106 l 147 -54 m 393 99 b 389 104 390 102 389 104 b 337 51 389 104 366 80 l 285 -1 l 337 -54 l 389 -106 l 393 -101 b 421 -1 412 -72 421 -36 b 393 99 421 34 412 69 m 294 -98 b 242 -45 265 -69 242 -45 b 190 -98 242 -45 219 -69 l 138 -151 l 142 -154 b 242 -184 172 -174 206 -184 b 340 -154 276 -184 311 -174 l 345 -151 l 294 -98 \"},\n\"v3c\":{\"x_min\":0,\"x_max\":450.53125,\"ha\":460,\"o\":\"m 189 302 b 204 303 193 302 198 303 b 303 224 250 303 292 270 b 306 199 304 216 306 208 b 279 129 306 173 296 147 l 276 126 l 281 127 b 408 249 337 142 385 190 b 412 259 409 254 412 258 b 430 267 417 265 423 267 b 450 247 441 267 450 259 b 200 -605 450 242 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 194 111 136 99 165 b 189 302 99 244 133 292 \"},\n\"v3e\":{\"x_min\":0,\"x_max\":406.96875,\"ha\":415,\"o\":\"m 21 183 b 28 183 24 183 25 183 b 42 181 34 183 39 183 b 127 108 47 179 47 179 b 202 41 168 72 202 41 b 279 108 204 41 238 72 b 357 177 321 145 356 176 b 375 183 363 181 370 183 b 406 151 392 183 406 169 b 404 137 406 147 405 141 b 322 62 401 131 398 129 b 251 0 284 27 251 0 b 322 -63 251 -1 284 -29 b 404 -138 398 -130 401 -133 b 406 -152 405 -142 406 -148 b 375 -184 406 -170 392 -184 b 357 -179 370 -184 363 -183 b 279 -109 356 -177 321 -147 b 202 -43 238 -73 204 -43 b 127 -109 202 -43 168 -73 b 49 -179 85 -147 50 -177 b 31 -184 43 -183 36 -184 b 0 -152 13 -184 0 -170 b 2 -138 0 -148 0 -142 b 83 -63 5 -133 8 -130 b 155 0 122 -29 155 -1 b 83 62 155 0 122 27 b 8 129 43 97 10 127 b 0 151 2 136 0 144 b 21 183 0 165 8 177 \"},\n\"v3f\":{\"x_min\":-24.5,\"x_max\":317.140625,\"ha\":324,\"o\":\"m -24 -147 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 58 -123 6 -43 31 -86 b 196 -278 93 -173 134 -219 b 317 -570 274 -356 317 -460 b 294 -713 317 -617 308 -666 l 289 -724 l 294 -735 b 317 -873 308 -780 317 -827 b 235 -1132 317 -963 288 -1054 b 209 -1165 228 -1140 224 -1146 b 189 -1177 204 -1172 196 -1177 b 171 -1164 182 -1177 175 -1172 b 168 -1154 170 -1161 168 -1159 b 181 -1132 168 -1149 172 -1142 b 269 -891 238 -1064 269 -975 b 269 -881 269 -886 269 -884 b 262 -814 269 -857 265 -827 b 258 -800 261 -811 259 -806 b 142 -628 240 -731 198 -667 b -8 -589 112 -606 47 -589 b -20 -589 -13 -589 -19 -589 l -24 -589 l -24 -449 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 58 -424 6 -345 31 -388 b 194 -580 93 -476 136 -523 b 259 -660 221 -606 245 -635 b 261 -663 259 -662 261 -663 b 264 -656 262 -663 262 -660 b 269 -587 268 -632 269 -610 b 264 -521 269 -566 268 -544 b 262 -512 264 -517 262 -513 b 258 -498 261 -509 259 -503 b 142 -326 240 -428 198 -365 b -8 -287 112 -303 47 -288 b -20 -287 -13 -287 -19 -287 l -24 -287 l -24 -147 \"},\n\"v40\":{\"x_min\":-1.359375,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 \"},\n\"v41\":{\"x_min\":-1.359375,\"x_max\":556.6875,\"ha\":568,\"o\":\"m 294 322 b 318 323 299 322 308 323 b 360 320 334 323 352 322 b 526 217 430 310 490 273 b 543 166 537 202 543 184 b 447 70 543 117 503 70 b 445 70 447 70 446 70 b 359 159 394 72 359 113 b 368 201 359 173 362 187 b 442 245 382 229 412 245 b 455 244 446 245 451 245 b 460 244 458 244 460 244 b 460 244 460 244 460 244 b 454 248 460 244 458 245 b 325 291 417 276 372 291 b 285 287 313 291 299 290 b 144 -2 183 269 144 190 b 281 -290 144 -208 179 -280 b 304 -291 289 -291 298 -291 b 524 -105 412 -291 506 -212 b 541 -84 526 -88 530 -84 b 556 -101 551 -84 556 -90 b 549 -138 556 -111 553 -122 b 334 -322 521 -237 435 -310 b 302 -324 323 -323 313 -324 b 13 -101 172 -324 54 -234 b -1 -1 4 -68 -1 -34 b 294 322 -1 161 121 303 \"},\n\"v42\":{\"x_min\":-348.4375,\"x_max\":24.5,\"ha\":25,\"o\":\"m -330 155 b -322 156 -329 156 -326 156 b -315 156 -319 156 -317 156 b -298 147 -311 155 -308 154 b -19 30 -224 98 -122 55 l 2 26 b 24 -1 17 22 24 13 b 2 -27 24 -15 17 -23 l -19 -31 b -298 -148 -122 -56 -224 -99 b -322 -158 -313 -158 -315 -158 b -348 -131 -338 -158 -348 -145 b -344 -117 -348 -127 -347 -122 b -328 -104 -341 -112 -338 -111 b -127 -8 -269 -65 -202 -33 b -106 0 -115 -4 -106 -1 b -127 6 -106 0 -115 2 b -328 102 -202 31 -269 63 b -344 116 -338 109 -341 111 b -348 130 -347 120 -348 124 b -330 155 -348 141 -341 152 \"},\n\"v43\":{\"x_min\":-442.359375,\"x_max\":441,\"ha\":450,\"o\":\"m -31 487 b -1 488 -21 488 -10 488 b 434 104 216 488 397 330 b 441 27 438 79 441 47 b 439 12 441 20 439 15 b 419 0 435 4 427 0 b 404 5 413 0 408 1 b 398 30 400 11 398 13 b 0 351 390 213 213 351 b -59 348 -20 351 -39 349 b -400 30 -251 324 -393 191 b -405 5 -400 13 -401 11 b -420 0 -409 1 -415 0 b -441 12 -428 0 -436 4 b -442 27 -441 15 -442 20 b -435 104 -442 47 -439 79 b -31 487 -401 316 -235 474 m -13 131 b -1 133 -9 133 -5 133 b 51 105 19 133 39 123 b 61 70 58 95 61 83 b 51 34 61 58 58 45 b -1 6 39 16 19 6 b -46 27 -17 6 -34 13 b -62 69 -57 38 -62 54 b -13 131 -62 98 -44 124 \"},\n\"v44\":{\"x_min\":-21.78125,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 383 20 616 20 616 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 201 l -21 616 l -20 620 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"v45\":{\"x_min\":-402.890625,\"x_max\":401.53125,\"ha\":410,\"o\":\"m -10 273 b -4 274 -9 273 -6 274 b 16 262 4 274 12 269 b 17 158 17 259 17 259 l 17 56 l 62 112 b 117 174 110 172 110 172 b 122 174 118 174 119 174 b 132 173 125 174 129 173 b 295 11 134 172 171 134 l 307 -1 l 336 34 b 374 76 366 72 368 74 b 381 77 375 77 378 77 b 401 56 392 77 401 68 b 400 48 401 54 401 51 b 223 -172 397 41 230 -166 b 210 -176 220 -174 215 -176 b 201 -174 206 -176 204 -176 b 112 -87 198 -173 178 -152 b 27 0 65 -38 27 0 b 21 -6 27 0 24 -2 l 17 -12 l 17 -147 b 17 -210 17 -173 17 -194 b 10 -292 17 -297 16 -287 b -2 -299 6 -297 2 -299 b -21 -287 -10 -299 -19 -295 b -24 -174 -23 -284 -23 -284 l -24 -63 l -66 -117 b -121 -176 -110 -170 -114 -176 b -125 -176 -122 -176 -123 -176 b -296 -12 -134 -174 -125 -184 l -308 0 l -337 -34 b -375 -77 -367 -73 -370 -76 b -382 -79 -377 -79 -379 -79 b -402 -58 -393 -79 -402 -69 b -401 -49 -402 -55 -402 -52 b -224 170 -398 -43 -231 165 b -212 174 -221 173 -216 174 b -202 173 -208 174 -205 174 b -39 11 -200 172 -151 122 l -28 -1 l -25 1 l -24 4 l -24 130 b -23 260 -24 256 -24 258 b -10 273 -20 266 -16 270 \"},\n\"v46\":{\"x_min\":0,\"x_max\":627.46875,\"ha\":640,\"o\":\"m 306 190 b 314 191 308 191 311 191 b 326 184 318 191 322 190 l 336 173 b 510 52 377 127 442 80 b 515 49 513 51 515 49 b 611 16 537 40 579 24 b 627 0 624 13 627 9 b 607 -18 627 -11 624 -13 b 330 -181 490 -49 389 -109 b 314 -192 323 -190 319 -192 b 306 -191 311 -192 308 -192 b 294 -177 302 -188 302 -188 b 257 -140 287 -170 265 -148 b 19 -18 193 -84 114 -44 b 0 0 2 -13 0 -11 b 16 16 0 9 2 13 b 110 49 47 24 89 40 b 117 52 111 49 114 51 b 145 65 126 56 130 58 b 281 163 200 93 245 124 b 300 186 288 170 291 174 b 306 190 300 187 303 188 m 317 137 b 313 142 315 141 314 142 b 308 137 313 142 311 141 b 161 4 276 84 220 33 b 155 0 159 1 155 0 b 163 -4 155 0 159 -2 b 308 -138 220 -34 276 -84 b 313 -142 311 -141 313 -142 b 317 -138 314 -142 315 -141 b 464 -4 351 -84 406 -34 b 470 0 468 -2 470 0 b 464 4 470 0 468 1 b 317 137 406 33 351 84 \"},\n\"v47\":{\"x_min\":-24.5,\"x_max\":315.78125,\"ha\":322,\"o\":\"m -24 -145 l -24 -5 l -20 -5 b 1 -26 -10 -5 -6 -9 b 175 -241 31 -86 96 -166 b 314 -548 259 -323 304 -420 b 315 -589 315 -555 315 -571 b 314 -630 315 -606 315 -623 b 298 -730 311 -664 306 -699 l 295 -742 l 296 -748 b 314 -850 304 -778 311 -813 b 315 -892 315 -857 315 -874 b 314 -932 315 -909 315 -925 b 298 -1032 311 -967 306 -1002 l 295 -1045 l 296 -1050 b 314 -1153 304 -1081 311 -1115 b 315 -1193 315 -1160 315 -1177 b 314 -1235 315 -1211 315 -1228 b 217 -1526 306 -1338 270 -1444 b 201 -1533 213 -1532 208 -1533 b 182 -1522 193 -1533 185 -1529 b 179 -1514 181 -1518 179 -1517 b 189 -1489 179 -1508 182 -1501 b 266 -1217 240 -1403 266 -1308 b 262 -1156 266 -1196 265 -1177 b 110 -907 247 -1043 190 -950 b 0 -889 87 -895 50 -889 l -1 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 1 -631 -10 -610 -6 -614 b 175 -846 31 -691 96 -771 b 259 -956 213 -884 236 -914 b 265 -966 262 -961 264 -966 b 265 -966 265 -966 265 -966 b 265 -953 265 -964 265 -959 b 266 -920 266 -943 266 -932 b 262 -853 266 -898 265 -873 b 110 -605 247 -741 190 -648 b 0 -587 87 -592 50 -587 l -1 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 1 -328 -10 -308 -6 -312 b 175 -544 31 -388 96 -469 b 259 -655 213 -581 236 -612 b 265 -663 262 -659 264 -663 b 265 -663 265 -663 265 -663 b 265 -650 265 -663 265 -657 b 266 -617 266 -641 266 -630 b 262 -551 266 -595 265 -570 b 110 -303 247 -438 190 -345 b 0 -284 87 -290 50 -284 l -1 -284 l -24 -284 l -24 -145 \"},\n\"v49\":{\"x_min\":0,\"x_max\":630.203125,\"ha\":643,\"o\":\"m 308 204 b 314 205 310 205 313 205 b 326 201 319 205 323 204 b 355 154 328 199 338 180 b 401 83 362 142 392 95 l 409 72 b 431 41 412 66 424 49 b 619 -174 498 -51 570 -134 b 630 -192 626 -180 630 -186 b 626 -202 630 -195 628 -199 b 616 -206 623 -205 620 -206 b 552 -188 608 -206 592 -202 b 310 -155 488 -169 392 -155 b 268 -156 295 -155 281 -155 b 77 -188 197 -161 126 -173 b 13 -206 35 -202 20 -206 b 9 -206 12 -206 10 -206 b 0 -191 2 -202 0 -197 b 8 -176 0 -186 2 -180 b 204 49 58 -136 138 -43 l 220 72 l 227 83 b 295 188 245 108 281 166 b 308 204 299 197 304 202 m 315 147 b 314 147 315 147 314 147 b 314 147 314 147 314 147 b 306 129 314 145 310 138 l 296 105 b 281 72 292 97 284 77 l 274 56 b 181 -123 247 -4 212 -72 l 174 -134 l 176 -133 b 314 -123 215 -127 272 -123 b 451 -133 356 -123 413 -127 l 454 -134 l 449 -123 b 353 56 417 -72 381 -4 l 347 72 b 332 105 344 77 336 97 l 322 129 b 315 147 318 138 315 145 \"},\n\"v4a\":{\"x_min\":70.78125,\"x_max\":378.390625,\"ha\":315,\"o\":\"m 246 373 b 254 373 249 373 251 373 b 372 324 303 373 360 351 b 378 302 377 317 378 309 b 338 251 378 278 362 255 b 328 249 334 249 332 249 b 283 294 303 249 283 270 b 288 315 283 301 284 308 b 289 319 289 317 289 319 b 289 319 289 319 289 319 b 283 320 289 320 287 320 b 270 322 279 322 274 322 b 206 288 242 322 215 308 b 206 283 206 287 206 285 b 257 223 206 267 230 238 b 284 206 272 213 277 210 b 351 90 328 173 351 130 b 340 47 351 74 348 59 b 205 -30 314 -2 264 -30 b 182 -29 198 -30 190 -30 b 84 15 147 -24 103 -5 b 70 48 74 24 70 36 b 108 99 70 70 85 94 b 121 102 112 101 117 102 b 167 56 147 102 167 80 b 159 31 167 48 164 40 l 156 26 l 157 26 b 190 20 167 22 178 20 b 220 26 201 20 212 22 b 258 65 243 34 258 51 b 257 70 258 66 258 69 b 204 126 249 94 234 109 b 114 258 148 158 114 209 b 125 302 114 273 118 288 b 246 373 147 342 193 370 \"},\n\"v4b\":{\"x_min\":0,\"x_max\":503.609375,\"ha\":514,\"o\":\"m 274 430 b 277 430 276 430 277 430 b 310 394 296 430 310 415 b 308 383 310 391 308 387 b 306 367 307 381 307 374 b 236 120 298 305 272 210 b 40 -273 189 -5 125 -134 b 20 -287 35 -283 27 -287 b 5 -281 14 -287 9 -285 b 0 -267 1 -277 0 -273 b 9 -242 0 -262 2 -255 b 246 395 137 -12 232 242 b 274 430 249 416 257 427 m 468 430 b 472 430 469 430 470 430 b 503 394 490 430 503 415 b 502 383 503 391 503 387 b 499 367 502 381 500 374 b 431 120 491 305 465 210 b 234 -273 382 -5 318 -134 b 213 -287 228 -283 220 -287 b 198 -281 208 -287 202 -285 b 193 -267 194 -277 193 -273 b 202 -242 193 -262 196 -255 b 439 395 330 -12 426 242 b 468 430 442 416 451 427 \"},\n\"v4d\":{\"x_min\":-311.6875,\"x_max\":310.328125,\"ha\":317,\"o\":\"m -9 388 b -2 390 -8 390 -5 390 b 5 388 1 390 4 390 b 19 378 10 387 16 383 b 23 333 23 371 23 371 b 24 298 23 299 24 298 b 81 276 34 298 65 285 b 213 91 145 240 190 177 b 224 24 217 76 224 36 b 257 24 224 24 235 24 b 299 19 292 24 292 24 b 310 -1 306 15 310 6 b 299 -23 310 -11 306 -19 b 257 -27 292 -27 292 -27 b 224 -29 235 -27 224 -29 b 213 -95 224 -40 217 -80 b 81 -280 190 -181 145 -244 b 24 -301 65 -290 34 -301 b 23 -335 24 -301 23 -303 l 23 -340 b 17 -381 23 -374 23 -374 b -1 -391 13 -388 5 -391 b -21 -381 -9 -391 -17 -388 b -27 -340 -27 -374 -27 -374 l -27 -335 b -28 -301 -27 -303 -27 -301 b -85 -280 -38 -301 -69 -290 b -217 -95 -149 -244 -194 -181 b -228 -29 -221 -80 -228 -40 b -259 -27 -228 -29 -238 -27 b -300 -23 -294 -27 -294 -27 b -311 -2 -307 -19 -311 -11 b -294 23 -311 8 -304 19 b -259 24 -291 23 -284 24 b -228 24 -239 24 -228 24 b -217 91 -228 36 -221 76 b -85 276 -194 177 -149 240 b -28 298 -69 285 -38 298 b -27 333 -27 298 -27 299 b -27 371 -27 362 -27 369 b -9 388 -24 378 -17 385 m -27 136 b -28 247 -27 197 -28 247 b -61 216 -31 247 -53 226 b -123 33 -95 172 -121 98 l -125 24 l -76 24 l -27 24 l -27 136 m 29 242 b 24 247 27 245 24 247 b 23 136 24 247 23 197 l 23 24 l 72 24 l 121 24 l 119 33 b 29 242 115 116 77 206 m -27 -140 l -27 -27 l -76 -27 l -125 -27 l -123 -36 b -61 -220 -121 -102 -95 -176 b -28 -251 -53 -230 -31 -251 b -27 -140 -28 -251 -27 -201 m 119 -36 l 121 -27 l 72 -27 l 23 -27 l 23 -140 b 24 -251 23 -201 24 -251 b 57 -220 27 -251 49 -230 b 119 -36 91 -176 117 -102 \"},\n\"v4e\":{\"x_min\":0,\"x_max\":239.5625,\"ha\":244,\"o\":\"m 10 460 b 20 462 13 462 14 462 b 39 449 28 462 35 458 l 40 446 l 40 326 b 40 205 40 259 40 205 b 127 227 40 205 80 215 b 220 249 196 244 213 249 b 227 247 224 249 225 248 b 238 237 231 245 235 241 l 239 233 l 239 -106 l 239 -448 l 238 -451 b 219 -463 234 -459 225 -463 b 198 -451 210 -463 202 -459 l 197 -448 l 197 -324 b 197 -201 197 -248 197 -201 b 110 -223 196 -201 157 -210 b 17 -245 42 -240 24 -245 b 10 -242 13 -245 13 -244 b 0 -233 6 -241 2 -237 l 0 -230 l 0 108 l 0 446 l 0 449 b 10 460 2 453 6 458 m 197 22 b 197 70 197 41 197 58 b 196 116 197 113 197 116 l 196 116 b 118 97 196 116 160 106 l 40 77 l 40 -18 b 40 -112 40 -69 40 -112 l 119 -93 l 197 -73 l 197 22 \"},\n\"v51\":{\"x_min\":-1.359375,\"x_max\":455.96875,\"ha\":465,\"o\":\"m 352 541 b 357 542 353 542 355 542 b 377 530 364 542 372 537 l 378 526 l 378 394 l 379 262 l 404 266 b 436 270 420 269 430 270 b 450 265 443 270 446 269 b 455 220 455 259 455 260 l 455 208 l 455 161 l 454 156 b 411 140 449 147 447 147 b 378 133 393 137 379 134 b 378 68 378 133 378 106 b 378 22 378 54 378 38 l 379 -87 l 404 -83 b 436 -79 420 -80 430 -79 b 450 -84 443 -79 446 -80 b 455 -129 455 -90 455 -88 l 455 -141 l 455 -188 l 454 -192 b 413 -209 449 -202 447 -202 b 382 -215 398 -212 383 -215 l 378 -215 l 378 -345 l 378 -380 b 375 -485 378 -484 378 -480 b 357 -494 371 -491 364 -494 b 340 -485 351 -494 344 -491 b 336 -383 337 -480 336 -484 l 336 -349 l 336 -223 l 334 -223 b 291 -231 334 -223 314 -227 l 247 -240 l 247 -371 l 246 -503 l 245 -506 b 225 -519 242 -514 234 -519 b 206 -506 219 -519 210 -514 l 205 -503 l 205 -376 l 205 -248 l 160 -256 l 115 -265 l 115 -396 l 115 -527 l 114 -531 b 95 -544 110 -539 102 -544 b 76 -531 87 -544 78 -539 l 73 -527 l 73 -399 b 73 -273 73 -330 73 -273 b 49 -277 73 -273 61 -274 b 17 -281 32 -280 24 -281 b 4 -276 10 -281 8 -280 b -1 -234 0 -269 -1 -272 b 0 -219 -1 -229 0 -224 l 0 -170 l 1 -167 b 10 -158 2 -163 6 -159 b 49 -149 13 -156 16 -155 l 73 -145 l 73 -34 b 73 76 73 26 73 76 b 49 72 73 76 61 74 b 17 68 32 69 24 68 b 4 73 10 68 8 69 b -1 115 0 80 -1 77 b 0 130 -1 120 0 124 l 0 179 l 1 181 b 10 191 2 186 6 190 b 49 199 13 192 16 194 l 73 204 l 73 338 b 73 374 73 352 73 365 b 77 483 73 484 73 477 b 95 492 81 489 88 492 b 111 483 100 492 107 489 b 115 378 115 477 115 483 l 115 342 b 117 212 115 223 115 212 b 204 229 117 212 200 227 l 205 229 l 205 365 l 205 502 l 206 505 b 225 517 210 513 219 517 b 245 505 234 517 242 513 l 246 502 l 247 369 l 247 237 l 249 237 b 336 254 253 238 336 254 b 337 390 336 254 337 302 l 337 526 l 338 530 b 352 541 341 535 347 539 m 336 15 b 336 126 336 102 336 126 l 336 126 b 291 117 336 126 315 122 l 247 109 l 247 -1 l 247 -112 l 249 -112 b 336 -95 253 -111 336 -95 b 336 15 336 -95 336 -56 m 205 -120 b 205 -55 205 -120 205 -93 b 205 -9 205 -41 205 -24 l 205 101 l 160 93 l 115 84 l 115 -26 b 115 -83 115 -49 115 -69 b 117 -137 115 -133 115 -137 b 205 -120 118 -137 204 -120 \"},\n\"v52\":{\"x_min\":-10.890625,\"x_max\":298.078125,\"ha\":294,\"o\":\"m 138 473 b 142 474 140 473 141 474 b 164 459 148 474 153 470 b 191 402 183 442 191 423 b 181 353 191 388 187 371 b 178 349 179 352 178 349 b 179 348 178 348 179 348 b 185 349 181 348 182 348 b 255 376 210 355 234 363 b 272 381 264 381 266 381 b 298 355 287 381 298 370 b 288 330 298 348 298 345 b 171 34 238 254 194 141 b 166 13 168 16 168 16 b 144 1 161 5 152 1 b 121 15 134 1 125 5 b 115 33 119 18 117 24 b 0 330 91 145 49 252 b -10 355 -9 345 -10 348 b 13 381 -10 371 0 381 b 31 376 19 381 25 380 b 132 345 61 358 103 345 l 136 345 l 137 355 b 145 378 138 359 142 370 b 152 415 149 394 152 405 b 137 452 152 427 148 438 b 133 464 134 458 133 460 b 138 473 133 467 134 470 \"},\n\"v53\":{\"x_min\":0,\"x_max\":902.421875,\"ha\":921,\"o\":\"m 17 240 b 24 241 19 241 21 241 b 32 240 28 241 31 241 b 46 229 38 238 43 234 b 50 88 50 223 50 237 b 50 -1 50 63 50 34 b 50 -90 50 -36 50 -65 b 46 -231 50 -238 50 -224 b 25 -242 42 -238 34 -242 b 0 -224 14 -242 4 -235 b 0 2 0 -222 0 -108 b 0 223 0 112 0 220 b 17 240 2 230 9 237 m 110 240 b 118 241 111 241 114 241 b 126 240 121 241 123 241 b 142 223 133 237 140 230 b 144 123 144 220 144 205 b 144 29 144 45 144 29 b 144 29 144 29 144 29 b 393 183 166 106 264 167 b 450 186 412 184 431 186 b 756 29 600 186 732 120 b 756 29 756 29 756 29 b 758 123 758 29 758 45 b 760 227 758 226 758 223 b 784 241 766 237 774 241 b 804 229 792 241 800 237 b 809 88 808 223 809 237 l 809 -1 l 809 -90 b 804 -231 809 -238 808 -224 b 784 -242 800 -238 792 -242 b 762 -231 775 -242 766 -238 b 758 -124 756 -224 758 -231 b 756 -30 758 -47 758 -30 b 756 -30 756 -30 756 -30 b 509 -184 736 -108 637 -169 b 450 -187 488 -187 469 -187 b 144 -30 300 -187 168 -122 b 144 -30 144 -30 144 -30 b 144 -124 144 -30 144 -47 b 140 -231 144 -231 144 -224 b 118 -242 134 -238 126 -242 b 92 -224 107 -242 96 -235 b 92 2 92 -222 92 -108 b 92 223 92 112 92 220 b 110 240 95 230 102 237 m 432 161 b 413 162 426 162 420 162 b 313 41 351 162 313 109 b 347 -73 313 5 323 -34 b 487 -163 385 -133 439 -163 b 578 -97 526 -163 562 -142 b 588 -43 585 -80 588 -62 b 432 161 588 47 518 147 m 868 240 b 876 241 869 241 872 241 b 884 240 879 241 882 241 b 898 229 890 238 894 234 b 902 88 902 223 902 237 l 902 -1 l 902 -90 b 898 -231 902 -238 902 -224 b 876 -242 892 -238 884 -242 b 852 -224 865 -242 854 -235 b 850 2 850 -222 850 -108 b 852 223 850 112 850 220 b 868 240 853 230 860 237 \"},\n\"v54\":{\"x_min\":-24.5,\"x_max\":317.140625,\"ha\":324,\"o\":\"m -24 -161 l -24 -5 l -20 -5 b 0 -24 -9 -5 -2 -12 b 171 -315 21 -124 84 -233 b 317 -660 268 -406 317 -531 b 187 -1014 317 -782 274 -909 b 161 -1034 172 -1034 171 -1034 b 141 -1013 149 -1034 141 -1025 b 152 -991 141 -1004 142 -1002 b 266 -682 228 -899 266 -788 b 174 -430 266 -588 236 -498 b -23 -317 136 -388 66 -348 b -24 -161 -23 -316 -24 -285 \"},\n\"v55\":{\"x_min\":0,\"x_max\":551.25,\"ha\":563,\"o\":\"m 289 644 b 304 645 294 645 299 645 b 404 566 349 645 392 613 b 406 541 405 557 406 549 b 379 471 406 514 397 489 l 377 467 l 382 470 b 509 591 438 485 485 531 b 513 601 510 595 513 599 b 530 609 518 607 524 609 b 551 588 540 609 551 602 b 200 -605 551 584 204 -599 b 182 -616 197 -612 190 -616 b 163 -602 174 -616 166 -610 b 161 -598 161 -601 161 -601 b 217 -402 161 -589 170 -562 b 272 -213 247 -298 272 -213 b 272 -213 272 -213 272 -213 b 264 -219 272 -213 268 -216 b 140 -262 227 -247 182 -262 b 36 -226 102 -262 65 -249 b 0 -145 12 -206 0 -176 b 17 -84 0 -124 5 -104 b 103 -38 38 -54 70 -38 b 191 -91 137 -38 172 -56 b 205 -141 201 -106 205 -124 b 178 -212 205 -167 196 -194 l 175 -215 l 182 -213 b 307 -93 236 -198 284 -151 b 372 129 308 -88 372 127 b 372 129 372 129 372 129 b 364 122 372 129 368 126 b 240 80 328 94 283 80 b 137 115 202 80 166 91 b 99 195 112 136 99 165 b 118 256 99 217 106 238 b 204 303 138 287 171 303 b 292 249 238 303 273 285 b 306 199 302 234 306 217 b 279 129 306 173 296 148 l 276 126 l 281 127 b 408 248 336 142 385 190 b 473 470 409 254 473 469 b 473 470 473 470 473 470 b 465 464 473 470 469 467 b 341 421 428 435 383 421 b 236 458 303 421 266 433 b 200 537 212 478 200 508 b 289 644 200 585 234 635 \"},\n\"v58\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 259 1553 b 265 1553 261 1553 264 1553 b 288 1540 272 1553 277 1550 b 367 1351 340 1493 367 1424 b 336 1221 367 1308 357 1263 l 332 1211 l 333 1208 b 367 1077 356 1170 367 1124 b 336 945 367 1032 357 986 l 332 935 l 333 932 b 367 800 356 893 367 848 b 336 669 367 756 357 710 l 332 659 l 333 656 b 367 523 356 617 367 571 b 345 412 367 485 360 446 b 231 273 322 356 284 310 b -1 19 121 195 27 93 b -17 4 -4 11 -10 5 l -21 4 l -21 134 l -21 265 l -17 265 b 133 291 20 265 96 278 b 318 537 245 328 318 433 b 307 603 318 559 315 582 b 303 614 304 612 304 614 b 298 609 302 614 300 613 b 231 549 281 589 258 567 b -1 295 121 471 27 369 b -17 280 -4 287 -10 281 l -21 280 l -21 410 l -21 541 l -17 541 b 133 567 20 541 96 555 b 318 813 245 605 318 709 b 307 880 318 835 315 859 b 303 891 304 888 304 891 b 298 885 302 891 300 888 b 231 825 281 866 258 843 b -1 571 121 748 27 645 b -17 556 -4 563 -10 557 l -21 556 l -21 687 l -21 817 l -17 817 b 133 843 20 817 96 830 b 318 1089 245 881 318 985 b 307 1156 318 1111 315 1134 b 303 1167 304 1164 304 1167 b 298 1161 302 1167 300 1164 b 231 1102 281 1140 258 1120 b -1 848 121 1024 27 921 b -17 832 -4 839 -10 834 l -21 832 l -21 963 l -21 1093 l -17 1093 b 114 1113 12 1093 78 1103 b 313 1314 215 1142 289 1218 b 318 1364 317 1331 318 1347 b 255 1511 318 1422 295 1478 b 243 1532 247 1519 243 1525 b 259 1553 243 1540 250 1550 \"},\n\"v59\":{\"x_min\":0,\"x_max\":464.140625,\"ha\":474,\"o\":\"m 0 0 l 0 347 l 76 347 l 153 347 l 153 0 l 153 -348 l 76 -348 l 0 -348 l 0 0 m 308 -1 l 308 347 l 386 347 l 464 347 l 464 -1 l 464 -348 l 386 -348 l 308 -348 l 308 -1 \"},\n\"v5a\":{\"x_min\":-171.5,\"x_max\":170.140625,\"ha\":174,\"o\":\"m -6 566 b 0 567 -5 567 -2 567 b 14 556 6 567 12 563 b 92 285 14 555 50 433 b 170 13 166 33 170 19 b 168 13 170 13 170 13 b 161 1 168 8 167 4 l 159 0 l 122 0 l 84 0 l 81 1 b 21 195 76 5 78 -5 b -32 381 -8 297 -32 381 b -87 197 -32 381 -57 298 b -141 8 -115 94 -140 9 b -155 0 -142 2 -149 0 b -171 15 -163 0 -171 5 b -14 556 -171 18 -24 528 b -6 566 -14 560 -10 564 \"},\n\"v5b\":{\"x_min\":-441,\"x_max\":439.640625,\"ha\":449,\"o\":\"m -428 -2 b -421 0 -427 -1 -424 0 b -406 -6 -416 0 -409 -2 b -400 -31 -401 -12 -400 -15 b -1 -352 -392 -215 -215 -352 b 58 -349 19 -352 38 -351 b 398 -31 250 -326 392 -192 b 404 -6 398 -15 400 -12 b 419 -1 408 -2 413 -1 b 439 -13 427 -1 435 -5 b 439 -29 439 -16 439 -22 b 434 -105 439 -48 438 -80 b 0 -489 397 -333 213 -489 b -68 -484 -23 -489 -44 -488 b -441 -36 -280 -452 -436 -263 b -441 -30 -441 -34 -441 -31 b -428 -2 -441 -11 -439 -5 m -13 -9 b -1 -8 -9 -8 -5 -8 b 50 -36 19 -8 39 -19 b 61 -72 57 -47 61 -59 b 50 -106 61 -84 57 -97 b -1 -134 39 -124 19 -134 b -46 -115 -17 -134 -34 -129 b -62 -72 -57 -102 -62 -87 b -13 -9 -62 -44 -44 -16 \"},\n\"v5c\":{\"x_min\":0,\"x_max\":447.8125,\"ha\":457,\"o\":\"m 0 -87 l 0 0 l 223 0 l 447 0 l 447 -87 l 447 -174 l 223 -174 l 0 -174 l 0 -87 \"},\n\"v5d\":{\"x_min\":-1.359375,\"x_max\":592.078125,\"ha\":604,\"o\":\"m 280 692 b 295 694 283 692 289 694 b 310 692 300 694 307 692 b 357 630 340 684 357 657 b 336 580 357 612 351 594 b 311 538 321 566 311 549 b 352 492 311 512 330 492 b 366 495 357 492 362 492 b 397 553 390 503 397 517 b 415 603 397 576 402 591 b 460 623 427 617 443 623 b 509 599 479 623 498 614 b 522 559 518 587 522 573 b 494 506 522 538 513 519 b 451 495 481 498 473 496 b 415 488 432 495 426 494 b 394 449 404 483 394 464 b 394 448 394 448 394 448 l 394 440 l 397 433 b 428 409 404 420 413 413 b 438 408 431 408 435 408 b 479 431 450 408 462 415 b 528 455 495 448 510 455 b 548 452 534 455 541 453 b 592 391 577 442 592 416 b 549 331 592 365 577 340 b 528 327 541 328 534 327 b 479 351 510 327 495 335 b 438 374 464 367 450 374 b 417 369 431 374 424 373 b 394 333 402 360 394 348 b 400 312 394 326 396 319 b 451 287 408 294 420 288 b 513 258 484 285 499 278 b 522 223 519 247 522 234 b 461 159 522 190 496 159 b 449 161 457 159 453 159 b 397 229 416 167 397 191 b 366 288 397 265 390 278 b 352 290 362 290 357 290 b 315 262 336 290 321 280 b 311 245 313 256 311 251 b 334 204 311 233 318 220 b 355 170 348 190 351 184 b 357 152 356 166 357 159 b 355 136 357 147 356 140 b 295 88 345 104 321 88 b 232 152 264 88 232 112 b 255 204 232 174 238 186 b 279 244 273 222 279 231 l 279 245 b 238 290 279 270 259 290 b 224 288 234 290 228 290 b 193 229 200 278 193 265 b 141 161 193 191 174 167 b 129 159 137 159 133 159 b 68 223 93 159 68 190 b 77 258 68 234 70 247 b 138 287 91 278 106 285 b 185 302 166 287 175 291 b 196 333 193 312 196 323 b 174 369 196 347 187 360 b 152 374 166 373 159 374 b 111 351 140 374 126 367 b 62 327 95 335 80 327 b 51 328 58 327 54 327 b -1 391 16 334 -1 363 b 53 455 -1 420 17 449 b 62 455 57 455 59 455 b 111 431 80 455 95 448 b 152 408 127 415 140 408 b 161 409 155 408 159 408 b 193 433 176 413 186 420 l 196 440 l 196 448 b 196 451 196 449 196 449 b 190 471 196 459 194 463 b 137 495 182 489 167 495 l 134 495 l 134 495 b 68 560 95 495 68 521 b 129 623 68 596 95 623 b 144 621 134 623 138 623 b 193 553 175 614 193 589 b 224 495 193 517 200 503 b 238 492 228 492 234 492 b 279 538 259 492 279 512 b 254 580 279 549 269 566 b 232 630 239 594 232 612 b 280 692 232 657 250 684 m 307 456 b 295 458 303 458 299 458 b 230 391 258 458 230 426 b 236 360 230 381 231 371 b 295 324 249 337 272 324 b 353 360 318 324 341 337 b 360 391 357 370 360 381 b 307 456 360 421 340 451 \"},\n\"v60\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m -367 173 b -362 174 -366 174 -364 174 b -351 173 -357 174 -353 173 b -262 86 -348 172 -328 151 b -176 0 -216 37 -176 0 b -107 84 -176 0 -145 37 b -31 174 -36 173 -38 172 b -25 174 -29 174 -28 174 b -16 173 -23 174 -19 173 b 72 86 -13 172 6 151 b 157 0 119 37 157 0 b 227 84 159 0 189 37 b 303 174 298 173 296 172 b 308 174 304 174 307 174 b 318 173 313 174 317 173 b 481 11 322 172 357 134 l 494 -1 l 522 34 b 560 76 553 72 555 74 b 567 77 563 77 564 77 b 589 56 579 77 589 68 b 586 48 589 54 588 51 b 411 -172 583 41 416 -166 b 397 -176 406 -174 401 -176 b 387 -174 393 -176 390 -176 b 299 -87 386 -173 366 -152 b 213 0 253 -38 213 0 b 144 -86 213 0 182 -38 b 68 -174 73 -174 74 -173 b 62 -176 66 -176 65 -176 b 53 -174 59 -176 55 -174 b -35 -87 50 -173 29 -152 b -121 0 -83 -38 -121 0 b -190 -86 -122 0 -152 -38 b -266 -174 -261 -174 -259 -173 b -272 -176 -268 -176 -270 -176 b -281 -174 -276 -176 -280 -174 b -371 -86 -284 -173 -304 -152 b -457 0 -417 -38 -457 0 l -457 0 b -477 -26 -457 0 -470 -16 b -548 -227 -524 -88 -548 -161 b -536 -303 -548 -254 -544 -280 b -533 -317 -534 -309 -533 -313 b -553 -338 -533 -330 -541 -338 b -577 -315 -566 -338 -571 -333 b -590 -227 -586 -287 -590 -258 b -518 -9 -590 -154 -564 -77 b -465 56 -509 2 -504 8 l -402 134 b -367 173 -375 169 -372 172 \"},\n\"v62\":{\"x_min\":46.28125,\"x_max\":669.671875,\"ha\":563,\"o\":\"m 183 376 b 189 376 185 376 187 376 b 212 374 197 376 208 376 b 265 337 234 369 253 355 b 274 317 268 331 273 320 b 274 316 274 317 274 316 b 280 323 276 316 276 319 b 311 358 288 337 299 348 b 319 366 315 360 318 365 b 356 376 326 373 340 376 b 382 371 364 376 374 374 b 428 337 400 366 417 352 b 436 317 431 331 436 320 b 438 316 436 317 436 316 b 442 323 438 316 439 319 b 475 358 451 337 462 348 b 483 366 477 360 481 365 b 518 376 488 373 503 376 b 544 373 528 376 536 376 b 604 285 579 360 604 326 b 597 249 604 273 601 258 b 543 63 596 247 544 70 b 541 54 543 61 541 55 b 540 44 540 51 540 47 b 552 23 540 33 545 23 b 552 23 552 23 552 23 b 647 126 586 29 627 72 b 658 138 651 136 653 138 b 660 138 660 138 660 138 b 669 129 666 137 669 136 b 654 88 669 122 665 109 b 562 -12 631 43 602 9 l 549 -19 b 521 -27 540 -24 530 -27 b 447 30 490 -27 458 -4 b 443 58 445 38 443 48 b 450 93 443 72 446 84 b 504 278 453 97 504 272 b 507 288 506 283 506 287 b 509 298 507 292 509 295 b 491 326 509 310 502 320 b 487 327 490 327 488 327 b 479 324 484 327 483 326 b 441 270 462 316 443 288 b 435 249 441 265 436 254 b 398 127 434 248 419 195 b 362 4 379 61 362 5 b 328 -1 359 -1 362 -1 b 314 -1 323 -1 319 -1 b 302 -1 310 -1 306 -1 b 266 4 266 -1 269 -1 b 265 6 265 5 265 5 b 303 144 265 13 272 34 b 343 278 325 216 343 276 b 344 288 343 281 344 285 b 345 298 345 291 345 295 b 330 326 345 310 340 320 b 323 327 328 327 325 327 b 317 324 322 327 321 326 b 279 270 300 316 281 288 b 273 249 279 265 274 254 b 236 127 272 248 255 195 b 200 4 216 61 200 5 b 164 -1 197 -1 198 -1 b 151 -1 161 -1 156 -1 b 140 -1 147 -1 142 -1 b 103 4 104 -1 106 -1 b 103 6 103 5 103 5 b 141 144 103 13 108 34 b 181 278 161 216 179 276 b 182 288 181 281 181 285 b 183 298 182 291 183 295 b 168 324 183 310 178 320 b 160 327 166 326 163 327 b 141 320 156 327 151 324 b 69 230 112 305 85 272 b 57 215 65 217 62 215 b 55 215 57 215 55 215 b 46 224 49 215 46 217 b 59 260 46 231 50 242 b 151 363 81 306 112 341 b 161 369 155 365 160 367 b 183 376 166 371 174 374 \"},\n\"v68\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 155 11 -5 172 43 123 l 166 -1 l 168 1 l 170 4 l 170 130 b 171 260 170 256 170 258 b 191 274 175 269 183 274 b 205 267 196 274 201 272 b 212 158 212 262 210 273 l 212 56 l 257 112 b 311 173 304 172 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 216 -6 221 -1 219 -2 l 212 -12 l 212 -147 b 212 -210 212 -173 212 -194 b 205 -292 212 -297 210 -287 b 191 -299 201 -297 196 -299 b 172 -287 183 -299 175 -295 b 170 -174 171 -284 171 -284 l 170 -63 l 127 -117 b 73 -176 84 -170 80 -176 b 68 -176 72 -176 70 -176 b -27 -87 59 -174 65 -180 b -114 0 -74 -38 -112 0 b -182 -86 -114 0 -145 -38 b -258 -174 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 \"},\n\"v6c\":{\"x_min\":-1.359375,\"x_max\":193.28125,\"ha\":197,\"o\":\"m 78 233 b 87 233 81 233 84 233 b 187 140 132 233 174 195 b 193 102 190 127 193 115 b 43 -113 193 22 136 -62 b 27 -119 36 -116 31 -119 b 19 -108 21 -119 19 -115 b 29 -97 19 -102 20 -101 b 102 13 73 -72 102 -27 b 92 51 102 26 98 40 l 91 54 l 84 54 b 8 104 53 54 21 74 b -1 142 1 116 -1 130 b 78 233 -1 187 31 227 \"},\n\"v6d\":{\"x_min\":-590.71875,\"x_max\":589.359375,\"ha\":601,\"o\":\"m 544 335 b 553 337 548 337 551 337 b 575 313 563 337 570 330 b 589 226 583 285 589 256 b 517 8 589 152 563 76 b 464 -58 507 -4 503 -9 l 401 -136 b 362 -176 372 -172 370 -176 b 357 -176 360 -176 359 -176 b 261 -87 349 -174 355 -180 b 175 0 215 -38 175 0 b 106 -86 175 0 144 -38 b 29 -174 35 -174 36 -173 b 24 -176 28 -176 27 -176 b 14 -174 21 -176 17 -174 b -73 -87 12 -173 -8 -152 b -159 0 -121 -38 -159 0 b -228 -86 -160 0 -190 -38 b -304 -174 -299 -174 -298 -173 b -310 -176 -306 -176 -308 -176 b -319 -174 -314 -176 -318 -174 b -483 -12 -323 -173 -359 -137 l -495 0 l -524 -34 b -562 -77 -553 -73 -556 -76 b -568 -79 -564 -79 -566 -79 b -590 -58 -581 -79 -590 -69 b -588 -49 -590 -55 -589 -52 b -412 170 -585 -43 -417 165 b -398 174 -408 173 -402 174 b -389 173 -394 174 -392 174 b -300 86 -387 172 -366 151 b -215 -1 -254 37 -215 -1 b -145 84 -215 -1 -183 37 b -69 173 -74 173 -76 172 b -63 174 -68 174 -66 174 b -54 173 -61 174 -57 173 b 34 86 -51 172 -31 151 b 119 -1 81 37 119 -1 b 189 84 121 -1 151 37 b 265 173 259 173 258 172 b 270 174 266 174 269 174 b 280 173 274 174 279 173 b 370 84 283 172 303 151 b 455 -1 416 37 455 -1 l 455 -1 b 476 24 455 -1 469 15 b 547 226 522 87 547 159 b 534 302 547 252 543 278 b 532 317 533 308 532 313 b 544 335 532 326 536 333 \"},\n\"v6f\":{\"x_min\":-80.3125,\"x_max\":78.9375,\"ha\":81,\"o\":\"m 63 191 b 69 192 65 192 66 192 b 77 188 72 192 76 191 b 78 183 78 187 78 186 b 74 158 78 179 77 172 l 66 115 b 9 -161 49 30 10 -158 b -10 -187 6 -172 -1 -181 b -34 -194 -17 -191 -25 -194 b -80 -147 -58 -194 -80 -174 b -80 -141 -80 -144 -80 -142 b 9 70 -80 -134 -73 -117 l 49 163 b 63 191 59 188 61 190 \"},\n\"v70\":{\"x_min\":0,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 190 b 217 191 215 191 216 191 b 231 184 223 191 228 188 b 249 154 240 167 246 159 b 419 18 292 91 348 45 b 436 -1 435 11 436 8 b 424 -16 436 -9 434 -13 b 308 -87 394 -26 340 -59 b 231 -186 276 -117 257 -142 b 219 -192 228 -191 225 -192 b 198 -174 209 -192 208 -191 b 47 -33 161 -113 110 -63 b 10 -16 34 -26 17 -19 b 0 -1 2 -13 0 -9 b 17 18 0 8 1 11 b 198 173 95 48 156 101 b 213 190 206 187 208 188 \"},\n\"v72\":{\"x_min\":-423.3125,\"x_max\":421.9375,\"ha\":431,\"o\":\"m -262 197 b -247 197 -257 197 -253 197 b -118 162 -210 197 -163 184 b 40 45 -61 134 -13 98 b 277 -95 119 -33 200 -81 b 289 -97 281 -97 285 -97 b 378 0 332 -97 371 -55 b 378 11 378 4 378 6 b 302 83 378 55 345 83 b 242 66 283 83 262 77 b 208 56 231 59 219 56 b 148 120 175 56 148 81 b 201 186 148 151 164 172 b 261 198 220 194 240 198 b 420 45 341 198 411 136 b 421 22 421 37 421 29 b 245 -199 421 -93 338 -199 b 238 -198 243 -199 240 -199 b -44 -47 148 -194 50 -141 b -250 86 -114 22 -183 66 b -295 94 -270 91 -283 94 b -315 91 -302 94 -307 94 b -381 4 -356 81 -381 43 b -355 -56 -381 -18 -372 -40 b -298 -81 -338 -73 -319 -81 b -246 -68 -283 -81 -265 -77 b -212 -58 -234 -61 -223 -58 b -178 -69 -200 -58 -189 -62 b -151 -122 -160 -81 -151 -101 b -171 -167 -151 -138 -157 -155 b -239 -195 -185 -181 -213 -192 b -257 -197 -245 -197 -250 -197 b -423 -5 -352 -197 -423 -109 b -412 65 -423 16 -419 40 b -262 197 -389 137 -329 188 \"},\n\"v74\":{\"x_min\":-206.890625,\"x_max\":428.75,\"ha\":438,\"o\":\"m 389 -351 b 394 -351 390 -351 393 -351 b 428 -385 413 -351 428 -367 b 428 -394 428 -388 428 -391 b 394 -428 426 -406 421 -410 l 332 -473 l 269 -516 l 205 -560 l 141 -603 l 77 -648 l 13 -692 l -50 -737 l -114 -780 l -145 -802 b -171 -813 -157 -810 -163 -813 b -175 -813 -172 -813 -174 -813 b -206 -777 -194 -811 -206 -795 b -202 -760 -206 -771 -205 -766 b -87 -675 -197 -752 -206 -757 l -34 -639 l 83 -557 l 145 -514 l 209 -470 l 272 -427 b 389 -351 375 -356 381 -352 \"},\n\"v75\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -137 381 b -130 383 -134 383 -133 383 b -111 371 -122 383 -114 378 b -55 224 -110 370 -85 305 b 0 80 -25 145 -1 80 b 54 224 0 80 24 145 b 112 377 114 384 110 373 b 127 384 118 381 122 384 b 148 362 138 384 148 374 l 148 356 l 83 183 b 16 9 47 88 17 11 b -1 0 12 2 5 0 b -14 5 -5 0 -10 1 b -84 183 -19 9 -13 -6 l -149 356 l -149 362 b -137 381 -149 371 -145 378 \"},\n\"v78\":{\"x_min\":0,\"x_max\":193.28125,\"ha\":197,\"o\":\"m 85 514 b 95 517 88 517 89 517 b 114 505 103 517 110 513 l 115 502 l 115 376 b 115 249 115 306 115 249 b 141 258 117 249 127 252 l 167 266 l 172 266 b 190 254 181 265 187 262 l 193 251 l 193 202 l 193 188 b 187 147 193 149 191 152 b 147 130 183 142 182 141 l 115 119 l 115 9 b 115 -99 115 -51 115 -99 b 141 -91 115 -99 127 -95 b 171 -81 166 -81 167 -81 l 171 -81 b 191 -94 181 -81 189 -87 b 193 -142 191 -97 193 -120 b 191 -195 193 -167 191 -194 b 125 -227 187 -205 187 -204 l 115 -230 l 115 -366 l 115 -503 l 114 -506 b 95 -519 110 -514 102 -519 b 74 -506 87 -519 78 -514 l 73 -503 l 73 -374 b 73 -245 73 -260 73 -245 b 73 -245 73 -245 73 -245 b 55 -252 72 -245 63 -249 l 32 -260 b 19 -263 27 -262 23 -263 b 4 -256 13 -263 8 -260 b 0 -215 0 -251 0 -254 b 0 -199 0 -210 0 -206 l 0 -152 l 1 -149 b 8 -140 2 -145 5 -141 b 42 -127 9 -140 24 -133 l 73 -116 l 73 -5 b 73 23 73 4 73 15 b 73 105 73 70 73 105 b 49 97 73 105 61 101 b 17 88 32 91 23 88 b 4 95 10 88 8 91 b 0 137 0 101 0 98 b 0 151 0 141 0 145 l 0 199 l 1 202 b 43 224 5 212 5 212 l 73 234 l 73 367 l 73 502 l 74 505 b 85 514 77 509 81 513 \"},\n\"v79\":{\"x_min\":-1.359375,\"x_max\":899.703125,\"ha\":918,\"o\":\"m 307 349 b 332 351 315 351 323 351 b 443 340 367 351 408 347 b 741 47 607 306 720 195 b 744 0 743 31 744 16 b 660 -303 744 -90 713 -206 b 28 -755 534 -531 304 -695 b 14 -756 23 -755 19 -756 b -1 -741 4 -756 -1 -750 b 21 -720 -1 -731 1 -728 b 567 -56 337 -601 548 -344 b 568 -11 568 -41 568 -24 b 442 285 568 129 525 233 b 325 319 406 308 367 319 b 93 177 232 319 137 266 b 84 154 91 170 84 155 b 84 154 84 154 84 154 b 88 156 84 154 85 155 b 159 177 110 170 134 177 b 257 134 194 177 231 162 b 294 41 281 108 294 73 b 171 -97 294 -24 246 -90 b 156 -98 166 -97 161 -98 b 6 74 73 -98 6 -22 b 6 80 6 76 6 79 b 307 349 10 223 141 340 m 839 215 b 845 216 841 216 842 216 b 862 213 852 216 860 215 b 899 163 887 206 899 184 b 872 117 899 145 890 127 b 847 111 865 112 856 111 b 808 130 833 111 818 117 b 796 162 800 140 796 151 b 839 215 796 187 812 212 m 839 -112 b 845 -112 841 -112 842 -112 b 862 -115 852 -112 860 -113 b 899 -165 887 -122 899 -144 b 872 -210 899 -183 890 -201 b 847 -217 865 -215 856 -217 b 808 -198 833 -217 818 -210 b 796 -165 800 -188 796 -177 b 839 -112 796 -140 812 -116 \"},\n\"v7a\":{\"x_min\":-1.359375,\"x_max\":386.5625,\"ha\":394,\"o\":\"m 249 535 b 257 537 251 537 253 537 b 276 524 266 537 273 533 l 277 521 l 279 419 l 279 316 l 304 323 b 337 328 319 326 330 328 b 353 316 347 328 349 324 b 355 266 355 315 355 290 b 353 215 355 241 355 217 b 319 198 349 206 347 205 b 279 187 284 190 279 188 b 279 156 279 187 279 174 b 279 136 279 151 279 144 l 279 84 l 289 87 l 330 98 b 367 105 352 102 362 105 b 378 101 372 105 375 104 b 386 61 385 95 386 94 b 386 40 386 55 386 48 l 386 -5 l 385 -8 b 374 -19 383 -12 378 -18 b 291 -40 372 -19 347 -26 b 279 -43 284 -41 279 -43 b 279 -83 279 -43 279 -59 b 279 -95 279 -87 279 -91 l 279 -145 l 304 -140 b 337 -133 321 -136 330 -133 b 349 -140 343 -133 347 -136 b 355 -181 355 -145 355 -142 l 355 -197 l 355 -210 b 349 -252 355 -249 355 -247 b 300 -269 345 -258 347 -258 b 280 -274 291 -272 281 -273 l 279 -274 l 277 -378 l 277 -483 l 276 -487 b 257 -499 273 -495 265 -499 b 238 -487 249 -499 242 -495 l 236 -483 l 236 -384 l 236 -285 l 235 -285 l 212 -291 l 170 -301 b 148 -308 159 -305 148 -306 b 147 -415 147 -308 147 -313 l 147 -523 l 145 -526 b 126 -538 141 -534 133 -538 b 106 -526 118 -538 110 -534 l 104 -523 l 104 -420 b 103 -317 104 -326 104 -317 b 103 -317 103 -317 103 -317 b 50 -330 92 -322 54 -330 b 31 -317 42 -330 35 -326 b 29 -267 29 -315 29 -315 l 29 -219 l 32 -216 b 92 -192 36 -206 36 -206 l 104 -190 l 104 -138 b 103 -87 104 -91 104 -87 b 103 -87 103 -87 103 -87 b 88 -91 103 -87 96 -88 l 49 -101 b 17 -106 32 -105 23 -106 b 6 -102 13 -106 10 -105 b -1 -62 0 -97 -1 -95 b 0 -41 -1 -56 0 -49 l 0 4 l 1 6 b 10 16 2 11 6 15 b 91 37 12 18 38 24 l 104 41 l 104 93 b 103 144 104 140 104 144 b 103 144 103 144 103 144 b 50 131 92 141 54 131 b 31 144 42 131 35 137 b 29 195 29 147 29 148 l 29 242 l 32 245 b 92 269 36 255 36 255 l 104 273 l 104 377 l 104 481 l 106 485 b 126 498 110 492 118 498 b 134 495 129 498 132 496 b 145 485 138 494 142 489 l 147 481 l 147 383 l 147 283 l 152 284 b 190 294 155 285 171 290 l 230 303 l 236 305 l 236 413 l 236 521 l 238 524 b 249 535 240 528 243 533 m 236 126 b 235 177 236 154 236 177 l 235 177 b 213 172 235 177 225 174 l 170 161 b 147 155 157 158 147 155 b 147 124 147 155 147 142 b 147 102 147 117 147 111 l 147 52 l 153 54 l 228 72 l 236 74 l 236 126 m 236 -105 b 235 -54 236 -65 236 -54 l 235 -54 b 231 -55 235 -54 234 -54 b 172 -69 227 -55 204 -62 l 149 -76 l 147 -76 l 147 -127 l 147 -179 l 152 -177 b 190 -167 155 -177 171 -173 l 230 -158 l 236 -156 l 236 -105 \"},\n\"v7c\":{\"x_min\":0,\"x_max\":300.8125,\"ha\":307,\"o\":\"m 49 505 b 53 506 50 505 51 506 b 70 496 58 506 62 503 b 81 485 73 492 78 488 l 96 473 l 111 459 l 122 449 l 134 438 l 182 396 l 255 330 b 292 291 292 298 292 298 l 292 290 l 292 284 l 283 270 b 209 36 234 197 209 113 b 288 -170 209 -44 235 -119 b 299 -184 295 -179 299 -181 b 300 -191 300 -187 300 -188 b 285 -206 300 -199 294 -206 b 280 -206 283 -206 281 -206 b 247 -201 270 -202 259 -201 b 176 -222 223 -201 197 -208 b 114 -340 136 -249 114 -292 b 172 -471 114 -384 134 -433 b 185 -492 182 -481 185 -487 b 181 -502 185 -496 183 -499 b 171 -508 176 -505 174 -508 b 152 -498 166 -508 160 -503 b 0 -284 65 -428 12 -352 b 0 -260 0 -278 0 -270 b 1 -238 0 -252 0 -242 b 148 -140 16 -177 73 -140 b 209 -148 167 -140 189 -142 b 215 -149 212 -148 215 -149 b 215 -149 215 -149 215 -149 l 215 -149 b 201 -136 215 -148 209 -142 l 157 -97 l 96 -41 b 17 34 21 24 17 29 b 17 37 17 36 17 36 b 17 38 17 37 17 38 b 25 56 17 44 17 44 b 110 298 81 131 110 219 b 46 474 110 367 88 431 b 38 491 40 480 38 487 b 49 505 38 498 42 502 \"},\n\"v7d\":{\"x_min\":-1.359375,\"x_max\":436.921875,\"ha\":446,\"o\":\"m 213 205 b 217 205 215 205 216 205 b 234 194 224 205 234 199 b 236 187 234 194 235 190 l 245 167 l 261 129 l 270 106 b 355 -61 294 54 329 -13 b 420 -163 381 -105 402 -138 b 436 -188 435 -184 436 -184 b 436 -191 436 -190 436 -190 b 421 -206 436 -201 431 -206 l 421 -206 l 416 -206 l 405 -201 b 217 -158 347 -172 283 -158 b 31 -201 153 -158 88 -172 l 20 -206 l 14 -206 l 14 -206 b 0 -191 5 -206 0 -201 b -1 -188 0 -190 -1 -190 b 14 -163 -1 -186 0 -184 b 95 -34 36 -136 72 -77 b 166 106 119 8 148 68 l 175 129 l 183 148 l 200 188 b 213 205 205 199 208 202 \"},\n\"v7f\":{\"x_min\":0,\"x_max\":367.5,\"ha\":375,\"o\":\"m 0 124 l 0 187 l 61 187 l 122 187 l 122 138 l 122 91 l 153 61 l 183 30 l 213 61 l 243 91 l 243 138 l 243 187 l 306 187 l 367 187 l 367 124 l 367 61 l 321 61 l 274 61 l 243 30 l 213 0 l 243 -31 l 274 -62 l 321 -62 l 367 -62 l 367 -124 l 367 -188 l 306 -188 l 243 -188 l 243 -140 l 243 -93 l 213 -62 l 183 -31 l 153 -62 l 122 -93 l 122 -140 l 122 -188 l 61 -188 l 0 -188 l 0 -124 l 0 -62 l 46 -62 l 92 -62 l 123 -31 l 153 0 l 123 30 l 92 61 l 46 61 l 0 61 l 0 124 \"},\n\"v80\":{\"x_min\":29.9375,\"x_max\":420.578125,\"ha\":371,\"o\":\"m 115 345 b 221 347 117 345 166 347 b 411 345 306 347 409 345 b 420 330 416 342 420 335 b 415 319 420 326 419 321 b 178 118 397 303 179 118 b 178 117 178 118 178 117 b 181 117 178 117 178 117 b 189 117 182 117 185 117 b 193 117 190 117 191 117 b 247 98 215 117 232 111 b 296 75 266 83 280 76 b 302 75 299 75 300 75 b 322 91 311 75 315 79 b 322 91 322 91 322 91 b 322 91 322 91 322 91 b 319 91 322 91 321 91 b 313 90 318 90 315 90 b 283 107 300 90 288 97 b 277 126 279 114 277 121 b 319 167 277 149 295 167 b 319 167 319 167 319 167 b 362 118 347 167 362 147 b 355 82 362 108 359 96 b 311 33 349 65 340 55 b 224 1 284 12 253 1 b 194 5 213 1 204 2 b 168 18 183 8 178 11 b 110 36 151 30 130 36 b 57 15 88 36 68 29 b 47 11 54 12 51 11 b 31 20 40 11 34 13 b 29 26 31 22 29 25 b 68 66 29 36 39 45 b 285 250 73 71 281 248 b 285 250 285 250 285 250 b 231 252 285 252 261 252 b 137 250 190 252 141 250 b 93 227 122 248 110 241 b 78 220 88 222 83 220 b 66 227 74 220 70 222 b 63 234 65 229 63 231 b 85 291 63 241 69 252 b 115 345 108 342 108 344 \"},\n\"v81\":{\"x_min\":0,\"x_max\":428.75,\"ha\":438,\"o\":\"m 262 186 b 273 186 266 186 272 186 b 274 186 273 186 274 186 b 285 186 274 186 280 186 b 428 48 375 181 428 122 b 386 -68 428 12 416 -29 b 155 -187 329 -145 236 -187 b 12 -111 92 -187 38 -162 b 0 -51 4 -91 0 -72 b 262 186 0 58 122 179 m 366 131 b 352 134 362 133 357 134 b 219 81 321 134 269 115 b 47 -111 126 23 50 -62 b 47 -112 47 -111 47 -112 b 77 -136 47 -129 58 -136 b 264 -45 118 -136 194 -101 b 382 109 336 12 382 76 b 366 131 382 120 377 129 \"},\n\"v83\":{\"x_min\":-1.359375,\"x_max\":847.96875,\"ha\":865,\"o\":\"m 488 1499 b 495 1500 490 1500 492 1500 b 541 1465 507 1500 521 1490 b 679 1078 622 1372 679 1210 b 677 1050 679 1068 677 1060 b 477 642 668 893 604 764 l 443 609 l 431 596 l 431 592 l 438 562 l 449 508 l 460 458 b 481 355 475 390 481 355 b 481 355 481 355 481 355 b 490 356 481 355 485 355 b 528 358 495 356 511 358 b 558 356 540 358 552 356 b 839 95 699 338 808 237 b 847 22 845 72 847 47 b 631 -303 847 -113 766 -242 b 620 -309 623 -308 620 -309 l 620 -310 b 631 -359 620 -310 626 -333 l 646 -435 l 660 -496 b 672 -588 668 -535 672 -563 b 664 -653 672 -610 669 -630 b 383 -875 630 -792 509 -875 b 201 -810 321 -875 257 -855 b 129 -680 151 -768 129 -730 b 274 -530 129 -592 200 -530 b 351 -553 300 -530 326 -538 b 412 -669 393 -582 412 -626 b 287 -805 412 -735 366 -800 l 279 -805 l 285 -809 b 383 -830 318 -823 351 -830 b 586 -718 464 -830 540 -789 b 626 -584 612 -678 626 -631 b 619 -528 626 -566 623 -548 b 612 -495 619 -526 616 -510 b 577 -324 590 -387 577 -324 b 577 -324 577 -324 577 -324 b 568 -326 575 -324 571 -324 b 528 -334 558 -328 537 -333 b 465 -338 506 -337 485 -338 b 24 -11 269 -338 87 -206 b -1 145 8 41 -1 93 b 96 442 -1 249 32 351 b 322 714 166 541 236 626 l 352 745 l 345 782 l 332 843 l 315 921 b 303 984 310 950 304 978 b 295 1082 298 1017 295 1049 b 413 1426 295 1208 336 1329 b 488 1499 436 1456 477 1496 m 549 1301 b 541 1301 547 1301 544 1301 b 411 1207 500 1301 447 1263 b 355 1004 374 1152 355 1079 b 359 942 355 984 356 963 b 371 881 362 927 363 917 l 385 818 b 392 782 389 799 392 784 l 392 782 b 434 828 393 782 424 816 b 607 1165 534 941 594 1060 b 608 1193 608 1175 608 1183 b 597 1270 608 1224 604 1254 b 549 1301 589 1286 571 1299 m 398 528 b 393 555 396 542 393 553 b 392 555 393 555 393 555 b 317 470 390 555 347 505 b 190 298 266 408 212 334 b 127 70 148 227 127 148 b 155 -77 127 19 137 -30 b 468 -303 209 -216 333 -303 b 519 -299 484 -303 502 -302 b 568 -284 541 -295 568 -287 l 568 -284 b 563 -263 568 -284 566 -274 l 534 -120 l 511 -13 l 496 61 l 480 133 b 469 187 472 176 469 187 b 468 188 469 187 469 188 b 416 162 462 188 430 172 b 337 13 364 126 337 69 b 413 -124 337 -40 363 -93 b 428 -144 424 -131 428 -137 b 428 -149 428 -145 428 -148 b 409 -166 426 -161 419 -166 b 394 -162 405 -166 400 -165 b 240 77 302 -122 240 -27 l 240 77 b 430 342 240 197 315 301 l 436 344 l 426 394 l 398 528 m 548 194 b 526 195 540 195 532 195 b 519 195 524 195 521 195 l 514 195 l 518 177 l 539 79 l 552 15 l 566 -48 l 594 -187 l 605 -240 b 612 -266 609 -254 611 -266 b 612 -266 612 -266 612 -266 b 641 -248 613 -266 630 -256 b 744 -98 692 -212 730 -156 b 751 -40 749 -79 751 -59 b 548 194 751 76 665 181 \"},\n\"v84\":{\"x_min\":25.859375,\"x_max\":164.6875,\"ha\":168,\"o\":\"m 34 369 b 40 370 35 370 38 370 b 59 353 49 370 50 367 b 164 40 122 254 155 158 b 164 0 164 33 164 16 b 164 -40 164 -16 164 -34 b 59 -353 155 -158 122 -254 b 40 -371 53 -366 47 -371 b 34 -370 38 -371 36 -370 b 25 -358 28 -367 25 -363 b 31 -337 25 -352 27 -347 b 92 0 72 -234 92 -117 b 31 335 92 116 72 233 b 25 356 27 345 25 352 b 34 369 25 363 28 366 \"},\n\"v86\":{\"x_min\":-571.671875,\"x_max\":570.3125,\"ha\":582,\"o\":\"m -386 173 b -381 174 -385 174 -383 174 b -370 173 -377 174 -372 173 b -281 86 -367 172 -347 151 b -196 0 -235 37 -196 0 b -126 84 -196 0 -164 37 b -50 174 -55 173 -57 172 b -44 174 -49 174 -47 174 b -35 173 -42 174 -38 173 b 53 86 -32 172 -12 151 b 138 0 100 37 138 0 b 208 84 140 0 170 37 b 284 174 279 173 277 172 b 289 174 285 174 288 174 b 299 173 294 174 298 173 b 462 11 303 172 338 134 l 475 -1 l 503 34 b 541 76 534 72 536 74 b 548 77 544 77 545 77 b 570 56 560 77 570 68 b 567 48 570 54 568 51 b 392 -172 564 41 397 -166 b 378 -176 387 -174 382 -176 b 368 -174 374 -176 371 -176 b 280 -87 367 -173 345 -152 b 194 0 234 -38 194 0 b 125 -86 194 0 163 -38 b 49 -174 54 -174 55 -173 b 43 -176 47 -176 46 -176 b 34 -174 40 -176 36 -174 b -54 -87 31 -173 10 -152 b -140 0 -102 -38 -140 0 b -209 -86 -141 0 -171 -38 b -285 -174 -280 -174 -279 -173 b -291 -176 -287 -176 -289 -176 b -300 -174 -295 -176 -299 -174 b -464 -12 -304 -173 -340 -137 l -476 0 l -504 -34 b -543 -77 -534 -73 -537 -76 b -549 -79 -545 -79 -547 -79 b -571 -58 -562 -79 -571 -69 b -568 -49 -571 -55 -570 -52 b -392 172 -566 -43 -396 167 b -386 173 -390 172 -387 173 \"},\n\"v8a\":{\"x_min\":-170.140625,\"x_max\":168.78125,\"ha\":172,\"o\":\"m -160 567 b -122 567 -159 567 -149 567 l -87 567 l -84 566 b -74 553 -78 563 -77 560 b -20 366 -73 551 -49 466 b 31 186 8 267 31 186 b 85 371 31 186 55 269 b 140 559 114 473 138 557 b 153 567 141 564 148 567 b 168 559 159 567 166 564 b 168 555 168 557 168 557 b 92 281 168 548 159 513 b 14 13 50 134 14 13 b 0 0 14 6 6 0 b -17 15 -8 0 -17 8 b -93 283 -17 15 -51 136 b -170 552 -166 533 -170 548 b -170 553 -170 552 -170 552 b -160 567 -170 560 -167 564 \"},\n\"v8b\":{\"x_min\":0,\"x_max\":319.859375,\"ha\":326,\"o\":\"m 149 508 b 159 509 152 509 155 509 b 186 494 170 509 181 503 b 190 440 190 487 190 488 l 190 430 l 190 377 l 242 377 l 251 377 b 303 373 298 377 296 377 b 319 345 314 367 319 356 b 304 319 319 335 314 324 b 250 315 296 315 299 315 l 242 315 l 190 315 l 190 262 l 190 252 b 186 198 190 204 190 205 b 159 183 179 188 170 183 b 132 198 148 183 138 188 b 127 252 127 205 127 204 l 127 262 l 127 315 l 76 315 l 68 315 b 14 319 20 315 21 315 b 0 347 4 324 0 335 b 14 373 0 356 4 367 b 68 377 21 377 20 377 l 76 377 l 127 377 l 127 430 l 127 440 b 132 494 127 488 127 487 b 149 508 136 501 142 505 \"},\n\"v8c\":{\"x_min\":-330.75,\"x_max\":329.390625,\"ha\":336,\"o\":\"m -133 483 b -117 484 -127 484 -122 484 b 31 373 -51 484 9 440 b 35 348 34 365 35 356 b -25 285 35 313 10 285 b -87 331 -55 285 -76 302 b -167 402 -100 376 -133 402 b -191 398 -175 402 -183 401 b -227 341 -215 388 -227 369 b -225 320 -227 334 -227 327 b -13 74 -209 230 -125 133 b 6 65 -4 70 5 66 l 9 63 l 10 65 b 117 231 12 68 40 112 l 189 341 l 242 424 b 268 460 262 456 264 458 b 283 464 273 463 277 464 b 308 438 296 464 308 453 l 308 437 b 287 396 308 430 308 428 l 95 98 l 59 43 l 58 41 l 65 37 b 253 -156 151 -8 217 -77 b 281 -285 272 -199 281 -244 b 148 -481 281 -381 231 -463 b 115 -485 137 -484 126 -485 b -32 -376 51 -485 -9 -442 b -36 -349 -35 -366 -36 -358 b 25 -287 -36 -315 -12 -287 b 85 -333 54 -287 74 -302 b 166 -403 99 -377 133 -403 b 190 -399 174 -403 182 -402 b 225 -342 215 -390 225 -370 b 224 -322 225 -335 225 -328 b 12 -76 208 -231 125 -134 b -8 -66 2 -72 -6 -68 l -10 -65 l -12 -66 b -118 -231 -13 -68 -42 -113 l -190 -342 l -243 -426 b -269 -462 -264 -458 -265 -458 b -284 -466 -274 -464 -279 -466 b -310 -440 -298 -466 -310 -455 l -310 -438 b -288 -398 -310 -430 -308 -430 l -96 -99 l -59 -44 l -59 -43 l -66 -38 b -281 284 -198 33 -281 158 l -281 284 b -133 483 -281 392 -220 474 m 254 177 b 266 179 258 177 262 179 b 319 149 287 179 307 167 b 329 115 326 140 329 127 b 319 79 329 102 326 90 b 268 51 307 61 287 51 b 221 72 250 51 234 58 b 205 115 210 84 205 99 b 254 177 205 142 223 170 m -281 -54 b -269 -52 -277 -52 -273 -52 b -223 -73 -253 -52 -235 -59 b -206 -116 -212 -84 -206 -101 b -216 -151 -206 -129 -209 -141 b -269 -179 -228 -170 -249 -179 b -314 -159 -285 -179 -302 -173 b -330 -116 -325 -147 -330 -131 b -281 -54 -330 -88 -313 -61 \"},\n\"v8d\":{\"x_min\":-1.359375,\"x_max\":255.890625,\"ha\":261,\"o\":\"m 118 514 b 127 517 121 517 122 517 b 147 505 136 517 142 513 l 148 502 l 148 403 b 148 306 148 351 148 306 b 174 315 149 306 160 310 l 200 324 l 205 323 b 223 312 213 323 220 319 l 225 308 l 225 260 b 225 245 225 255 225 249 b 220 204 225 208 224 209 b 179 188 216 199 215 199 l 148 177 l 148 124 l 148 70 l 189 84 b 236 98 219 94 230 98 b 247 94 240 98 243 97 b 255 52 254 88 255 87 b 255 33 255 47 255 40 l 254 -12 l 253 -15 b 249 -22 253 -18 250 -20 l 245 -24 l 196 -41 l 148 -58 l 148 -108 b 148 -158 148 -136 148 -158 b 174 -148 148 -158 160 -154 b 204 -140 198 -140 200 -140 l 204 -140 b 224 -152 213 -140 221 -145 b 225 -201 224 -155 225 -177 b 224 -254 225 -226 224 -251 b 157 -284 220 -262 220 -262 l 148 -288 l 148 -395 l 148 -503 l 147 -506 b 127 -519 142 -514 134 -519 b 107 -506 119 -519 111 -514 l 106 -503 l 106 -403 b 106 -303 106 -316 106 -303 b 104 -303 104 -303 104 -303 b 88 -310 104 -303 96 -306 l 63 -319 b 51 -322 59 -320 55 -322 b 36 -315 46 -322 40 -319 b 31 -273 32 -309 31 -312 b 31 -258 31 -269 31 -263 l 31 -210 l 34 -206 b 40 -198 35 -204 38 -199 b 74 -186 42 -197 57 -191 l 106 -173 l 106 -123 b 106 -97 106 -112 106 -104 b 106 -72 106 -76 106 -72 b 104 -72 106 -72 106 -72 b 20 -99 89 -79 23 -99 b 0 -84 10 -99 2 -93 b -1 -37 0 -81 -1 -59 b 0 11 -1 -15 0 9 b 58 40 4 22 2 22 l 106 56 l 106 109 b 106 123 106 115 106 119 b 106 162 106 147 106 162 b 81 155 106 162 93 159 b 50 147 65 149 55 147 b 36 152 43 147 40 148 b 31 194 32 158 31 156 b 31 209 31 198 31 204 l 31 256 l 34 260 b 76 281 38 269 38 269 l 106 292 l 106 396 l 106 502 l 107 505 b 118 514 110 509 114 513 \"},\n\"v8f\":{\"x_min\":-21.78125,\"x_max\":362.0625,\"ha\":369,\"o\":\"m 302 1031 b 308 1032 304 1032 307 1032 b 330 1016 318 1032 325 1027 b 362 867 351 970 362 920 b 340 738 362 824 353 780 l 336 727 l 340 717 b 362 591 355 677 362 634 b 257 323 362 496 325 401 b 204 272 243 306 227 290 b 20 56 129 206 66 133 b -1 18 12 44 0 22 b -19 4 -4 9 -12 4 l -21 4 l -21 140 l -21 276 l -12 277 b 167 333 61 288 127 309 b 319 598 262 388 319 491 b 311 664 319 620 317 642 l 310 673 l 304 664 b 204 548 279 620 250 587 b 20 333 129 483 66 409 b -1 292 12 320 0 298 b -19 280 -4 285 -12 280 l -21 280 l -21 416 l -21 552 l -12 553 b 167 609 61 564 127 585 b 319 874 264 666 319 770 b 294 992 319 914 311 954 b 288 1011 288 1004 288 1007 b 302 1031 288 1021 294 1028 \"},\n\"v90\":{\"x_min\":-171.5,\"x_max\":483.1875,\"ha\":493,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 495 20 616 20 616 b 20 373 20 427 20 373 b 115 410 20 373 63 390 l 210 448 l 210 531 b 212 620 210 614 210 616 b 231 632 215 628 223 632 b 246 627 236 632 242 631 b 251 541 251 620 251 628 l 251 463 l 315 489 b 387 514 368 509 381 514 b 393 513 390 514 392 514 b 406 494 402 510 406 502 b 397 476 406 487 404 480 b 323 446 396 474 363 462 l 251 417 l 251 283 l 251 148 l 254 151 b 370 199 291 183 332 199 b 415 191 385 199 400 197 b 483 84 458 176 483 134 b 461 0 483 58 476 29 b 332 -142 439 -40 411 -72 l 255 -215 b 231 -229 240 -229 239 -229 b 216 -223 224 -229 220 -227 b 210 -158 210 -217 210 -223 b 210 -120 210 -148 210 -136 l 210 -29 l 205 -34 b 100 -142 182 -65 159 -88 l 23 -215 b -1 -229 9 -229 6 -229 b -19 -217 -9 -229 -16 -224 l -20 -215 l -21 48 l -21 310 l -83 287 b -152 262 -133 266 -145 262 b -157 263 -153 262 -155 262 b -171 283 -166 266 -171 274 b -161 301 -171 290 -167 297 b -91 328 -160 302 -129 315 l -21 356 l -21 487 l -20 617 l -19 621 b -8 631 -17 626 -12 630 m 210 288 b 210 401 210 351 210 401 b 114 365 209 401 167 384 l 20 327 l 20 238 l 20 148 l 21 151 b 140 199 59 183 102 199 b 206 180 164 199 187 192 l 209 177 b 209 177 209 177 209 177 b 210 288 210 177 210 199 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 m 341 131 b 328 133 337 133 332 133 b 322 133 326 133 323 133 b 257 87 296 129 273 113 l 251 80 l 251 -37 l 251 -156 l 255 -152 b 375 81 328 -72 375 20 l 375 83 b 341 131 375 113 367 126 \"},\n\"v92\":{\"x_min\":0,\"x_max\":598.890625,\"ha\":611,\"o\":\"m 62 181 b 77 183 66 183 72 183 b 91 181 83 183 88 183 b 202 131 100 180 106 177 l 299 87 l 394 131 b 517 183 499 181 502 183 b 519 183 517 183 518 183 b 598 104 567 183 598 144 b 577 49 598 84 592 65 b 518 15 567 38 563 37 b 484 0 499 6 484 0 b 518 -16 484 -1 499 -8 b 577 -51 563 -38 567 -40 b 598 -105 592 -66 598 -86 b 519 -184 598 -145 567 -184 b 517 -184 518 -184 517 -184 b 394 -133 502 -184 499 -183 l 299 -88 l 202 -133 b 81 -184 99 -183 95 -184 b 77 -184 80 -184 78 -184 b 0 -105 29 -184 0 -145 b 20 -51 0 -86 5 -66 b 80 -16 29 -40 34 -38 b 114 -1 98 -8 114 -1 b 80 15 114 0 98 6 b 20 49 34 37 29 38 b 0 104 6 65 0 84 b 62 181 0 140 23 174 m 88 134 b 74 136 85 134 80 136 b 68 134 72 136 69 136 b 46 104 54 130 46 117 b 55 81 46 95 49 88 b 149 34 59 76 53 80 b 224 -1 190 15 224 0 b 144 -38 224 -1 187 -18 b 54 -84 59 -79 58 -79 b 46 -105 49 -90 46 -98 b 76 -137 46 -122 58 -137 b 78 -137 77 -137 77 -137 b 194 -86 87 -137 76 -141 b 298 -36 250 -58 298 -36 b 298 -36 298 -36 298 -36 b 402 -84 299 -36 345 -58 b 518 -137 522 -141 510 -137 b 521 -137 519 -137 519 -137 b 551 -105 539 -137 551 -122 b 541 -83 551 -98 548 -90 b 447 -36 537 -77 544 -81 b 374 -1 406 -16 374 -1 b 447 34 374 0 406 15 b 541 81 544 80 537 76 b 551 104 548 88 551 97 b 521 136 551 120 539 136 b 518 136 519 136 519 136 b 517 136 518 136 517 136 l 517 136 b 402 83 511 136 511 136 b 298 34 345 56 299 34 b 298 34 298 34 298 34 b 194 84 298 34 250 56 b 88 134 137 111 89 133 \"},\n\"v93\":{\"x_min\":0,\"x_max\":438.28125,\"ha\":447,\"o\":\"m 212 205 b 219 205 213 205 216 205 b 239 183 228 205 231 204 b 421 -163 298 40 363 -83 b 438 -191 434 -180 438 -186 b 436 -197 438 -192 438 -195 b 424 -206 434 -204 431 -206 b 406 -201 420 -206 415 -205 b 216 -156 347 -172 281 -156 b 23 -205 148 -156 80 -173 b 14 -206 20 -206 17 -206 b 0 -191 6 -206 0 -201 b 6 -176 0 -187 1 -183 b 202 192 63 -104 142 45 b 212 205 205 199 208 202 m 264 48 l 249 81 l 243 94 l 242 91 b 89 -126 208 36 137 -66 b 81 -138 85 -133 81 -138 b 81 -138 81 -138 81 -138 b 81 -138 81 -138 81 -138 b 95 -133 81 -138 87 -136 b 280 -94 156 -108 221 -94 b 334 -98 299 -94 317 -95 b 343 -99 338 -99 343 -99 b 343 -99 343 -99 343 -99 b 338 -94 343 -99 341 -97 b 264 48 318 -58 287 1 \"},\n\"v94\":{\"x_min\":-149.71875,\"x_max\":148.359375,\"ha\":151,\"o\":\"m -9 215 b 0 217 -6 217 -4 217 b 19 205 8 217 14 213 b 20 142 20 202 20 201 l 20 84 l 23 84 b 144 -27 81 74 129 30 b 148 -66 147 -40 148 -54 b 36 -213 148 -134 103 -197 b 0 -219 24 -217 12 -219 b -145 -104 -68 -219 -129 -173 b -149 -68 -148 -91 -149 -79 b -24 84 -149 6 -98 74 l -21 84 l -21 142 b -19 205 -20 201 -20 202 b -9 215 -17 209 -13 213 m -21 -15 b -23 41 -21 37 -21 41 b -23 41 -23 41 -23 41 b -76 11 -35 40 -62 26 b -108 -65 -98 -11 -108 -38 b -1 -176 -108 -122 -65 -176 b 107 -65 63 -176 107 -122 b 74 11 107 -38 96 -11 b 20 41 61 26 32 41 b 20 -15 20 41 20 15 b 19 -74 20 -72 20 -72 b 0 -87 14 -83 6 -87 b -19 -74 -8 -87 -16 -83 b -21 -15 -20 -72 -20 -72 \"},\n\"v95\":{\"x_min\":0,\"x_max\":406.96875,\"ha\":415,\"o\":\"m 55 181 b 70 183 61 183 66 183 b 111 170 85 183 99 179 b 160 130 115 167 137 149 l 202 95 l 245 130 b 319 181 299 176 302 179 b 334 183 325 183 330 183 b 406 109 375 183 406 148 b 401 81 406 99 405 91 b 348 24 394 65 390 59 b 318 -1 332 11 318 0 b 348 -26 318 -1 332 -12 b 401 -83 390 -61 394 -66 b 406 -111 405 -93 406 -101 b 334 -184 406 -149 375 -184 b 319 -183 330 -184 325 -184 b 245 -131 302 -180 299 -177 l 202 -97 l 160 -131 b 85 -183 107 -177 103 -180 b 70 -184 80 -184 76 -184 b 0 -111 31 -184 0 -149 b 4 -83 0 -101 1 -93 b 58 -26 10 -66 16 -61 b 88 -1 74 -12 88 -1 b 58 24 88 0 74 11 b 10 69 23 54 17 59 b 0 109 2 81 0 95 b 55 181 0 142 21 173 m 83 133 b 72 136 78 136 76 136 b 57 131 66 136 61 134 b 46 109 49 126 46 117 b 50 93 46 104 47 98 b 107 45 51 91 77 70 b 160 0 137 20 160 0 b 107 -47 160 -1 137 -22 b 50 -94 77 -72 51 -93 b 46 -111 47 -99 46 -105 b 59 -134 46 -120 50 -130 b 72 -137 62 -136 68 -137 b 83 -136 76 -137 80 -136 b 144 -84 84 -134 107 -116 b 202 -36 176 -58 202 -36 b 261 -84 202 -36 230 -58 b 323 -136 299 -116 321 -134 b 334 -137 326 -136 330 -137 b 345 -134 338 -137 343 -136 b 360 -111 355 -130 360 -120 b 355 -94 360 -105 359 -99 b 299 -47 353 -93 329 -72 b 245 0 269 -22 245 -1 b 299 45 245 0 269 20 b 355 93 329 70 353 91 b 360 109 359 98 360 104 b 345 133 360 119 355 129 b 334 136 343 134 338 136 b 323 134 330 136 326 134 b 261 83 321 133 299 115 b 202 34 230 56 202 34 b 144 83 202 34 176 56 b 83 133 106 115 84 133 \"},\n\"v97\":{\"x_min\":-228.671875,\"x_max\":227.3125,\"ha\":232,\"o\":\"m -217 487 l -213 488 l 0 488 l 212 488 l 216 487 b 225 476 220 484 224 480 l 227 473 l 227 244 l 227 15 l 225 12 b 206 0 223 4 215 0 b 197 1 204 0 200 0 b 187 12 193 4 189 6 l 186 15 l 186 138 l 186 262 l -1 262 l -187 262 l -187 138 l -187 15 l -189 12 b -208 0 -193 4 -200 0 b -227 12 -216 0 -223 4 l -228 15 l -228 244 l -228 473 l -227 476 b -217 487 -225 480 -221 484 \"},\n\"v9a\":{\"x_min\":-21.78125,\"x_max\":367.5,\"ha\":375,\"o\":\"m 230 1031 b 238 1032 232 1032 235 1032 b 259 1014 245 1032 251 1027 b 367 662 330 906 367 782 b 364 602 367 641 367 621 b 232 317 352 488 304 384 b 57 120 155 245 103 187 b -1 18 31 84 6 40 b -19 4 -4 11 -12 4 l -21 4 l -21 159 l -21 315 l -16 315 b 96 335 10 315 62 324 b 315 695 227 380 315 527 b 313 738 315 709 314 724 b 224 991 304 825 273 916 b 216 1013 219 999 216 1007 b 230 1031 216 1021 220 1028 \"},\n\"v9b\":{\"x_min\":-24.5,\"x_max\":313.0625,\"ha\":319,\"o\":\"m -24 -133 l -24 -5 l -20 -5 b -1 -19 -12 -5 -4 -11 b 142 -213 13 -61 74 -144 b 258 -376 196 -269 230 -315 b 313 -605 295 -449 313 -528 b 292 -742 313 -652 306 -699 b 288 -752 289 -748 288 -752 b 288 -752 288 -752 288 -752 b 292 -764 289 -753 291 -757 b 313 -907 306 -811 313 -860 b 292 -1045 313 -954 306 -1002 b 288 -1054 289 -1050 288 -1054 b 288 -1054 288 -1054 288 -1054 b 292 -1067 289 -1054 291 -1060 b 313 -1210 306 -1113 313 -1161 b 292 -1346 313 -1257 306 -1304 b 288 -1357 289 -1353 288 -1357 b 288 -1357 288 -1357 288 -1357 b 292 -1368 289 -1357 291 -1363 b 313 -1512 306 -1415 313 -1464 b 292 -1648 313 -1560 306 -1605 b 288 -1660 289 -1654 288 -1660 b 288 -1660 288 -1660 288 -1660 b 292 -1671 289 -1660 291 -1665 b 313 -1814 306 -1719 313 -1766 b 250 -2040 313 -1897 291 -1977 b 232 -2062 238 -2057 236 -2059 b 221 -2065 230 -2063 225 -2065 b 200 -2045 210 -2065 201 -2057 b 200 -2043 200 -2044 200 -2044 b 208 -2026 200 -2037 202 -2034 b 269 -1826 249 -1966 269 -1897 b 153 -1544 269 -1726 230 -1625 b -9 -1472 115 -1506 58 -1481 b -21 -1471 -14 -1471 -19 -1471 l -24 -1471 l -24 -1343 l -24 -1215 l -20 -1215 b -1 -1229 -12 -1215 -4 -1221 b 142 -1424 13 -1270 74 -1353 b 257 -1582 196 -1478 228 -1524 b 264 -1594 261 -1589 264 -1594 l 264 -1594 b 265 -1582 264 -1594 264 -1589 b 270 -1525 268 -1562 270 -1544 b 153 -1243 270 -1424 228 -1321 b -9 -1170 115 -1203 58 -1178 b -21 -1168 -14 -1170 -19 -1168 l -24 -1168 l -24 -1041 l -24 -913 l -20 -913 b -1 -927 -12 -913 -4 -918 b 142 -1121 13 -967 74 -1050 b 257 -1281 196 -1175 228 -1221 b 264 -1292 261 -1286 264 -1292 l 264 -1292 b 265 -1279 264 -1292 264 -1286 b 270 -1222 268 -1261 270 -1242 b 153 -941 270 -1121 228 -1018 b -9 -867 115 -900 58 -875 b -21 -866 -14 -867 -19 -866 l -24 -866 l -24 -738 l -24 -610 l -20 -610 b -1 -624 -12 -610 -4 -616 b 142 -818 13 -664 74 -749 b 257 -978 196 -873 228 -918 b 264 -989 261 -984 264 -989 l 264 -989 b 265 -977 264 -989 264 -984 b 270 -920 268 -959 270 -939 b 153 -638 270 -818 228 -716 b -9 -564 115 -598 58 -573 b -21 -563 -14 -564 -19 -563 l -24 -563 l -24 -435 l -24 -308 l -20 -308 b -1 -322 -12 -308 -4 -313 b 142 -516 13 -363 74 -446 b 257 -675 196 -571 228 -616 b 264 -687 261 -681 264 -687 l 264 -687 b 265 -674 264 -687 264 -681 b 270 -617 268 -656 270 -637 b 153 -335 270 -516 228 -413 b -9 -262 115 -295 58 -270 b -21 -260 -14 -262 -19 -260 l -24 -260 l -24 -133 \"},\n\"v9c\":{\"x_min\":-166.0625,\"x_max\":-25.859375,\"ha\":0,\"o\":\"m -49 369 b -42 370 -46 369 -44 370 b -27 360 -36 370 -29 366 b -25 355 -27 359 -25 358 b -32 335 -25 351 -28 347 b -92 52 -66 248 -87 159 b -93 -1 -93 43 -93 20 b -92 -54 -93 -23 -93 -45 b -32 -337 -85 -162 -66 -251 b -25 -355 -27 -349 -25 -352 b -42 -371 -25 -365 -32 -371 b -61 -353 -50 -371 -51 -369 b -163 -63 -119 -262 -153 -165 b -166 -1 -166 -37 -166 -31 b -163 62 -166 30 -166 36 b -61 352 -153 163 -119 260 b -49 369 -54 365 -51 366 \"},\n\"v9e\":{\"x_min\":0,\"x_max\":607.0625,\"ha\":619,\"o\":\"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 m 347 631 b 353 632 348 632 351 632 b 374 620 363 632 371 628 b 375 383 375 616 375 616 l 375 148 l 377 151 b 492 199 415 183 454 199 b 537 191 507 199 522 197 b 607 84 582 176 607 134 b 583 0 607 58 598 29 b 455 -142 562 -40 533 -72 l 378 -215 b 355 -229 364 -229 362 -229 b 334 -216 345 -229 337 -224 l 333 -212 l 333 201 l 333 616 l 334 620 b 347 631 337 624 341 630 m 465 131 b 451 133 461 133 455 133 b 445 133 449 133 446 133 b 379 87 419 129 396 113 l 375 80 l 375 -37 l 375 -156 l 378 -152 b 499 81 451 -72 499 20 l 499 83 b 465 131 499 113 490 126 \"},\n\"va3\":{\"x_min\":58.53125,\"x_max\":228.671875,\"ha\":294,\"o\":\"m 138 371 b 142 373 140 371 141 373 b 178 342 149 373 156 366 b 228 251 217 297 228 278 b 228 244 228 248 228 247 b 176 147 227 212 212 184 b 123 73 152 122 132 93 b 121 62 122 70 121 66 b 145 13 121 48 129 31 b 153 -2 151 6 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 145 -11 b 129 -1 140 -11 136 -8 b 61 87 89 37 68 68 b 58 113 59 95 58 105 b 110 215 58 144 74 177 b 163 287 134 240 155 269 b 166 299 166 291 166 295 b 141 348 166 313 157 330 b 133 360 134 356 133 358 b 133 363 133 362 133 362 b 138 371 133 367 136 370 \"},\n\"va5\":{\"x_min\":0,\"x_max\":349.8125,\"ha\":357,\"o\":\"m 88 302 b 103 303 93 302 98 303 b 202 224 149 303 191 270 b 205 199 204 216 205 208 b 178 129 205 173 196 147 l 175 126 l 182 127 b 307 249 236 142 284 190 b 313 259 308 254 311 258 b 329 267 317 265 323 267 b 349 247 340 267 349 259 b 201 -263 349 242 204 -258 b 182 -273 197 -270 190 -273 b 163 -260 174 -273 166 -269 b 161 -256 161 -259 161 -258 b 217 -59 161 -248 170 -220 b 272 129 247 43 272 127 b 272 129 272 129 272 129 b 264 122 272 129 268 126 b 140 80 227 94 183 80 b 36 115 102 80 65 91 b 0 194 10 136 0 165 b 88 302 0 244 32 292 \"},\n\"va9\":{\"x_min\":-24.5,\"x_max\":314.421875,\"ha\":321,\"o\":\"m -24 -145 l -24 -5 l -20 -5 b 0 -23 -9 -5 -2 -12 b 27 -87 4 -38 14 -66 b 138 -220 53 -136 88 -177 b 235 -328 179 -255 208 -288 b 314 -592 287 -409 314 -501 b 292 -732 314 -639 307 -687 l 289 -742 l 294 -756 b 314 -896 307 -802 314 -849 b 292 -1035 314 -943 307 -991 l 289 -1045 l 294 -1057 b 314 -1197 307 -1104 314 -1152 b 292 -1338 314 -1246 307 -1292 l 289 -1347 l 294 -1360 b 314 -1500 307 -1407 314 -1454 b 273 -1689 314 -1565 300 -1628 b 250 -1712 265 -1710 261 -1712 b 228 -1691 236 -1712 228 -1704 l 228 -1685 l 234 -1675 b 270 -1507 258 -1621 270 -1564 b 98 -1193 270 -1381 209 -1261 b 40 -1174 76 -1179 58 -1174 b -10 -1189 24 -1174 8 -1178 b -20 -1192 -14 -1192 -16 -1192 l -24 -1192 l -24 -1052 l -24 -913 l -20 -913 b 0 -931 -9 -913 -2 -920 b 27 -995 4 -946 14 -974 b 138 -1128 53 -1043 88 -1085 b 257 -1275 190 -1172 228 -1220 b 262 -1283 259 -1279 262 -1283 l 262 -1283 b 269 -1249 264 -1282 268 -1260 b 270 -1206 270 -1233 270 -1220 b 98 -891 270 -1075 206 -957 b 40 -871 76 -877 58 -871 b -10 -886 24 -871 8 -875 b -20 -889 -14 -889 -16 -889 l -24 -889 l -24 -749 l -24 -610 l -20 -610 b 0 -628 -9 -610 -2 -617 b 27 -692 4 -644 14 -671 b 138 -825 53 -741 88 -782 b 257 -973 190 -870 228 -917 b 262 -981 259 -977 262 -981 l 262 -981 b 269 -946 264 -979 268 -957 b 270 -903 270 -931 270 -917 b 98 -588 270 -774 206 -655 b 40 -569 76 -574 58 -569 b -10 -584 24 -569 8 -574 b -20 -587 -14 -587 -16 -587 l -24 -587 l -24 -448 l -24 -308 l -20 -308 b 0 -326 -9 -308 -2 -315 b 27 -390 4 -341 14 -369 b 138 -523 53 -438 88 -480 b 257 -670 190 -567 228 -614 b 262 -678 259 -674 262 -678 b 262 -678 262 -678 262 -678 b 269 -644 264 -677 268 -656 b 270 -601 270 -628 270 -614 b 98 -285 270 -471 206 -352 b 40 -266 76 -273 58 -266 b -10 -281 24 -266 8 -272 b -20 -284 -14 -284 -16 -284 l -24 -284 l -24 -145 \"},\n\"vaa\":{\"x_min\":-1.359375,\"x_max\":752.703125,\"ha\":768,\"o\":\"m 490 985 b 504 986 495 986 500 986 b 604 907 551 986 593 954 b 607 884 607 900 607 892 b 581 813 607 857 597 831 l 578 810 l 583 811 b 710 932 638 827 687 873 b 714 943 711 936 713 942 b 730 952 720 949 725 952 b 752 931 741 952 752 943 b 200 -946 752 927 204 -941 b 182 -957 197 -953 190 -957 b 163 -945 174 -957 166 -953 b 161 -939 161 -942 161 -942 b 217 -743 161 -931 170 -904 b 272 -555 247 -639 272 -555 b 272 -555 272 -555 272 -555 b 264 -560 272 -555 268 -557 b 140 -603 227 -589 182 -603 b 36 -567 102 -603 65 -592 b -1 -487 12 -548 -1 -517 b 17 -427 -1 -466 5 -445 b 103 -380 38 -395 70 -380 b 191 -433 137 -380 172 -398 b 205 -484 201 -448 205 -466 b 178 -553 205 -509 196 -535 l 175 -557 l 182 -555 b 307 -435 236 -539 284 -494 b 372 -213 308 -430 372 -215 b 372 -213 372 -213 372 -213 b 364 -219 372 -213 368 -216 b 240 -262 328 -247 283 -262 b 137 -226 202 -262 166 -249 b 99 -145 112 -206 99 -176 b 118 -84 99 -124 106 -104 b 204 -38 138 -54 171 -38 b 292 -91 238 -38 273 -56 b 306 -141 302 -106 306 -124 b 279 -212 306 -167 296 -194 l 276 -215 l 281 -213 b 408 -93 336 -198 385 -151 b 473 129 409 -88 473 127 b 473 129 473 129 473 129 b 465 122 473 129 469 126 b 341 80 428 94 383 80 b 236 115 303 80 266 91 b 200 195 213 136 200 165 b 217 256 200 217 206 238 b 304 303 239 287 272 303 b 393 249 338 303 374 285 b 406 199 402 234 406 217 b 379 129 406 173 397 148 l 377 126 l 382 127 b 509 248 436 142 485 190 b 574 470 510 254 574 469 b 574 470 574 470 574 470 b 566 464 574 470 570 467 b 442 421 529 435 484 421 b 337 458 404 421 367 433 b 300 538 314 477 300 508 b 318 598 300 559 306 580 b 404 645 340 630 372 645 b 494 592 439 645 475 627 b 507 541 502 577 507 559 b 480 471 507 516 498 489 l 477 467 l 483 470 b 608 589 537 485 586 531 b 675 811 611 595 675 810 b 675 811 675 811 675 811 b 666 806 675 811 671 809 b 543 763 628 777 585 763 b 438 799 504 763 468 775 b 401 878 412 820 401 849 b 490 985 401 928 434 977 \"},\n\"vab\":{\"x_min\":0,\"x_max\":272.21875,\"ha\":278,\"o\":\"m 243 631 b 250 632 246 632 249 632 b 270 620 259 632 268 628 l 272 616 l 272 201 l 272 -212 l 270 -216 b 251 -229 268 -224 259 -229 b 227 -215 243 -229 240 -229 l 151 -142 b 32 -16 81 -80 53 -49 b 0 84 9 18 0 52 b 111 199 0 149 42 199 b 137 197 119 199 127 198 b 228 151 168 191 197 177 l 231 148 l 231 383 b 232 620 231 616 231 616 b 243 631 234 624 238 630 m 168 131 b 152 133 163 133 157 133 b 107 102 130 133 111 120 b 106 86 107 97 106 91 b 111 41 106 73 108 56 b 227 -152 125 -13 171 -90 l 231 -156 l 231 -37 l 231 80 l 225 87 b 168 131 210 111 190 126 \"},\n\"vad\":{\"x_min\":0,\"x_max\":873.828125,\"ha\":892,\"o\":\"m 0 0 l 0 703 l 81 703 l 164 703 l 164 0 l 164 -705 l 81 -705 l 0 -705 l 0 0 m 225 0 l 225 703 l 246 703 l 268 703 l 268 366 l 268 30 l 274 36 b 314 79 284 44 302 63 b 413 302 357 137 392 213 b 432 327 419 324 421 327 b 449 306 443 327 447 322 b 611 115 457 195 529 115 b 651 122 624 115 638 117 b 728 316 705 140 724 188 b 729 388 728 342 729 366 b 671 635 729 533 711 602 b 581 662 649 652 616 662 b 477 637 545 662 510 653 l 475 635 l 477 634 b 503 627 488 632 495 631 b 545 556 532 612 545 584 b 491 480 545 524 526 491 b 465 474 481 476 473 474 b 379 563 417 474 379 516 b 389 602 379 576 382 588 b 541 691 409 641 479 681 b 582 694 555 692 568 694 b 865 462 714 694 834 598 b 873 392 871 440 873 416 b 865 317 873 367 871 341 b 639 84 839 194 748 101 b 612 83 630 83 620 83 b 511 116 577 83 543 94 b 504 120 509 119 506 120 b 504 120 504 120 504 120 b 469 59 504 120 488 93 l 432 -1 l 469 -61 b 504 -122 488 -94 504 -122 b 504 -122 504 -122 504 -122 b 511 -117 506 -122 509 -120 b 612 -84 543 -95 577 -84 b 665 -91 630 -84 647 -87 b 869 -338 771 -122 850 -216 b 873 -392 872 -356 873 -374 b 798 -595 873 -469 847 -539 b 581 -695 741 -662 660 -695 b 406 -626 517 -695 454 -671 b 381 -563 389 -607 381 -585 b 465 -477 381 -519 413 -477 b 545 -559 514 -477 545 -519 b 503 -628 545 -587 532 -613 b 477 -635 495 -632 488 -634 l 475 -637 l 477 -638 b 581 -663 510 -655 545 -663 b 671 -637 616 -663 649 -653 b 729 -391 711 -603 729 -534 b 728 -317 729 -367 728 -344 b 623 -117 722 -173 698 -124 b 611 -116 619 -116 615 -116 b 449 -308 528 -116 457 -198 b 432 -328 447 -323 443 -328 b 413 -303 421 -328 419 -326 b 314 -80 392 -215 357 -138 b 274 -37 302 -65 284 -45 l 268 -31 l 268 -367 l 268 -705 l 246 -705 l 225 -705 l 225 0 \"},\n\"vb1\":{\"x_min\":78.9375,\"x_max\":485.921875,\"ha\":417,\"o\":\"m 362 378 b 378 380 367 380 372 380 b 472 348 415 380 453 367 b 485 315 481 338 485 327 b 462 273 485 298 477 281 b 439 267 454 269 446 267 b 398 290 424 267 409 274 b 344 319 385 309 364 319 b 281 269 315 319 289 301 b 279 262 280 266 279 262 b 276 256 279 260 277 258 b 274 249 276 254 274 251 b 238 127 273 248 257 192 b 201 4 217 61 201 5 b 166 -1 198 -1 200 -1 b 153 -1 163 -1 157 -1 b 141 -1 148 -1 144 -1 b 104 4 106 -1 107 -1 b 104 6 104 5 104 5 b 142 144 104 13 110 34 b 182 278 164 219 181 276 b 183 288 182 281 182 285 b 185 302 185 292 185 298 b 164 330 185 317 176 328 b 159 330 163 330 161 330 b 102 302 140 330 119 320 b 91 294 95 295 93 294 b 88 294 91 294 89 294 b 78 303 83 294 78 298 b 81 312 78 306 78 309 b 200 373 106 347 160 373 b 215 371 205 373 209 371 b 266 335 235 367 254 353 b 269 331 268 333 269 331 b 269 331 269 331 269 331 b 273 335 269 331 270 334 b 362 378 298 359 330 376 \"},\n\"vb3\":{\"x_min\":0,\"x_max\":227.3125,\"ha\":232,\"o\":\"m 91 213 b 100 215 93 215 96 215 b 227 58 167 215 224 144 b 227 52 227 56 227 54 b 61 -201 227 -43 164 -138 b 29 -216 44 -212 36 -216 b 23 -210 27 -216 24 -213 b 21 -205 21 -208 21 -206 b 34 -192 21 -201 25 -197 b 122 -55 89 -161 122 -106 b 104 6 122 -33 117 -12 l 103 9 l 96 9 b 4 79 57 9 17 38 b 0 112 1 90 0 101 b 91 213 0 163 36 209 \"},\n\"vb4\":{\"x_min\":-597.53125,\"x_max\":596.171875,\"ha\":608,\"o\":\"m -533 324 b -525 327 -530 326 -528 327 b -504 305 -514 327 -504 317 b -504 305 -504 305 -504 305 b -513 284 -504 299 -504 299 b -556 112 -541 226 -556 167 b -545 33 -556 84 -552 58 b -524 -20 -541 15 -532 -9 l -522 -23 l -491 15 l -413 111 b -355 174 -367 169 -363 174 b -351 174 -353 174 -352 174 b -254 86 -343 174 -348 179 b -168 -1 -208 37 -168 -1 b -100 84 -168 -1 -137 37 b -23 173 -28 173 -29 172 b -19 174 -21 174 -20 174 b -8 173 -14 174 -10 173 b 80 86 -5 172 13 151 b 166 -1 127 37 166 -1 b 235 84 166 -1 197 37 b 311 173 306 173 304 172 b 317 174 313 174 314 174 b 326 173 319 174 323 173 b 490 11 329 172 366 134 l 502 -1 l 530 34 b 568 76 560 72 563 74 b 575 77 570 77 573 77 b 596 56 586 77 596 68 b 594 48 596 54 596 51 b 417 -172 592 41 424 -166 b 405 -176 415 -174 409 -176 b 396 -174 401 -176 398 -176 b 307 -87 393 -173 372 -152 b 221 -1 259 -38 221 -1 b 152 -86 221 -1 190 -38 b 76 -176 81 -174 83 -173 b 70 -176 74 -176 73 -176 b 61 -174 66 -176 62 -174 b -27 -87 58 -173 38 -152 b -114 -1 -74 -38 -112 -1 b -182 -86 -114 -1 -145 -38 b -258 -176 -253 -174 -253 -173 b -264 -176 -259 -176 -262 -176 b -274 -174 -268 -176 -272 -174 b -438 -11 -277 -173 -348 -102 l -449 0 l -479 -37 b -524 -80 -513 -80 -514 -80 l -524 -80 b -553 -52 -534 -80 -540 -74 b -597 109 -583 -8 -597 48 b -560 280 -597 165 -585 224 b -533 324 -548 310 -540 322 \"},\n\"vb6\":{\"x_min\":0,\"x_max\":556.6875,\"ha\":568,\"o\":\"m 289 545 b 298 546 292 545 295 546 b 318 533 306 546 315 541 b 319 428 319 530 319 528 l 319 327 l 334 327 b 526 223 412 326 485 285 b 543 172 537 206 543 190 b 447 76 543 122 503 76 b 445 76 446 76 446 76 b 359 165 394 77 359 119 b 368 205 359 179 362 192 b 441 251 382 233 412 251 b 455 249 446 251 451 251 b 460 248 458 249 460 248 b 460 248 460 248 460 248 b 454 254 460 249 458 251 b 334 295 419 280 378 294 l 319 295 l 319 4 l 319 -287 l 321 -285 b 328 -285 322 -285 325 -285 b 524 -99 424 -277 507 -198 b 541 -79 526 -84 530 -79 b 556 -97 551 -79 556 -84 b 548 -133 556 -105 553 -117 b 334 -317 521 -233 434 -306 b 322 -319 329 -317 323 -317 l 319 -319 l 319 -424 b 319 -471 319 -444 319 -459 b 313 -541 319 -544 318 -535 b 298 -548 308 -545 303 -548 b 279 -534 289 -548 281 -542 b 277 -424 277 -531 277 -530 l 277 -317 l 273 -317 b 13 -95 153 -305 51 -217 b 0 2 4 -62 0 -29 b 182 295 0 126 66 238 b 274 324 210 309 249 320 l 277 324 l 277 427 b 279 533 277 528 277 530 b 289 545 281 538 285 542 m 277 2 b 277 291 277 161 277 291 b 268 288 277 291 273 290 b 144 1 179 265 144 184 b 276 -284 144 -199 175 -267 l 277 -285 l 277 2 \"},\n\"vb7\":{\"x_min\":-176.9375,\"x_max\":251.8125,\"ha\":257,\"o\":\"m -8 631 b -1 632 -6 632 -4 632 b 19 620 8 632 16 628 b 20 503 20 616 20 614 b 20 391 20 442 20 391 b 84 424 20 391 49 406 l 147 456 l 152 456 b 153 456 153 456 153 456 b 175 435 166 456 175 446 b 172 427 175 433 174 430 b 92 380 170 420 172 421 l 20 342 l 20 245 l 20 148 l 21 151 b 137 199 59 183 99 199 b 182 191 152 199 167 197 b 251 84 227 176 251 134 b 228 0 251 58 243 29 b 100 -142 206 -40 178 -72 l 23 -215 b 0 -229 9 -229 6 -229 b -20 -216 -9 -229 -17 -224 b -21 54 -21 -212 -21 -212 b -21 322 -21 201 -21 322 b -85 290 -21 322 -50 308 l -148 256 l -153 256 b -155 256 -155 256 -155 256 b -176 277 -167 256 -176 266 b -174 285 -176 280 -175 283 b -93 333 -171 294 -174 292 l -21 370 l -21 494 b -20 620 -21 616 -21 616 b -8 631 -17 624 -13 630 m 110 131 b 96 133 106 133 100 133 b 89 133 93 133 91 133 b 24 87 63 129 40 113 l 20 80 l 20 -37 l 20 -156 l 23 -152 b 144 81 96 -72 144 20 l 144 83 b 110 131 144 113 134 126 \"},\n\"vb9\":{\"x_min\":-122.5,\"x_max\":121.140625,\"ha\":124,\"o\":\"m -16 145 b 0 147 -10 147 -5 147 b 121 -1 66 147 121 77 b 114 -49 121 -16 118 -33 b -1 -148 95 -112 47 -148 b -85 -106 -31 -148 -61 -134 b -122 -1 -110 -76 -122 -38 b -16 145 -122 68 -81 134 m 12 111 b 0 113 8 113 4 113 b -68 22 -29 113 -61 73 b -70 0 -69 15 -70 6 b -13 -113 -70 -49 -47 -98 b -1 -115 -9 -115 -5 -115 b 63 -40 24 -115 53 -83 b 68 -1 66 -27 68 -15 b 12 111 68 48 46 97 \"},\n\"vba\":{\"x_min\":-118.421875,\"x_max\":597.53125,\"ha\":381,\"o\":\"m 460 574 b 464 574 461 574 462 574 b 488 574 470 574 481 574 b 500 573 491 574 498 574 b 594 503 543 570 588 538 b 597 488 596 498 597 494 b 528 417 597 449 564 417 b 502 423 519 417 510 419 b 465 481 477 434 465 458 b 488 528 465 499 472 516 b 490 530 490 530 490 530 b 490 530 490 530 490 530 b 468 517 488 530 475 523 b 349 340 419 485 377 420 b 347 330 348 334 347 330 b 383 328 347 328 363 328 b 428 326 423 328 424 328 b 442 302 438 320 442 312 b 430 281 442 294 438 285 b 385 276 424 277 426 276 l 377 276 l 332 276 l 330 269 b 178 -117 303 126 250 -9 b 1 -249 129 -194 69 -237 b -20 -251 -6 -251 -13 -251 b -114 -187 -65 -251 -100 -227 b -118 -156 -117 -177 -118 -166 b -51 -84 -118 -116 -91 -84 b -31 -87 -46 -84 -39 -86 b 16 -152 0 -95 16 -124 b -12 -205 16 -173 8 -194 b -16 -208 -14 -206 -16 -208 b -14 -208 -16 -208 -14 -208 b -9 -206 -14 -208 -12 -208 b 74 -124 23 -197 54 -166 b 172 224 98 -79 125 22 b 185 276 178 252 183 274 b 185 276 185 276 185 276 b 141 276 185 276 181 276 b 91 280 96 276 96 276 b 77 302 83 285 77 294 b 91 326 77 312 83 320 b 148 328 95 328 96 328 l 198 330 l 202 341 b 460 574 249 473 351 566 \"},\n\"vbf\":{\"x_min\":-53.078125,\"x_max\":513.140625,\"ha\":485,\"o\":\"m 185 383 b 196 384 187 383 191 384 b 277 334 230 384 259 365 b 288 301 281 324 288 306 b 288 297 288 298 288 297 b 294 302 289 297 291 299 b 394 370 323 338 367 367 b 404 371 398 370 401 371 b 510 272 453 371 498 328 b 513 237 513 262 513 251 b 507 172 513 217 511 192 b 326 -34 487 59 412 -26 b 314 -36 322 -36 318 -36 b 274 -24 298 -36 283 -31 l 265 -16 b 224 44 246 -1 232 20 b 223 49 224 47 223 49 b 223 49 223 49 223 49 b 149 -197 221 48 149 -194 b 149 -198 149 -197 149 -198 b 170 -210 149 -202 155 -205 b 187 -215 174 -210 175 -212 b 204 -231 201 -219 204 -222 b 197 -245 204 -240 202 -242 l 194 -248 l 76 -248 l -42 -248 l -46 -245 b -53 -231 -51 -242 -53 -240 b -35 -215 -53 -222 -49 -217 b -13 -210 -21 -212 -20 -212 b -6 -208 -10 -209 -8 -208 b 0 -206 -6 -208 -2 -206 b 25 -188 13 -201 21 -195 b 163 280 28 -183 163 276 b 166 291 163 283 164 287 b 167 302 167 295 167 299 b 155 324 167 315 161 324 b 155 324 155 324 155 324 b 65 230 125 322 85 280 b 53 215 61 217 58 215 b 51 215 53 215 51 215 b 42 224 46 215 42 217 b 57 263 42 231 47 244 b 140 360 77 305 104 337 b 152 370 144 365 149 369 b 185 383 157 376 172 381 m 374 306 b 366 308 371 308 368 308 b 300 273 348 308 321 294 b 284 254 288 262 287 259 b 280 242 283 249 281 245 b 257 169 279 240 270 213 l 236 98 l 236 93 b 251 48 238 77 243 61 b 279 27 258 37 272 27 b 281 27 279 27 280 27 b 291 31 281 27 287 30 b 396 170 334 52 378 109 b 406 247 402 197 406 224 b 401 277 406 259 405 270 b 374 306 397 290 383 303 \"},\n\"vc3\":{\"x_min\":-10.890625,\"x_max\":299.4375,\"ha\":294,\"o\":\"m 136 460 b 142 462 137 462 140 462 b 166 449 152 462 161 456 b 171 428 168 446 168 445 b 288 131 194 322 238 209 b 298 115 295 120 296 117 b 299 106 298 112 299 109 b 273 81 299 91 287 81 b 255 86 268 81 261 83 b 155 116 225 104 183 116 l 152 116 l 149 108 b 141 83 148 102 144 91 b 134 48 137 69 134 58 b 149 9 134 34 140 24 b 153 -1 152 5 153 1 b 149 -9 153 -5 152 -6 b 144 -11 148 -11 147 -11 b 122 2 138 -11 133 -6 b 95 61 104 20 95 38 b 107 108 95 74 99 90 b 108 113 107 111 108 112 b 107 113 108 113 108 113 b 102 113 106 113 104 113 b 31 86 76 108 53 98 b 14 80 24 81 20 80 b -10 106 0 80 -10 91 b 0 131 -10 115 -9 116 b 115 430 49 209 91 317 b 136 460 119 451 123 456 \"},\n\"vd0\":{\"x_min\":-10.890625,\"x_max\":299.4375,\"ha\":294,\"o\":\"m 44 174 b 51 174 47 174 49 174 b 68 173 55 174 61 174 l 287 112 l 551 40 b 615 20 617 22 609 23 b 626 0 622 16 626 8 b 615 -22 626 -9 622 -18 b 613 -23 613 -23 613 -23 b 613 -23 613 -23 613 -23 b 287 -113 613 -24 597 -29 l 68 -174 b 53 -176 61 -176 57 -176 b 39 -172 47 -176 43 -174 b 27 -151 31 -167 27 -159 b 39 -129 27 -141 31 -133 b 230 -74 43 -124 20 -131 l 370 -36 l 468 -9 b 498 0 484 -4 498 -1 b 468 8 498 0 484 2 l 370 34 l 230 73 b 40 126 28 129 43 124 b 27 149 31 131 27 140 b 44 174 27 161 34 170 m 205 110 l 205 300 b 205 330 245 330 245 300 l 245 300 l 245 -300 b 245 -330 205 -330 205 -300 l 205 -300 l 205 110 l 345 90 m 345 90 l 345 330 b 345 360 385 360 385 330 l 385 330 l 385 -270 b 385 -300 345 -300 345 -270 l 345 -270 l 345 90 \"},\n\"vd1\":{\"x_min\":-20,\"x_max\":320,\"ha\":257,\"o\":\"m -8 200 b -8 210 8 200 16 200 l 20 148 -199 l 23 -615 b 0 -629 9 -629 6 -629 l -21 -612 l -21 -201 l -21 216 l -20 200 m 16 200 l 310 0 l 240 0 l 16 140 l 16 -120 l 240 0 l 310 0 l 16 -200 \"},\n\"vd2\":{\"x_min\":0,\"x_max\":430.75,\"ha\":386,\"o\":\"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 \"},\n\"vd3\":{\"x_min\":0,\"x_max\":430.75,\"ha\":386,\"o\":\"m 0 200 l 0 -200 l 430 -200 l 430 200 l 0 200 l 50 150 l 380 150 l 380 -150 l 50 -150 l 50 150 \"},\n\"vd4\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 \"},\n\"vd5\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 0 150 l 0 -150 l 430 -150 l 430 150 l 0 150 l 50 100 l 380 100 l 380 -100 l 50 -100 l 50 100\"},\n\"vd6\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m -146 537 b -138 538 -143 538 -141 538 b -118 525 -129 538 -121 533 b -117 390 -117 522 -117 521 b -115 259 -117 268 -117 259 b -115 259 -115 259 -115 259 b -59 272 -104 263 -62 272 b -39 259 -50 272 -42 267 b -37 209 -38 257 -37 233 b -39 159 -37 185 -38 162 b -85 138 -43 149 -44 149 l -117 131 l -117 21 b -115 -88 -117 -80 -117 -88 b -115 -88 -115 -88 -115 -88 b -59 -75 -104 -84 -62 -75 b -44 -81 -52 -75 -48 -77 b -38 -124 -38 -87 -38 -85 b -38 -138 -38 -124 -38 -138 b -38 -152 -38 -138 -38 -152 b -44 -195 -38 -191 -38 -190 b -85 -209 -48 -200 -48 -200 l -117 -217 l -117 -349 b -118 -486 -117 -481 -117 -482 b -138 -499 -121 -494 -129 -499 b -153 -493 -143 -499 -149 -497 b -159 -415 -158 -487 -159 -496 b -159 -355 -159 -398 -159 -379 b -159 -227 -159 -284 -159 -227 b -205 -238 -159 -227 -180 -232 b -250 -249 -230 -244 -250 -249 b -251 -386 -251 -249 -251 -311 b -252 -525 -251 -521 -251 -522 b -272 -538 -255 -534 -264 -538 b -287 -532 -277 -538 -283 -536 b -293 -452 -292 -527 -293 -536 b -293 -391 -293 -436 -293 -415 b -294 -260 -293 -269 -293 -260 b -294 -260 -294 -260 -294 -260 b -348 -272 -306 -264 -345 -272 b -368 -259 -357 -272 -365 -267 b -369 -209 -369 -257 -369 -233 b -368 -159 -369 -185 -369 -162 b -323 -139 -364 -149 -362 -148 l -293 -131 l -293 -22 b -294 87 -293 80 -293 87 b -294 87 -294 87 -294 87 b -348 75 -306 84 -345 75 b -368 88 -357 75 -365 80 b -369 138 -369 91 -369 114 b -368 188 -369 162 -369 186 b -323 209 -364 198 -362 199 l -293 216 l -293 349 b -292 486 -293 481 -293 482 b -272 499 -288 494 -280 499 b -257 493 -266 499 -261 497 b -251 414 -251 487 -251 496 b -251 354 -251 398 -251 378 b -251 226 -251 284 -251 226 b -205 238 -250 226 -230 231 b -159 249 -180 244 -159 249 b -159 385 -159 249 -159 310 b -157 525 -159 521 -159 522 b -146 537 -156 530 -151 535 z m -159 11 b -159 120 -159 98 -159 120 l -159 120 b -175 116 -160 120 -167 119 b -221 105 -184 114 -204 109 l -251 98 l -251 -12 b -251 -121 -251 -72 -251 -121 b -205 -110 -250 -121 -230 -116 b -159 -99 -180 -104 -159 -99 b -159 11 -159 -99 -159 -49 z m 89 517 b 97 519 92 518 94 519 b 117 505 106 519 114 513 b 119 376 119 502 119 501 l 119 249 l 145 258 b 176 267 169 266 172 267 b 177 267 176 267 177 267 b 196 255 186 267 192 263 l 197 252 l 197 205 b 197 181 197 195 197 187 b 193 149 197 153 197 153 b 152 131 190 144 187 143 l 119 120 l 119 10 b 119 -100 119 -62 119 -100 b 145 -91 120 -100 131 -96 b 173 -82 159 -86 171 -82 b 176 -81 174 -81 175 -81 b 196 -94 185 -81 193 -87 b 198 -151 197 -97 198 -125 b 197 -194 198 -172 197 -192 b 153 -218 193 -203 192 -204 l 119 -230 l 119 -367 l 118 -504 l 117 -507 b 97 -519 113 -514 105 -519 b 82 -512 92 -519 87 -517 b 76 -434 77 -507 76 -516 b 76 -374 76 -418 76 -398 b 76 -245 76 -303 76 -245 b 52 -254 76 -245 65 -249 b 19 -263 34 -260 25 -263 b 6 -257 13 -263 10 -261 b 0 -214 0 -251 0 -253 b 0 -200 0 -210 0 -205 b 0 -188 0 -196 0 -192 b 6 -143 0 -147 0 -149 b 46 -126 10 -139 10 -139 l 76 -115 l 76 -5 b 76 106 76 56 76 106 b 51 98 76 106 64 102 b 18 89 34 92 25 89 b 6 95 13 89 10 91 b 0 139 0 101 0 99 b 0 153 0 143 0 148 b 0 179 0 163 0 172 b 44 225 0 215 3 211 l 76 236 l 76 369 b 78 505 76 501 76 502 b 89 517 80 510 85 515 z \"},\n\"vd7\":{\"x_min\":0,\"x_max\":430.75,\"ha\":360,\"o\":\"m 283 633 b 291 634 286 634 289 634 b 311 621 300 634 308 629 b 313 505 313 618 313 617 b 313 393 313 443 313 393 b 378 425 313 393 343 407 l 443 458 l 448 458 b 449 458 449 458 449 458 b 471 437 462 458 471 448 b 469 429 471 434 470 432 b 387 382 466 421 469 423 l 313 344 l 313 247 l 313 150 l 315 152 b 433 201 353 184 394 201 b 479 193 448 201 464 198 b 549 86 524 177 549 135 b 526 1 549 59 541 29 b 395 -143 504 -39 475 -71 b 316 -214 351 -182 341 -191 b 292 -229 302 -228 300 -229 b 272 -216 283 -229 275 -224 b 271 55 271 -212 271 -212 b 270 323 271 203 270 323 b 205 291 270 323 241 308 l 140 258 l 135 258 b 134 258 135 258 134 258 b 112 279 121 258 112 267 b 114 287 112 281 113 284 b 196 334 117 295 114 293 l 271 371 l 271 495 b 272 621 271 617 271 618 b 283 633 274 626 279 631 z m 404 133 b 391 134 400 134 395 134 b 384 134 388 134 386 134 b 318 88 358 130 335 114 l 313 81 l 313 -37 l 313 -156 l 316 -152 b 439 83 391 -71 439 22 l 439 84 b 404 133 439 115 430 128 z m -8 633 l -8 633 b 0 634 -6 634 -3 634 b 20 621 8 634 17 629 b 21 384 21 618 21 617 l 21 150 l 24 152 b 141 201 62 184 102 201 b 187 193 157 201 172 198 b 257 86 232 177 257 135 b 234 1 257 59 250 29 b 103 -143 212 -39 183 -71 b 24 -214 60 -182 49 -191 b 0 -229 10 -228 8 -229 b -20 -216 -9 -229 -17 -224 l -21 -212 l -21 203 l -21 618 l -20 621 b -8 633 -18 626 -13 631 z m 113 133 l 113 133 b 99 134 109 134 103 134 b 93 134 97 134 94 134 b 26 88 66 130 43 114 l 21 81 l 21 -37 l 21 -156 l 25 -152 b 148 83 99 -71 148 22 l 148 84 b 113 133 148 115 138 128 z \"},\n},\n\"cssFontWeight\":\"normal\",\"ascender\":1903,\"underlinePosition\":-125,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-2065.375,\"xMin\":-695.53125,\"yMax\":1901.578125,\"xMax\":1159.671875},\n\"resolution\":1000,\"descender\":-2066,\"familyName\":\"VexFlow-18\",\"lineHeight\":4093,\"underlineThickness\":50\n};\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { BoundingBoxComputation } from './boundingboxcomputation';\nimport { BoundingBox } from './boundingbox';\nimport { Font } from './fonts/vexflow_font';\n\nfunction processOutline(outline, originX, originY, scaleX, scaleY, outlineFns) {\n  let command;\n  let x;\n  let y;\n  let i = 0;\n\n  function nextX() { return originX + outline[i++] * scaleX; }\n  function nextY() { return originY + outline[i++] * scaleY; }\n\n  while (i < outline.length) {\n    command = outline[i++];\n    switch (command) {\n      case 'm':\n      case 'l':\n        outlineFns[command](nextX(), nextY());\n        break;\n      case 'q':\n        x = nextX();\n        y = nextY();\n        outlineFns.q(nextX(), nextY(), x, y);\n        break;\n      case 'b':\n        x = nextX();\n        y = nextY();\n        outlineFns.b(nextX(), nextY(), nextX(), nextY(), x, y);\n        break;\n      default:\n        break;\n    }\n  }\n}\n\nexport class Glyph extends Element {\n  /* Static methods used to implement loading / unloading of glyphs */\n  static loadMetrics(font, code, cache) {\n    const glyph = font.glyphs[code];\n    if (!glyph) {\n      throw new Vex.RERR('BadGlyph', `Glyph ${code} does not exist in font.`);\n    }\n\n    const x_min = glyph.x_min;\n    const x_max = glyph.x_max;\n    const ha = glyph.ha;\n\n    let outline;\n\n    if (glyph.o) {\n      if (cache) {\n        if (glyph.cached_outline) {\n          outline = glyph.cached_outline;\n        } else {\n          outline = glyph.o.split(' ');\n          glyph.cached_outline = outline;\n        }\n      } else {\n        if (glyph.cached_outline) delete glyph.cached_outline;\n        outline = glyph.o.split(' ');\n      }\n\n      return {\n        x_min,\n        x_max,\n        ha,\n        outline,\n      };\n    } else {\n      throw new Vex.RERR('BadGlyph', `Glyph ${code} has no outline defined.`);\n    }\n  }\n\n  /**\n   * A quick and dirty static glyph renderer. Renders glyphs from the default\n   * font defined in Vex.Flow.Font.\n   *\n   * @param {!Object} ctx The canvas context.\n   * @param {number} x_pos X coordinate.\n   * @param {number} y_pos Y coordinate.\n   * @param {number} point The point size to use.\n   * @param {string} val The glyph code in Vex.Flow.Font.\n   * @param {boolean} nocache If set, disables caching of font outline.\n   */\n  static renderGlyph(ctx, x_pos, y_pos, point, val, nocache) {\n    const scale = point * 72.0 / (Font.resolution * 100.0);\n    const metrics = Glyph.loadMetrics(Font, val, !nocache);\n    Glyph.renderOutline(ctx, metrics.outline, scale, x_pos, y_pos);\n  }\n\n  static renderOutline(ctx, outline, scale, x_pos, y_pos) {\n    ctx.beginPath();\n    ctx.moveTo(x_pos, y_pos);\n    processOutline(outline, x_pos, y_pos, scale, -scale, {\n      m: ctx.moveTo.bind(ctx),\n      l: ctx.lineTo.bind(ctx),\n      q: ctx.quadraticCurveTo.bind(ctx),\n      b: ctx.bezierCurveTo.bind(ctx),\n    });\n    ctx.fill();\n  }\n\n  static getOutlineBoundingBox(outline, scale, x_pos, y_pos) {\n    const bboxComp = new BoundingBoxComputation();\n\n    processOutline(outline, x_pos, y_pos, scale, -scale, {\n      m: bboxComp.addPoint.bind(bboxComp),\n      l: bboxComp.addPoint.bind(bboxComp),\n      q: bboxComp.addQuadraticCurve.bind(bboxComp),\n      b: bboxComp.addBezierCurve.bind(bboxComp),\n    });\n\n    return new BoundingBox(\n      bboxComp.x1,\n      bboxComp.y1,\n      bboxComp.width(),\n      bboxComp.height()\n    );\n  }\n\n  /**\n   * @constructor\n   */\n  constructor(code, point, options) {\n    super();\n    this.setAttribute('type', 'Glyph');\n\n    this.code = code;\n    this.point = point;\n    this.options = {\n      cache: true,\n      font: Font,\n    };\n\n    this.metrics = null;\n    this.x_shift = 0;\n    this.y_shift = 0;\n\n    this.originShift = {\n      x: 0,\n      y: 0,\n    };\n\n    if (options) {\n      this.setOptions(options);\n    } else {\n      this.reset();\n    }\n  }\n\n  setOptions(options) {\n    Vex.Merge(this.options, options);\n    this.reset();\n  }\n\n  setPoint(point) { this.point = point; return this; }\n  setStave(stave) { this.stave = stave; return this; }\n  setXShift(x_shift) { this.x_shift = x_shift; return this; }\n  setYShift(y_shift) { this.y_shift = y_shift; return this; }\n\n  reset() {\n    this.scale = this.point * 72 / (this.options.font.resolution * 100);\n    this.metrics = Glyph.loadMetrics(\n      this.options.font,\n      this.code,\n      this.options.cache\n    );\n    this.bbox = Glyph.getOutlineBoundingBox(\n      this.metrics.outline,\n      this.scale,\n      0,\n      0\n    );\n  }\n\n  getMetrics() {\n    if (!this.metrics) {\n      throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n    }\n\n    return {\n      x_min: this.metrics.x_min * this.scale,\n      x_max: this.metrics.x_max * this.scale,\n      width: this.bbox.getW(),\n      height: this.bbox.getH(),\n    };\n  }\n\n  setOriginX(x) {\n    const { bbox } = this;\n    const originX = Math.abs(bbox.getX() / bbox.getW());\n    const xShift = (x - originX) * bbox.getW();\n    this.originShift.x = -xShift;\n  }\n\n  setOriginY(y) {\n    const { bbox } = this;\n    const originY = Math.abs(bbox.getY() / bbox.getH());\n    const yShift = (y - originY) * bbox.getH();\n    this.originShift.y = -yShift;\n  }\n\n  setOrigin(x, y) {\n    this.setOriginX(x);\n    this.setOriginY(y);\n  }\n\n  render(ctx, x, y) {\n    if (!this.metrics) {\n      throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n    }\n\n    const outline = this.metrics.outline;\n    const scale = this.scale;\n\n    this.setRendered();\n    this.applyStyle(ctx);\n    Glyph.renderOutline(ctx, outline, scale, x + this.originShift.x, y + this.originShift.y);\n    this.restoreStyle(ctx);\n  }\n\n  renderToStave(x) {\n    this.checkContext();\n\n    if (!this.metrics) {\n      throw new Vex.RuntimeError('BadGlyph', `Glyph ${this.code} is not initialized.`);\n    }\n\n    if (!this.stave) {\n      throw new Vex.RuntimeError('GlyphError', 'No valid stave');\n    }\n\n    const outline = this.metrics.outline;\n    const scale = this.scale;\n\n    this.setRendered();\n    this.applyStyle();\n    Glyph.renderOutline(this.context, outline, scale,\n      x + this.x_shift, this.stave.getYForGlyphs() + this.y_shift);\n    this.restoreStyle();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\n/* eslint-disable key-spacing */\n\nimport { Vex } from './vex';\nimport { Fraction } from './fraction';\nimport { Glyph } from './glyph';\n\nconst Flow = {\n  STEM_WIDTH: 1.5,\n  STEM_HEIGHT: 35,\n  STAVE_LINE_THICKNESS: 1,\n  RESOLUTION: 16384,\n  DEFAULT_NOTATION_FONT_SCALE: 39,\n  DEFAULT_TABLATURE_FONT_SCALE: 39,\n  SLASH_NOTEHEAD_WIDTH: 15,\n\n  // HACK:\n  // Since text origins are positioned at the baseline, we must\n  // compensate for the ascender of the text. Of course, 1 staff space is\n  // a very poor approximation.\n  //\n  // This will be deprecated in the future. This is a temporary solution until\n  // we have more robust text metrics.\n  TEXT_HEIGHT_OFFSET_HACK: 1,\n\n  /* Kerning (DEPRECATED) */\n  IsKerned: true,\n};\n\n\nFlow.clefProperties = clef => {\n  if (!clef) throw new Vex.RERR('BadArgument', 'Invalid clef: ' + clef);\n\n  const props = Flow.clefProperties.values[clef];\n  if (!props) throw new Vex.RERR('BadArgument', 'Invalid clef: ' + clef);\n\n  return props;\n};\n\nFlow.clefProperties.values = {\n  'treble': { line_shift: 0 },\n  'bass': { line_shift: 6 },\n  'tenor': { line_shift: 4 },\n  'alto': { line_shift: 3 },\n  'soprano': { line_shift: 1 },\n  'percussion': { line_shift: 0 },\n  'mezzo-soprano': { line_shift: 2 },\n  'baritone-c': { line_shift: 5 },\n  'baritone-f': { line_shift: 5 },\n  'subbass': { line_shift: 7 },\n  'french': { line_shift: -1 },\n};\n\n/*\n  Take a note in the format \"Key/Octave\" (e.g., \"C/5\") and return properties.\n\n  The last argument, params, is a struct the currently can contain one option,\n  octave_shift for clef ottavation (0 = default; 1 = 8va; -1 = 8vb, etc.).\n*/\nFlow.keyProperties = (key, clef, params) => {\n  if (clef === undefined) {\n    clef = 'treble';\n  }\n\n  const options = { octave_shift: 0 };\n\n  if (typeof params === 'object') {\n    Vex.Merge(options, params);\n  }\n\n  const pieces = key.split('/');\n\n  if (pieces.length < 2) {\n    throw new Vex.RERR('BadArguments', `Key must have note + octave and an optional glyph: ${key}`);\n  }\n\n  const k = pieces[0].toUpperCase();\n  const value = Flow.keyProperties.note_values[k];\n  if (!value) throw new Vex.RERR('BadArguments', 'Invalid key name: ' + k);\n  if (value.octave) pieces[1] = value.octave;\n\n  let octave = parseInt(pieces[1], 10);\n\n  // Octave_shift is the shift to compensate for clef 8va/8vb.\n  octave += -1 * options.octave_shift;\n\n  const base_index = (octave * 7) - (4 * 7);\n  let line = (base_index + value.index) / 2;\n  line += Flow.clefProperties(clef).line_shift;\n\n  let stroke = 0;\n\n  if (line <= 0 && (((line * 2) % 2) === 0)) stroke = 1;  // stroke up\n  if (line >= 6 && (((line * 2) % 2) === 0)) stroke = -1; // stroke down\n\n  // Integer value for note arithmetic.\n  const int_value = typeof (value.int_val) !== 'undefined'\n    ? (octave * 12) + value.int_val\n    : null;\n\n  /* Check if the user specified a glyph. */\n  const code = value.code;\n  const shift_right = value.shift_right;\n  let extraProps = {};\n  if (pieces.length > 2 && pieces[2]) {\n    const glyph_name = pieces[2].toUpperCase();\n    extraProps = Flow.keyProperties.customNoteHeads[glyph_name] || {};\n  }\n\n  return {\n    key: k,\n    octave,\n    line,\n    int_value,\n    accidental: value.accidental,\n    code,\n    stroke,\n    shift_right,\n    displaced: false,\n    ...extraProps,\n  };\n};\n\nFlow.keyProperties.note_values = {\n  'C': { index: 0, int_val: 0, accidental: null },\n  'CN': { index: 0, int_val: 0, accidental: 'n' },\n  'C#': { index: 0, int_val: 1, accidental: '#' },\n  'C##': { index: 0, int_val: 2, accidental: '##' },\n  'CB': { index: 0, int_val: -1, accidental: 'b' },\n  'CBB': { index: 0, int_val: -2, accidental: 'bb' },\n  'D': { index: 1, int_val: 2, accidental: null },\n  'DN': { index: 1, int_val: 2, accidental: 'n' },\n  'D#': { index: 1, int_val: 3, accidental: '#' },\n  'D##': { index: 1, int_val: 4, accidental: '##' },\n  'DB': { index: 1, int_val: 1, accidental: 'b' },\n  'DBB': { index: 1, int_val: 0, accidental: 'bb' },\n  'E': { index: 2, int_val: 4, accidental: null },\n  'EN': { index: 2, int_val: 4, accidental: 'n' },\n  'E#': { index: 2, int_val: 5, accidental: '#' },\n  'E##': { index: 2, int_val: 6, accidental: '##' },\n  'EB': { index: 2, int_val: 3, accidental: 'b' },\n  'EBB': { index: 2, int_val: 2, accidental: 'bb' },\n  'F': { index: 3, int_val: 5, accidental: null },\n  'FN': { index: 3, int_val: 5, accidental: 'n' },\n  'F#': { index: 3, int_val: 6, accidental: '#' },\n  'F##': { index: 3, int_val: 7, accidental: '##' },\n  'FB': { index: 3, int_val: 4, accidental: 'b' },\n  'FBB': { index: 3, int_val: 3, accidental: 'bb' },\n  'G': { index: 4, int_val: 7, accidental: null },\n  'GN': { index: 4, int_val: 7, accidental: 'n' },\n  'G#': { index: 4, int_val: 8, accidental: '#' },\n  'G##': { index: 4, int_val: 9, accidental: '##' },\n  'GB': { index: 4, int_val: 6, accidental: 'b' },\n  'GBB': { index: 4, int_val: 5, accidental: 'bb' },\n  'A': { index: 5, int_val: 9, accidental: null },\n  'AN': { index: 5, int_val: 9, accidental: 'n' },\n  'A#': { index: 5, int_val: 10, accidental: '#' },\n  'A##': { index: 5, int_val: 11, accidental: '##' },\n  'AB': { index: 5, int_val: 8, accidental: 'b' },\n  'ABB': { index: 5, int_val: 7, accidental: 'bb' },\n  'B': { index: 6, int_val: 11, accidental: null },\n  'BN': { index: 6, int_val: 11, accidental: 'n' },\n  'B#': { index: 6, int_val: 12, accidental: '#' },\n  'B##': { index: 6, int_val: 13, accidental: '##' },\n  'BB': { index: 6, int_val: 10, accidental: 'b' },\n  'BBB': { index: 6, int_val: 9, accidental: 'bb' },\n  'R': { index: 6, int_val: 9, rest: true }, // Rest\n  'X': {\n    index: 6,\n    accidental: '',\n    octave: 4,\n    code: 'v3e',\n    shift_right: 5.5,\n  },\n};\n\n// Custom note heads\nFlow.keyProperties.customNoteHeads = {\n  /* Diamond */\n  'D0': {\n    code: 'v27',\n    shift_right: 0, // deprecated for stem_{up,down}_x_offset\n    stem_up_x_offset: 0,\n    stem_down_x_offset: 0,\n    stem_up_y_offset: -1,\n    stem_down_y_offset: 0\n  },\n  'D1': { code: 'v2d', shift_right: -0.5 },\n  'D2': { code: 'v22', shift_right: -0.5 },\n  'D3': { code: 'v70', shift_right: -0.5 },\n\n  /* Triangle */\n  'T0': { code: 'v49', shift_right: -2, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n  'T1': { code: 'v93', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n  'T2': { code: 'v40', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n  'T3': { code: 'v7d', shift_right: 0.5, stem_up_y_offset: -4, stem_down_y_offset: 4 },\n\n  /* Cross */\n  'X0': {\n    code: 'v92',\n    stem_up_x_offset: -2,\n    stem_down_x_offset: 0,\n    stem_up_y_offset: 4,\n    stem_down_y_offset: 4\n  },\n  'X1': { code: 'v95', shift_right: -0.5, stem_up_y_offset: 4, stem_down_y_offset: 4 },\n  'X2': { code: 'v3e', shift_right: 0.5, stem_up_y_offset: 4, stem_down_y_offset: 4 },\n  'X3': {\n    code: 'v3b',\n    shift_right: 0,\n    stem_up_x_offset: -1.2,\n    stem_down_x_offset: 0,\n    stem_up_y_offset: -1,\n    stem_down_y_offset: 2\n  },\n\n  /* Square */\n  'S1': { code: 'vd3', shift_right: 0 },\n  'S2': { code: 'vd2', shift_right: 0 },\n\n  /* Rectangle */\n  'R1': { code: 'vd5', shift_right: 0 },\n  'R2': { code: 'vd4', shift_right: 0 },\n};\n\nFlow.integerToNote = integer => {\n  if (typeof (integer) === 'undefined') {\n    throw new Vex.RERR('BadArguments', 'Undefined integer for integerToNote');\n  }\n\n  if (integer < -2) {\n    throw new Vex.RERR('BadArguments', `integerToNote requires integer > -2: ${integer}`);\n  }\n\n  const noteValue = Flow.integerToNote.table[integer];\n  if (!noteValue) {\n    throw new Vex.RERR('BadArguments', `Unknown note value for integer: ${integer}`);\n  }\n\n  return noteValue;\n};\n\nFlow.integerToNote.table = {\n  0: 'C',\n  1: 'C#',\n  2: 'D',\n  3: 'D#',\n  4: 'E',\n  5: 'F',\n  6: 'F#',\n  7: 'G',\n  8: 'G#',\n  9: 'A',\n  10: 'A#',\n  11: 'B',\n};\n\nFlow.tabToGlyph = (fret, scale = 1.0) => {\n  let glyph = null;\n  let width = 0;\n  let shift_y = 0;\n\n  if (fret.toString().toUpperCase() === 'X') {\n    const glyphMetrics = new Glyph('v7f', Flow.DEFAULT_TABLATURE_FONT_SCALE).getMetrics();\n    glyph = 'v7f';\n    width = glyphMetrics.width;\n    shift_y = -glyphMetrics.height / 2;\n  } else {\n    width = Flow.textWidth(fret.toString());\n  }\n\n  return {\n    text: fret,\n    code: glyph,\n    getWidth: () => width * scale,\n    shift_y,\n  };\n};\n\nFlow.textWidth = text => 7 * text.toString().length;\n\nFlow.articulationCodes = artic => Flow.articulationCodes.articulations[artic];\n\nFlow.articulationCodes.articulations = {\n  'a.': { code: 'v23', between_lines: true }, // Staccato\n  'av': { code: 'v28', between_lines: true }, // Staccatissimo\n  'a>': { code: 'v42', between_lines: true }, // Accent\n  'a-': { code: 'v25', between_lines: true }, // Tenuto\n  'a^': { code: 'va', between_lines: false }, // Marcato\n  'a+': { code: 'v8b', between_lines: false }, // Left hand pizzicato\n  'ao': { code: 'v94', between_lines: false }, // Snap pizzicato\n  'ah': { code: 'vb9', between_lines: false }, // Natural harmonic or open note\n  'a@a': { code: 'v43', between_lines: false }, // Fermata above staff\n  'a@u': { code: 'v5b', between_lines: false }, // Fermata below staff\n  'a|': { code: 'v75', between_lines: false }, // Bow up - up stroke\n  'am': { code: 'v97', between_lines: false }, // Bow down - down stroke\n  'a,': { code: 'vb3', between_lines: false }, // Choked\n};\n\nFlow.accidentalCodes = acc => Flow.accidentalCodes.accidentals[acc];\n\nFlow.accidentalCodes.accidentals = {\n  '#': { code: 'v18', parenRightPaddingAdjustment: -1 },\n  '##': { code: 'v7f', parenRightPaddingAdjustment: -1 },\n  'b': { code: 'v44', parenRightPaddingAdjustment: -2 },\n  'bb': { code: 'v26', parenRightPaddingAdjustment: -2 },\n  'n': { code: 'v4e', parenRightPaddingAdjustment: -1 },\n  '{': { code: 'v9c', parenRightPaddingAdjustment: -1 },\n  '}': { code: 'v84', parenRightPaddingAdjustment: -1 },\n  'db': { code: 'v9e', parenRightPaddingAdjustment: -1 },\n  'd': { code: 'vab', parenRightPaddingAdjustment: 0 },\n  'bbs': { code: 'v90', parenRightPaddingAdjustment: -1 },\n  '++': { code: 'v51', parenRightPaddingAdjustment: -1 },\n  '+': { code: 'v78', parenRightPaddingAdjustment: -1 },\n  '+-': { code: 'v8d', parenRightPaddingAdjustment: -1 },\n  '++-': { code: 'v7a', parenRightPaddingAdjustment: -1 },\n  'bs': { code: 'vb7', parenRightPaddingAdjustment: -1 },\n  'bss': { code: 'v39', parenRightPaddingAdjustment: -1 },\n  'o': { code: 'vd0', parenRightPaddingAdjustment: -1 },\n  'k': { code: 'vd1', parenRightPaddingAdjustment: -1 },\n  'ashs': { code: 'vd6', parenRightPaddingAdjustment: -1 },  // arabic sharp half sharp\n  'afhf': { code: 'vd7', parenRightPaddingAdjustment: -1 },  // arabic flat half flat\n};\n\nFlow.accidentalColumnsTable = {\n  1: {\n    a: [1],\n    b: [1],\n  },\n  2: {\n    a: [1, 2],\n  },\n  3: {\n    a: [1, 3, 2],\n    b: [1, 2, 1],\n    second_on_bottom: [1, 2, 3],\n  },\n  4: {\n    a: [1, 3, 4, 2],\n    b: [1, 2, 3, 1],\n    spaced_out_tetrachord: [1, 2, 1, 2],\n  },\n  5: {\n    a: [1, 3, 5, 4, 2],\n    b: [1, 2, 4, 3, 1],\n    spaced_out_pentachord: [1, 2, 3, 2, 1],\n    very_spaced_out_pentachord: [1, 2, 1, 2, 1],\n  },\n  6: {\n    a: [1, 3, 5, 6, 4, 2],\n    b: [1, 2, 4, 5, 3, 1],\n    spaced_out_hexachord: [1, 3, 2, 1, 3, 2],\n    very_spaced_out_hexachord: [1, 2, 1, 2, 1, 2],\n  },\n};\n\nFlow.ornamentCodes = acc => Flow.ornamentCodes.ornaments[acc];\n\nFlow.ornamentCodes.ornaments = {\n  'mordent': { code: 'v1e' },\n  'mordent_inverted': { code: 'v45' },\n  'turn': { code: 'v72' },\n  'turn_inverted': { code: 'v33' },\n  'tr': { code: 'v1f' },\n  'upprall': { code: 'v60' },\n  'downprall': { code: 'vb4' },\n  'prallup': { code: 'v6d' },\n  'pralldown': { code: 'v2c' },\n  'upmordent': { code: 'v29' },\n  'downmordent': { code: 'v68' },\n  'lineprall': { code: 'v20' },\n  'prallprall': { code: 'v86' },\n};\n\nFlow.keySignature = spec => {\n  const keySpec = Flow.keySignature.keySpecs[spec];\n\n  if (!keySpec) {\n    throw new Vex.RERR('BadKeySignature', `Bad key signature spec: '${spec}'`);\n  }\n\n  if (!keySpec.acc) {\n    return [];\n  }\n\n  const notes = Flow.keySignature.accidentalList(keySpec.acc);\n\n  const acc_list = [];\n  for (let i = 0; i < keySpec.num; ++i) {\n    const line = notes[i];\n    acc_list.push({ type: keySpec.acc, line });\n  }\n\n  return acc_list;\n};\n\nFlow.keySignature.keySpecs = {\n  'C': { acc: null, num: 0 },\n  'Am': { acc: null, num: 0 },\n  'F': { acc: 'b', num: 1 },\n  'Dm': { acc: 'b', num: 1 },\n  'Bb': { acc: 'b', num: 2 },\n  'Gm': { acc: 'b', num: 2 },\n  'Eb': { acc: 'b', num: 3 },\n  'Cm': { acc: 'b', num: 3 },\n  'Ab': { acc: 'b', num: 4 },\n  'Fm': { acc: 'b', num: 4 },\n  'Db': { acc: 'b', num: 5 },\n  'Bbm': { acc: 'b', num: 5 },\n  'Gb': { acc: 'b', num: 6 },\n  'Ebm': { acc: 'b', num: 6 },\n  'Cb': { acc: 'b', num: 7 },\n  'Abm': { acc: 'b', num: 7 },\n  'G': { acc: '#', num: 1 },\n  'Em': { acc: '#', num: 1 },\n  'D': { acc: '#', num: 2 },\n  'Bm': { acc: '#', num: 2 },\n  'A': { acc: '#', num: 3 },\n  'F#m': { acc: '#', num: 3 },\n  'E': { acc: '#', num: 4 },\n  'C#m': { acc: '#', num: 4 },\n  'B': { acc: '#', num: 5 },\n  'G#m': { acc: '#', num: 5 },\n  'F#': { acc: '#', num: 6 },\n  'D#m': { acc: '#', num: 6 },\n  'C#': { acc: '#', num: 7 },\n  'A#m': { acc: '#', num: 7 },\n};\n\nFlow.unicode = {\n  // Unicode accidentals\n  'sharp': String.fromCharCode(parseInt('266F', 16)),\n  'flat': String.fromCharCode(parseInt('266D', 16)),\n  'natural': String.fromCharCode(parseInt('266E', 16)),\n  // Major Chord\n  'triangle': String.fromCharCode(parseInt('25B3', 16)),\n  // half-diminished\n  'o-with-slash': String.fromCharCode(parseInt('00F8', 16)),\n  // Diminished\n  'degrees': String.fromCharCode(parseInt('00B0', 16)),\n  'circle': String.fromCharCode(parseInt('25CB', 16)),\n};\n\nFlow.keySignature.accidentalList = (acc) => {\n  const patterns = {\n    'b': [2, 0.5, 2.5, 1, 3, 1.5, 3.5],\n    '#': [0, 1.5, -0.5, 1, 2.5, 0.5, 2],\n  };\n\n  return patterns[acc];\n};\n\nFlow.parseNoteDurationString = durationString => {\n  if (typeof (durationString) !== 'string') {\n    return null;\n  }\n\n  const regexp = /(\\d*\\/?\\d+|[a-z])(d*)([nrhms]|$)/;\n\n  const result = regexp.exec(durationString);\n  if (!result) {\n    return null;\n  }\n\n  const duration = result[1];\n  const dots = result[2].length;\n  let type = result[3];\n\n  if (type.length === 0) {\n    type = 'n';\n  }\n\n  return {\n    duration,\n    dots,\n    type,\n  };\n};\n\nFlow.parseNoteStruct = noteStruct => {\n  const duration = noteStruct.duration;\n\n  // Preserve backwards-compatibility\n  const durationStringData = Flow.parseNoteDurationString(duration);\n  if (!durationStringData) {\n    return null;\n  }\n\n  let ticks = Flow.durationToTicks(durationStringData.duration);\n  if (ticks == null) {\n    return null;\n  }\n\n  let type = noteStruct.type;\n  const customTypes = [];\n\n  if (type) {\n    if (!Flow.getGlyphProps.validTypes[type]) {\n      return null;\n    }\n  } else {\n    type = durationStringData.type || 'n';\n\n    // If we have keys, try and check if we've got a custom glyph\n    if (noteStruct.keys !== undefined) {\n      noteStruct.keys.forEach((k, i) => {\n        const result = k.split('/');\n        // We have a custom glyph specified after the note eg. /X2\n        if (result && result.length === 3) {\n          customTypes[i] = result[2];\n        }\n      });\n    }\n  }\n\n  const dots = noteStruct.dots ? noteStruct.dots : durationStringData.dots;\n\n  if (typeof (dots) !== 'number') {\n    return null;\n  }\n\n  let currentTicks = ticks;\n\n  for (let i = 0; i < dots; i++) {\n    if (currentTicks <= 1) return null;\n\n    currentTicks = currentTicks / 2;\n    ticks += currentTicks;\n  }\n\n  return {\n    duration: durationStringData.duration,\n    type,\n    customTypes,\n    dots,\n    ticks,\n  };\n};\n\n// Used to convert duration aliases to the number based duration.\n// If the input isn't an alias, simply return the input.\n//\n// example: 'q' -> '4', '8' -> '8'\nFlow.sanitizeDuration = duration => {\n  const alias = Flow.durationAliases[duration];\n  if (alias !== undefined) {\n    duration = alias;\n  }\n\n  if (Flow.durationToTicks.durations[duration] === undefined) {\n    throw new Vex.RERR('BadArguments', `The provided duration is not valid: ${duration}`);\n  }\n\n  return duration;\n};\n\n// Convert the `duration` to an fraction\nFlow.durationToFraction = duration => new Fraction().parse(Flow.sanitizeDuration(duration));\n\n// Convert the `duration` to an number\nFlow.durationToNumber = duration => Flow.durationToFraction(duration).value();\n\n// Convert the `duration` to total ticks\nFlow.durationToTicks = duration => {\n  duration = Flow.sanitizeDuration(duration);\n\n  const ticks = Flow.durationToTicks.durations[duration];\n  if (ticks === undefined) {\n    return null;\n  }\n\n  return ticks;\n};\n\nFlow.durationToTicks.durations = {\n  '1/2': Flow.RESOLUTION * 2,\n  '1': Flow.RESOLUTION / 1,\n  '2': Flow.RESOLUTION / 2,\n  '4': Flow.RESOLUTION / 4,\n  '8': Flow.RESOLUTION / 8,\n  '16': Flow.RESOLUTION / 16,\n  '32': Flow.RESOLUTION / 32,\n  '64': Flow.RESOLUTION / 64,\n  '128': Flow.RESOLUTION / 128,\n  '256': Flow.RESOLUTION / 256,\n};\n\nFlow.durationAliases = {\n  'w': '1',\n  'h': '2',\n  'q': '4',\n\n  // This is the default duration used to render bars (BarNote). Bars no longer\n  // consume ticks, so this should be a no-op.\n  //\n  // TODO(0xfe): This needs to be cleaned up.\n  'b': '256',\n};\n\n// Return a glyph given duration and type. The type can be a custom glyph code from customNoteHeads.\nFlow.getGlyphProps = (duration, type) => {\n  duration = Flow.sanitizeDuration(duration);\n\n  const code = Flow.getGlyphProps.duration_codes[duration];\n  if (code === undefined) {\n    return null;\n  }\n\n  if (!type) {\n    type = 'n';\n  }\n\n  let glyphTypeProperties = code.type[type];\n\n  if (glyphTypeProperties === undefined) {\n    // Try and get it from the custom list of note heads\n    const customGlyphTypeProperties = Flow.keyProperties.customNoteHeads[type.toUpperCase()];\n\n    // If not, then return with nothing\n    if (customGlyphTypeProperties === undefined) {\n      return null;\n    }\n\n    // Otherwise set it as the code_head value\n    glyphTypeProperties = {\n      code_head: customGlyphTypeProperties.code,\n      ...customGlyphTypeProperties,\n    };\n  }\n\n  return { ...code.common, ...glyphTypeProperties };\n};\n\nFlow.getGlyphProps.validTypes = {\n  'n': { name: 'note' },\n  'r': { name: 'rest' },\n  'h': { name: 'harmonic' },\n  'm': { name: 'muted' },\n  's': { name: 'slash' },\n};\n\nFlow.getGlyphProps.duration_codes = {\n  '1/2': {\n    common: {\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'v53', scale).getMetrics().width;\n      },\n      stem: false,\n      stem_offset: 0,\n      flag: false,\n      stem_up_extension: -Flow.STEM_HEIGHT,\n      stem_down_extension: -Flow.STEM_HEIGHT,\n      tabnote_stem_up_extension: -Flow.STEM_HEIGHT,\n      tabnote_stem_down_extension: -Flow.STEM_HEIGHT,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Breve note\n        code_head: 'v53',\n      },\n      'h': { // Breve note harmonic\n        code_head: 'v59',\n      },\n      'm': { // Breve note muted -\n        code_head: 'vf',\n        stem_offset: 0,\n      },\n      'r': { // Breve rest\n        code_head: 'v31',\n        rest: true,\n        position: 'B/5',\n        dot_shiftY: 0.5,\n      },\n      's': { // Breve note slash -\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '1': {\n    common: {\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'v1d', scale).getMetrics().width;\n      },\n      stem: false,\n      stem_offset: 0,\n      flag: false,\n      stem_up_extension: -Flow.STEM_HEIGHT,\n      stem_down_extension: -Flow.STEM_HEIGHT,\n      tabnote_stem_up_extension: -Flow.STEM_HEIGHT,\n      tabnote_stem_down_extension: -Flow.STEM_HEIGHT,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Whole note\n        code_head: 'v1d',\n      },\n      'h': { // Whole note harmonic\n        code_head: 'v46',\n      },\n      'm': { // Whole note muted\n        code_head: 'v92',\n        stem_offset: -3,\n      },\n      'r': { // Whole rest\n        code_head: 'v5c',\n        rest: true,\n        position: 'D/5',\n        dot_shiftY: 0.5,\n      },\n      's': { // Whole note slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '2': {\n    common: {\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'v81', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: false,\n      stem_up_extension: 0,\n      stem_down_extension: 0,\n      tabnote_stem_up_extension: 0,\n      tabnote_stem_down_extension: 0,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Half note\n        code_head: 'v81',\n      },\n      'h': { // Half note harmonic\n        code_head: 'v2d',\n      },\n      'm': { // Half note muted\n        code_head: 'v95',\n        stem_offset: -3,\n      },\n      'r': { // Half rest\n        code_head: 'vc',\n        stem: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -0.5,\n      },\n      's': { // Half note slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '4': {\n    common: {\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: false,\n      stem_up_extension: 0,\n      stem_down_extension: 0,\n      tabnote_stem_up_extension: 0,\n      tabnote_stem_down_extension: 0,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Quarter note\n        code_head: 'vb',\n      },\n      'h': { // Quarter harmonic\n        code_head: 'v22',\n      },\n      'm': { // Quarter muted\n        code_head: 'v3e',\n        stem_offset: -3,\n      },\n      'r': { // Quarter rest\n        code_head: 'v7c',\n        stem: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -0.5,\n        line_above: 1.5,\n        line_below: 1.5,\n      },\n      's': { // Quarter slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '8': {\n    common: {\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: true,\n      beam_count: 1,\n      code_flag_upstem: 'v54',\n      code_flag_downstem: 'v9a',\n      stem_up_extension: 0,\n      stem_down_extension: 0,\n      tabnote_stem_up_extension: 0,\n      tabnote_stem_down_extension: 0,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Eighth note\n        code_head: 'vb',\n      },\n      'h': { // Eighth note harmonic\n        code_head: 'v22',\n      },\n      'm': { // Eighth note muted\n        code_head: 'v3e',\n      },\n      'r': { // Eighth rest\n        code_head: 'va5',\n        stem: false,\n        flag: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -0.5,\n        line_above: 1.0,\n        line_below: 1.0,\n      },\n      's': { // Eight slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '16': {\n    common: {\n      beam_count: 2,\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: true,\n      code_flag_upstem: 'v3f',\n      code_flag_downstem: 'v8f',\n      stem_up_extension: 0,\n      stem_down_extension: 0,\n      tabnote_stem_up_extension: 0,\n      tabnote_stem_down_extension: 0,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Sixteenth note\n        code_head: 'vb',\n      },\n      'h': { // Sixteenth note harmonic\n        code_head: 'v22',\n      },\n      'm': { // Sixteenth note muted\n        code_head: 'v3e',\n      },\n      'r': { // Sixteenth rest\n        code_head: 'v3c',\n        stem: false,\n        flag: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -0.5,\n        line_above: 1.0,\n        line_below: 2.0,\n      },\n      's': { // Sixteenth slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '32': {\n    common: {\n      beam_count: 3,\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: true,\n      code_flag_upstem: 'v47',\n      code_flag_downstem: 'v2a',\n      stem_up_extension: 9,\n      stem_down_extension: 9,\n      tabnote_stem_up_extension: 8,\n      tabnote_stem_down_extension: 5,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Thirty-second note\n        code_head: 'vb',\n      },\n      'h': { // Thirty-second harmonic\n        code_head: 'v22',\n      },\n      'm': { // Thirty-second muted\n        code_head: 'v3e',\n      },\n      'r': { // Thirty-second rest\n        code_head: 'v55',\n        stem: false,\n        flag: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -1.5,\n        line_above: 2.0,\n        line_below: 2.0,\n      },\n      's': { // Thirty-second slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '64': {\n    common: {\n      beam_count: 4,\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: true,\n      code_flag_upstem: 'va9',\n      code_flag_downstem: 'v58',\n      stem_up_extension: 13,\n      stem_down_extension: 13,\n      tabnote_stem_up_extension: 12,\n      tabnote_stem_down_extension: 9,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': { // Sixty-fourth note\n        code_head: 'vb',\n      },\n      'h': { // Sixty-fourth harmonic\n        code_head: 'v22',\n      },\n      'm': { // Sixty-fourth muted\n        code_head: 'v3e',\n      },\n      'r': { // Sixty-fourth rest\n        code_head: 'v38',\n        stem: false,\n        flag: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: -1.5,\n        line_above: 2.0,\n        line_below: 3.0,\n      },\n      's': { // Sixty-fourth slash\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n  '128': {\n    common: {\n      beam_count: 5,\n      getWidth(scale = Flow.DEFAULT_NOTATION_FONT_SCALE) {\n        return new Glyph(this.code_head || 'vb', scale).getMetrics().width;\n      },\n      stem: true,\n      stem_offset: 0,\n      flag: true,\n      code_flag_upstem: 'v9b',\n      code_flag_downstem: 'v30',\n      stem_up_extension: 22,\n      stem_down_extension: 22,\n      tabnote_stem_up_extension: 21,\n      tabnote_stem_down_extension: 18,\n      dot_shiftY: 0,\n      line_above: 0,\n      line_below: 0,\n    },\n    type: {\n      'n': {  // Hundred-twenty-eight note\n        code_head: 'vb',\n      },\n      'h': { // Hundred-twenty-eight harmonic\n        code_head: 'v22',\n      },\n      'm': { // Hundred-twenty-eight muted\n        code_head: 'v3e',\n      },\n      'r': {  // Hundred-twenty-eight rest\n        code_head: 'vaa',\n        stem: false,\n        flag: false,\n        rest: true,\n        position: 'B/4',\n        dot_shiftY: 1.5,\n        line_above: 3.0,\n        line_below: 3.0,\n      },\n      's': { // Hundred-twenty-eight rest\n        // Drawn with canvas primitives\n        getWidth: () => Flow.SLASH_NOTEHEAD_WIDTH,\n        position: 'B/4',\n      },\n    },\n  },\n};\n\n// For future collaboration with the SMuFL Standard Music Font Layout\n\nFlow.smufl = {};\n\n// add references between smufl glyph names and code points.\nFlow.smufl.to_code_points = {\n  // staff brackets and dividers (e000-e00f)\n  bracketTop: 'v1b',\n  bracketBottom: 'v10',\n\n  // barlines (e030-e03f)\n  barlineTick: 'v6f',\n\n  // repeats (e040-e04f)\n  segno: 'v8c',\n  coda: 'v4d',\n\n  // clefs (e050-e07f)\n  gClef: 'v83',\n  cClef: 'vad',\n  fClef: 'v79',\n  unpitchedPercussionClef1: 'v59', // same as breveNoteheadHarmonic\n  '6stringTabClef': 'v2f',\n\n  // time signatures (e080-e09f)\n  timeSig0: 'v0',\n  timeSig1: 'v1',\n  timeSig2: 'v2',\n  timeSig3: 'v3',\n  timeSig4: 'v4',\n  timeSig5: 'v5',\n  timeSig6: 'v6',\n  timeSig7: 'v7',\n  timeSig8: 'v8',\n  timeSig9: 'v9',\n  timeSigCommon: 'v41',\n  timeSigCutCommon: 'vb6',\n\n  // notehead (e0a0-e0ff)\n  noteheadDoubleWhole: 'v53',\n  noteheadWhole: 'v1d',\n  noteheadHalf: 'v81',\n  noteheadBlack: 'vb',\n  noteheadXWhole: 'v92',\n  noteheadXHalf: 'v95',\n  noteheadXBlack: 'v3e',\n  noteheadCircleX: 'v3b',\n  noteheadTriangleUpWhole: 'v49',\n  noteheadTriangleUpHalf: 'v93',\n  noteheadTriangleUpBlack: 'v40',\n  noteheadDiamondWhole: 'v46',\n  noteheadDiamondHalf: 'v2d',\n  noteheadDiamondBlack: 'v22',\n\n  // individual notes (e1d0-e1ef)\n  augmentationDot: 'v23',\n\n  // temolos (e220-e23f)\n  tremolo1: 'v74',\n\n  // flags (e240-e25f)\n  flag8thUp: 'v54',\n  flag8thDown: 'v9a',\n  flag16thUp: 'v3f',\n  flag16thDown: 'v8f',\n  flag32ndUp: 'v47',\n  flag32ndDown: 'v2a',\n  flag64thUp: 'va9',\n  flag64thDown: 'v58',\n  flag128thUp: 'v9b',\n  flag128thDown: 'v30',\n\n  // standard accidentals (e260-e26f)\n  accidentalFlat: 'v44',\n  accidentalNatural: 'v4e',\n  accidentalSharp: 'v18',\n  accidentalDoubleSharp: 'v7f',\n  accidentalDoubleFlat: 'v26',\n  accidentalParensLeft: 'v9c',\n  accidentalParensRight: 'v84',\n\n  // stein-zimmermann accidentals (24-edo) (e280-e28f)\n  accidentalQuarterToneFlatStein: 'vab',\n  accidentalThreeQuarterTonesFlatZimmermann: 'v9e',\n  accidentalQuarterToneSharpStein: 'v78',\n  accidentalThreeQuarterTonesSharpStein: 'v51',\n\n  // arel-ezgi-uzdilek accidentals (e440-e44f)\n  accidentalBuyukMucennebFlat: 'v39',\n  accidentalBakiyeFlat: 'vb7',\n  accidentalKomaSharp: 'v51', // same as accidentalQuarterToneSharpStein\n  accidentalKucukMucennebSharp: 'v8d',\n\n  // persian accidentals (e460-e46f)\n  accidentalKoron: 'vd1',\n  accidentalSori: 'vd0',\n\n  // articulation (e4a0-e4bf)\n  articAccentAbove: 'v42',\n  articAccentBelow: 'v42', // same as above\n  articTenutoAbove: 'v25',\n  articTenutoBelow: 'v25', // same as above\n  articStaccatoAbove: 'v23', // = dot\n  articStaccatoBelow: 'v23', // = dot\n  articStaccatissimoAbove: 'v28',\n  articMarcatoAbove: 'va',\n\n  // holds and pauses (e4c0-e4df)\n  fermataAbove: 'v43',\n  fermataBelow: 'v5b',\n  breathMarkComma: 'v6c',\n  breathMarkUpbow: 'v8a', // looks better than current upbow\n  caesura: 'v34',\n  caesuraCurved: 'v4b',\n\n  // rests (e4e0-e4ff)\n  restMaxima: 'v59', // not designed for this, but should do the trick\n  // need restLonga -- used in multimeasure rests, like above\n  restDoubleWhole: 'v31',\n  restWhole: 'v5c',\n  restHalf: 'vc',\n  restQuarter: 'v7c',\n  rest8th: 'va5',\n  rest16th: 'v3c',\n  rest32nd: 'v55',\n  rest64th: 'v38',\n  rest128th: 'vaa',\n\n  // dynamics (e520-e54f)\n  dynamicPiano: 'vbf',\n  dynamicMezzo: 'v62',\n  dynamicForte: 'vba',\n  dynamicRinforzando: 'vba',\n  dynamicSforzando: 'v4a',\n  dynamicZ: 'v80',\n\n  // common ornaments (e560-e56f)\n  ornamentTrill: 'v1f',\n  ornamentTurn: 'v72',\n  ornamentTurnSlash: 'v33',\n  ornamentMordent: 'v45',\n  ornamentMordentInverted: 'v1e',\n  ornamentTremblement: 'v86',\n\n  // precomposed trills and mordents (e5b0-e5cf)\n  ornamentPrecompAppoggTrill: 'v20',\n  ornamentPrecompSlideTrillDAnglebert: 'v60',\n  ornamentPrecompSlideTrillBach: 'v29',\n  ornamentPrecompTrillSuffixDandrieu: 'v6d',\n  ornamentPrecompDoubleCadenceUpperPrefix: 'vb4',\n  ornamentPrecompDoubleCadenceUpperPrefixTurn: 'v68',\n  ornamentPrecompTrillLowerSuffix: 'v2c',\n\n  // string techniques (e610-e62f)\n  stringsDownBow: 'v94',\n  stringsUpBow: 'v75',\n  stringsHarmonic: 'vb9',\n\n  // plucked techniques (e630-e63f)\n  pluckedSnapPizzicatoAbove: 'v94',\n  pluckedLeftHandPizzicato: 'v8b', // plus sign\n\n  // keyboard techniques (e650-e67f)\n  keyboardPedalPed: 'v36',\n  keyboardPedalUp: 'v5d',\n\n  // percussion playing technique pictograms (e7f0-e80f)\n  pictChokeCymbal: 'vb3',\n\n  // multi-segment lines (eaa0-eb0f)\n  wiggleArpeggiatoUp: 'va3', // rotated 90deg from reference implementation\n\n  // arrows and arrowheads (eb60-eb8f)\n  arrowheadBlackUp: 'vc3',\n  arrowheadBlackDown: 'v52',\n\n  // not found:\n  // noteheadDiamondWhole: 'v27', stylistic alternate to v46?\n  // noteheadDiamondBlack: 'v70', stylistic alternate to v22?\n  // noteheadTriangleUpBlack: 'v7d', stylistic alternate to v40?\n  // accidentalSlashedDoubleFlat: 'v90',\n  // accidentalOneAndAHalfSharpTurned: 'v7a',\n  // unused marcato alternative?  'v5a',\n  // arpeggioBrushDown: 'v11',\n};\n\n// Some defaults\nFlow.TIME4_4 = {\n  num_beats: 4,\n  beat_value: 4,\n  resolution: Flow.RESOLUTION,\n};\nexport { Flow };\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Mohit Muthanna <mohit@muthanna.com>\n//\n// A rendering context for the Raphael backend.\n//\n// Copyright Mohit Cheppudira 2010\n\nimport { Vex } from './vex';\n\n/** @constructor */\nexport class CanvasContext {\n  static get WIDTH() {\n    return 600;\n  }\n  static get HEIGHT() {\n    return 400;\n  }\n  static get CANVAS_BROWSER_SIZE_LIMIT() {\n    return 32767; // Chrome/Firefox. Could be determined more precisely by npm module canvas-size\n  }\n\n  static SanitizeCanvasDims(width, height) {\n    if (Math.max(width, height) > this.CANVAS_BROWSER_SIZE_LIMIT) {\n      Vex.W(\n        'Canvas dimensions exceed browser limit. Cropping to ' +\n        this.CANVAS_BROWSER_SIZE_LIMIT\n      );\n      if (width > this.CANVAS_BROWSER_SIZE_LIMIT) {\n        width = this.CANVAS_BROWSER_SIZE_LIMIT;\n        // note: Math.min return 0 for undefined, NaN for null. Would change inputs.\n      }\n      if (height > this.CANVAS_BROWSER_SIZE_LIMIT) {\n        height = this.CANVAS_BROWSER_SIZE_LIMIT;\n      }\n    }\n    return [width, height];\n  }\n\n  constructor(context) {\n    // Use a name that is unlikely to clash with a canvas context\n    // property\n    this.vexFlowCanvasContext = context;\n    if (!context.canvas) {\n      this.canvas = {\n        width: CanvasContext.WIDTH,\n        height: CanvasContext.HEIGHT,\n      };\n    } else {\n      this.canvas = context.canvas;\n    }\n  }\n\n  clear() {\n    this.vexFlowCanvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);\n  }\n\n  // Containers not implemented\n  openGroup() {}\n  closeGroup() {}\n  add() {}\n\n  setFont(family, size, weight) {\n    this.vexFlowCanvasContext.font = (weight || '') + ' ' + size + 'pt ' + family;\n    return this;\n  }\n\n  setRawFont(font) {\n    this.vexFlowCanvasContext.font = font;\n    return this;\n  }\n\n  setFillStyle(style) {\n    this.vexFlowCanvasContext.fillStyle = style;\n    return this;\n  }\n\n  setBackgroundFillStyle(style) {\n    this.background_fillStyle = style;\n    return this;\n  }\n\n  setStrokeStyle(style) {\n    this.vexFlowCanvasContext.strokeStyle = style;\n    return this;\n  }\n\n  setShadowColor(style) {\n    this.vexFlowCanvasContext.shadowColor = style;\n    return this;\n  }\n\n  setShadowBlur(blur) {\n    this.vexFlowCanvasContext.shadowBlur = blur;\n    return this;\n  }\n\n  setLineWidth(width) {\n    this.vexFlowCanvasContext.lineWidth = width;\n    return this;\n  }\n\n  setLineCap(cap_type) {\n    this.vexFlowCanvasContext.lineCap = cap_type;\n    return this;\n  }\n\n  // setLineDash: is the one native method in a canvas context\n  // that begins with set, therefore we don't bolster the method\n  // if it already exists (see renderer.bolsterCanvasContext).\n  // If it doesn't exist, we bolster it and assume it's looking for\n  // a ctx.lineDash method, as previous versions of VexFlow\n  // expected.\n  setLineDash(dash) {\n    this.vexFlowCanvasContext.lineDash = dash;\n    return this;\n  }\n\n  scale(x, y) {\n    return this.vexFlowCanvasContext.scale(parseFloat(x), parseFloat(y));\n  }\n\n  resize(width, height) {\n    [width, height] = this.SanitizeCanvasDims(parseInt(width, 10), parseInt(height, 10));\n    return this.vexFlowCanvasContext.resize(width, height);\n  }\n\n  rect(x, y, width, height) {\n    return this.vexFlowCanvasContext.rect(x, y, width, height);\n  }\n\n  fillRect(x, y, width, height) {\n    return this.vexFlowCanvasContext.fillRect(x, y, width, height);\n  }\n\n  clearRect(x, y, width, height) {\n    return this.vexFlowCanvasContext.clearRect(x, y, width, height);\n  }\n\n  beginPath() {\n    return this.vexFlowCanvasContext.beginPath();\n  }\n\n  moveTo(x, y) {\n    return this.vexFlowCanvasContext.moveTo(x, y);\n  }\n\n  lineTo(x, y) {\n    return this.vexFlowCanvasContext.lineTo(x, y);\n  }\n\n  bezierCurveTo(x1, y1, x2, y2, x, y) {\n    return this.vexFlowCanvasContext.bezierCurveTo(x1, y1, x2, y2, x, y);\n  }\n\n  quadraticCurveTo(x1, y1, x, y) {\n    return this.vexFlowCanvasContext.quadraticCurveTo(x1, y1, x, y);\n  }\n\n  // This is an attempt (hack) to simulate the HTML5 canvas\n  // arc method.\n  arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n    return this.vexFlowCanvasContext.arc(x, y, radius, startAngle, endAngle, antiClockwise);\n  }\n\n  // Adapted from the source for Raphael's Element.glow\n  glow() {\n    return this.vexFlowCanvasContext.glow();\n  }\n\n  fill() {\n    return this.vexFlowCanvasContext.fill();\n  }\n\n  stroke() {\n    return this.vexFlowCanvasContext.stroke();\n  }\n\n  closePath() {\n    return this.vexFlowCanvasContext.closePath();\n  }\n\n  measureText(text) {\n    return this.vexFlowCanvasContext.measureText(text);\n  }\n\n  fillText(text, x, y) {\n    return this.vexFlowCanvasContext.fillText(text, x, y);\n  }\n\n  save() {\n    return this.vexFlowCanvasContext.save();\n  }\n\n  restore() {\n    return this.vexFlowCanvasContext.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A rendering context for the Raphael backend.\n//\n// ## Warning: Deprecated for SVGContext\n// Except in instances where SVG support for IE < 9.0 is\n// needed, SVGContext is recommended.\n\nexport class RaphaelContext {\n  constructor(element) {\n    this.element = element;\n    this.paper = Raphael(element); // eslint-disable-line\n    this.path = '';\n    this.pen = { x: 0, y: 0 };\n    this.lineWidth = 1.0;\n    this.state = {\n      scale: { x: 1, y: 1 },\n      font_family: 'Arial',\n      font_size: 8,\n      font_weight: 800,\n    };\n\n    this.attributes = {\n      'stroke-width': 0.3,\n      'fill': 'black',\n      'stroke': 'black',\n      'font': '10pt Arial',\n    };\n\n    this.background_attributes = {\n      'stroke-width': 0,\n      'fill': 'white',\n      'stroke': 'white',\n      'font': '10pt Arial',\n    };\n\n    this.shadow_attributes = {\n      width: 0,\n      color: 'black',\n    };\n\n    this.state_stack = [];\n  }\n\n  // Containers not implemented\n  openGroup() {}\n  closeGroup() {}\n  add() {}\n\n  setFont(family, size, weight) {\n    this.state.font_family = family;\n    this.state.font_size = size;\n    this.state.font_weight = weight;\n    this.attributes.font = (this.state.font_weight || '') + ' ' +\n      (this.state.font_size * this.state.scale.x) + 'pt ' +\n      this.state.font_family;\n    return this;\n  }\n\n  setRawFont(font) {\n    this.attributes.font = font;\n    return this;\n  }\n\n  setFillStyle(style) {\n    this.attributes.fill = style;\n    return this;\n  }\n\n  setBackgroundFillStyle(style) {\n    this.background_attributes.fill = style;\n    this.background_attributes.stroke = style;\n    return this;\n  }\n\n  setStrokeStyle(style) {\n    this.attributes.stroke = style;\n    return this;\n  }\n\n  setShadowColor(style) {\n    this.shadow_attributes.color = style;\n    return this;\n  }\n\n  setShadowBlur(blur) {\n    this.shadow_attributes.width = blur;\n    return this;\n  }\n\n  setLineWidth(width) {\n    this.attributes['stroke-width'] = width;\n    this.lineWidth = width;\n  }\n\n  // Empty because there is no equivalent in SVG\n  setLineDash() { return this; }\n  setLineCap() { return this; }\n\n  scale(x, y) {\n    this.state.scale = { x, y };\n    // The scale() method is deprecated as of Raphael.JS 2.0, and\n    // can no longer be used as an option in an Element.attr() call.\n    // It is preserved here for users running earlier versions of\n    // Raphael.JS, though it has no effect on the SVG output in\n    // Raphael 2 and higher.\n    this.attributes.transform = 'S' + x + ',' + y + ',0,0';\n    this.attributes.scale = x + ',' + y + ',0,0';\n    this.attributes.font = this.state.font_size * this.state.scale.x + 'pt ' +\n      this.state.font_family;\n    this.background_attributes.transform = 'S' + x + ',' + y + ',0,0';\n    this.background_attributes.font = this.state.font_size *\n      this.state.scale.x + 'pt ' +\n      this.state.font_family;\n    return this;\n  }\n\n  clear() { this.paper.clear(); }\n\n  resize(width, height) {\n    this.element.style.width = width;\n    this.paper.setSize(width, height);\n    return this;\n  }\n\n  // Sets the SVG `viewBox` property, which results in auto scaling images when its container\n  // is resized.\n  //\n  // Usage: `ctx.setViewBox(\"0 0 600 400\")`\n  setViewBox(viewBox) {\n    this.paper.canvas.setAttribute('viewBox', viewBox);\n  }\n\n  rect(x, y, width, height) {\n    if (height < 0) {\n      y += height;\n      height = -height;\n    }\n\n    this.paper.rect(x, y, width - 0.5, height - 0.5)\n      .attr(this.attributes)\n      .attr('fill', 'none')\n      .attr('stroke-width', this.lineWidth);\n    return this;\n  }\n\n  fillRect(x, y, width, height) {\n    if (height < 0) {\n      y += height;\n      height = -height;\n    }\n\n    this.paper.rect(x, y, width - 0.5, height - 0.5).attr(this.attributes);\n    return this;\n  }\n\n  clearRect(x, y, width, height) {\n    if (height < 0) {\n      y += height;\n      height = -height;\n    }\n\n    this.paper.rect(x, y, width - 0.5, height - 0.5)\n      .attr(this.background_attributes);\n    return this;\n  }\n\n  beginPath() {\n    this.path = '';\n    this.pen.x = 0;\n    this.pen.y = 0;\n    return this;\n  }\n\n  moveTo(x, y) {\n    this.path += 'M' + x + ',' + y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  lineTo(x, y) {\n    this.path += 'L' + x + ',' + y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  bezierCurveTo(x1, y1, x2, y2, x, y) {\n    this.path += 'C' +\n      x1 + ',' +\n      y1 + ',' +\n      x2 + ',' +\n      y2 + ',' +\n      x + ',' +\n      y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  quadraticCurveTo(x1, y1, x, y) {\n    this.path += 'Q' +\n      x1 + ',' +\n      y1 + ',' +\n      x + ',' +\n      y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  // This is an attempt (hack) to simulate the HTML5 canvas\n  // arc method.\n  arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n    function normalizeAngle(angle) {\n      while (angle < 0) {\n        angle += Math.PI * 2;\n      }\n\n      while (angle > Math.PI * 2) {\n        angle -= Math.PI * 2;\n      }\n      return angle;\n    }\n\n    startAngle = normalizeAngle(startAngle);\n    endAngle = normalizeAngle(endAngle);\n\n    if (startAngle > endAngle) {\n      const tmp = startAngle;\n      startAngle = endAngle;\n      endAngle = tmp;\n      antiClockwise = !antiClockwise;\n    }\n\n    const delta = endAngle - startAngle;\n\n    if (delta > Math.PI) {\n      this.arcHelper(x, y, radius, startAngle, startAngle + delta / 2, antiClockwise);\n      this.arcHelper(x, y, radius, startAngle + delta / 2, endAngle, antiClockwise);\n    } else {\n      this.arcHelper(x, y, radius, startAngle, endAngle, antiClockwise);\n    }\n    return this;\n  }\n\n  arcHelper(x, y, radius, startAngle, endAngle, antiClockwise) {\n    const x1 = x + radius * Math.cos(startAngle);\n    const y1 = y + radius * Math.sin(startAngle);\n\n    const x2 = x + radius * Math.cos(endAngle);\n    const y2 = y + radius * Math.sin(endAngle);\n\n    let largeArcFlag = 0;\n    let sweepFlag = 0;\n    if (antiClockwise) {\n      sweepFlag = 1;\n      if (endAngle - startAngle < Math.PI) {\n        largeArcFlag = 1;\n      }\n    } else if (endAngle - startAngle > Math.PI) {\n      largeArcFlag = 1;\n    }\n\n    this.path += 'M' + x1 + ',' + y1 + ',A' +\n      radius + ',' + radius + ',0,' + largeArcFlag + ',' + sweepFlag + ',' +\n      x2 + ',' + y2 + 'M' + this.pen.x + ',' + this.pen.y;\n  }\n\n  // Adapted from the source for Raphael's Element.glow\n  glow() {\n    const out = this.paper.set();\n    if (this.shadow_attributes.width > 0) {\n      const sa = this.shadow_attributes;\n      const num_paths = sa.width / 2;\n      for (let i = 1; i <= num_paths; i++) {\n        out.push(this.paper.path(this.path).attr({\n          stroke: sa.color,\n          'stroke-linejoin': 'round',\n          'stroke-linecap': 'round',\n          'stroke-width': +(sa.width / num_paths * i).toFixed(3),\n          opacity: +((sa.opacity || 0.3) / num_paths).toFixed(3),\n          // See note in this.scale(): In Raphael the scale() method\n          // is deprecated and removed as of Raphael 2.0 and replaced\n          // by the transform() method.  It is preserved here for\n          // users with earlier versions of Raphael, but has no effect\n          // on the output SVG in Raphael 2.0+.\n          transform: this.attributes.transform,\n          scale: this.attributes.scale,\n        }));\n      }\n    }\n    return out;\n  }\n\n  fill() {\n    const elem = this.paper.path(this.path)\n      .attr(this.attributes)\n      .attr('stroke-width', 0);\n    this.glow(elem);\n    return this;\n  }\n\n  stroke() {\n    // The first line of code below is, unfortunately, a bit of a hack:\n    // Raphael's transform() scaling does not scale the stroke-width, so\n    // in order to scale a stroke, we have to manually scale the\n    // stroke-width.\n    //\n    // This works well so long as the X & Y states for this.scale() are\n    // relatively similar.  However, if they are very different, we\n    // would expect horizontal and vertical lines to have different\n    // stroke-widths.\n    //\n    // In the future, if we want to support very divergent values for\n    // horizontal and vertical scaling, we may want to consider\n    // implementing SVG scaling with properties of the SVG viewBox &\n    // viewPort and removing it entirely from the Element.attr() calls.\n    // This would more closely parallel the approach taken in\n    // canvascontext.js as well.\n\n    const strokeWidth = this.lineWidth * (this.state.scale.x + this.state.scale.y) / 2;\n    const elem = this.paper.path(this.path)\n      .attr(this.attributes)\n      .attr('fill', 'none')\n      .attr('stroke-width', strokeWidth);\n    this.glow(elem);\n    return this;\n  }\n\n  closePath() {\n    this.path += 'Z';\n    return this;\n  }\n\n  measureText(text) {\n    const txt = this.paper.text(0, 0, text)\n      .attr(this.attributes)\n      .attr('fill', 'none')\n      .attr('stroke', 'none');\n    const bounds = txt.getBBox();\n    txt.remove();\n\n    return {\n      width: bounds.width,\n      height: bounds.height,\n    };\n  }\n\n  fillText(text, x, y) {\n    this.paper\n      .text(\n        x + (this.measureText(text).width / 2),\n        y - (this.state.font_size / (2.25 * this.state.scale.y)),\n        text\n      )\n      .attr(this.attributes);\n\n    return this;\n  }\n\n  save() {\n    // TODO(mmuthanna): State needs to be deep-copied.\n    this.state_stack.push({\n      state: {\n        font_family: this.state.font_family,\n      },\n      attributes: {\n        font: this.attributes.font,\n        fill: this.attributes.fill,\n        stroke: this.attributes.stroke,\n        'stroke-width': this.attributes['stroke-width'],\n      },\n      shadow_attributes: {\n        width: this.shadow_attributes.width,\n        color: this.shadow_attributes.color,\n      },\n    });\n    return this;\n  }\n\n  restore() {\n    // TODO(0xfe): State needs to be deep-restored.\n    const state = this.state_stack.pop();\n    this.state.font_family = state.state.font_family;\n    this.attributes.font = state.attributes.font;\n    this.attributes.fill = state.attributes.fill;\n    this.attributes.stroke = state.attributes.stroke;\n    this.attributes['stroke-width'] = state.attributes['stroke-width'];\n    this.shadow_attributes.width = state.shadow_attributes.width;\n    this.shadow_attributes.color = state.shadow_attributes.color;\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Gregory Ristow (2015)\n\nimport { Vex } from './vex';\n\nconst attrNamesToIgnoreMap = {\n  path: {\n    x: true,\n    y: true,\n    width: true,\n    height: true,\n  },\n  rect: {\n  },\n  text: {\n    width: true,\n    height: true,\n  },\n};\n\n{\n  const fontAttrNamesToIgnore = {\n    'font-family': true,\n    'font-weight': true,\n    'font-style': true,\n    'font-size': true,\n  };\n\n  Vex.Merge(attrNamesToIgnoreMap.rect, fontAttrNamesToIgnore);\n  Vex.Merge(attrNamesToIgnoreMap.path, fontAttrNamesToIgnore);\n}\n\nexport class SVGContext {\n  constructor(element) {\n    // element is the parent DOM object\n    this.element = element;\n    // Create the SVG in the SVG namespace:\n    this.svgNS = 'http://www.w3.org/2000/svg';\n    const svg = this.create('svg');\n    // Add it to the canvas:\n    this.element.appendChild(svg);\n\n    // Point to it:\n    this.svg = svg;\n    this.groups = [this.svg]; // Create the group stack\n    this.parent = this.svg;\n\n    this.path = '';\n    this.pen = { x: NaN, y: NaN };\n    this.lineWidth = 1.0;\n    this.state = {\n      scale: { x: 1, y: 1 },\n      'font-family': 'Arial',\n      'font-size': '8pt',\n      'font-weight': 'normal',\n    };\n\n    this.attributes = {\n      'stroke-width': 0.3,\n      'fill': 'black',\n      'stroke': 'black',\n      'stroke-dasharray': 'none',\n      'font-family': 'Arial',\n      'font-size': '10pt',\n      'font-weight': 'normal',\n      'font-style': 'normal',\n    };\n\n    this.background_attributes = {\n      'stroke-width': 0,\n      'fill': 'white',\n      'stroke': 'white',\n      'stroke-dasharray': 'none',\n      'font-family': 'Arial',\n      'font-size': '10pt',\n      'font-weight': 'normal',\n      'font-style': 'normal',\n    };\n\n    this.shadow_attributes = {\n      width: 0,\n      color: 'black',\n    };\n\n    this.state_stack = [];\n\n    // Test for Internet Explorer\n    this.iePolyfill();\n  }\n\n  create(svgElementType) {\n    return document.createElementNS(this.svgNS, svgElementType);\n  }\n\n  // Allow grouping elements in containers for interactivity.\n  openGroup(cls, id, attrs) {\n    const group = this.create('g');\n    this.groups.push(group);\n    this.parent.appendChild(group);\n    this.parent = group;\n    if (cls) group.setAttribute('class', Vex.Prefix(cls));\n    if (id) group.setAttribute('id', Vex.Prefix(id));\n\n    if (attrs && attrs.pointerBBox) {\n      group.setAttribute('pointer-events', 'bounding-box');\n    }\n    return group;\n  }\n\n  closeGroup() {\n    this.groups.pop();\n    this.parent = this.groups[this.groups.length - 1];\n  }\n\n  add(elem) {\n    this.parent.appendChild(elem);\n  }\n\n  // Tests if the browser is Internet Explorer; if it is,\n  // we do some tricks to improve text layout.  See the\n  // note at ieMeasureTextFix() for details.\n  iePolyfill() {\n    if (typeof (navigator) !== 'undefined') {\n      this.ie = (\n        /MSIE 9/i.test(navigator.userAgent) ||\n        /MSIE 10/i.test(navigator.userAgent) ||\n        /rv:11\\.0/i.test(navigator.userAgent) ||\n        /Trident/i.test(navigator.userAgent)\n      );\n    }\n  }\n\n  // ### Styling & State Methods:\n\n  setFont(family, size, weight) {\n    // Unlike canvas, in SVG italic is handled by font-style,\n    // not weight. So: we search the weight argument and\n    // apply bold and italic to weight and style respectively.\n    let bold = false;\n    let italic = false;\n    let style = 'normal';\n    // Weight might also be a number (200, 400, etc...) so we\n    // test its type to be sure we have access to String methods.\n    if (typeof weight === 'string') {\n      // look for \"italic\" in the weight:\n      if (weight.indexOf('italic') !== -1) {\n        weight = weight.replace(/italic/g, '');\n        italic = true;\n      }\n      // look for \"bold\" in weight\n      if (weight.indexOf('bold') !== -1) {\n        weight = weight.replace(/bold/g, '');\n        bold = true;\n      }\n      // remove any remaining spaces\n      weight = weight.replace(/ /g, '');\n    }\n    weight = bold ? 'bold' : weight;\n    weight = (typeof weight === 'undefined' || weight === '') ? 'normal' : weight;\n\n    style = italic ? 'italic' : style;\n\n    const fontAttributes = {\n      'font-family': family,\n      'font-size': size + 'pt',\n      'font-weight': weight,\n      'font-style': style,\n    };\n\n    // Store the font size so that if the browser is Internet\n    // Explorer we can fix its calculations of text width.\n    this.fontSize = Number(size);\n\n    Vex.Merge(this.attributes, fontAttributes);\n    Vex.Merge(this.state, fontAttributes);\n\n    return this;\n  }\n\n  setRawFont(font) {\n    font = font.trim();\n    // Assumes size first, splits on space -- which is presently\n    // how all existing modules are calling this.\n    const fontArray = font.split(' ');\n\n    this.attributes['font-family'] = fontArray[1];\n    this.state['font-family'] = fontArray[1];\n\n    this.attributes['font-size'] = fontArray[0];\n    this.state['font-size'] = fontArray[0];\n\n    // Saves fontSize for IE polyfill\n    this.fontSize = Number(fontArray[0].match(/\\d+/));\n    return this;\n  }\n\n  setFillStyle(style) {\n    this.attributes.fill = style;\n    return this;\n  }\n\n  setBackgroundFillStyle(style) {\n    this.background_attributes.fill = style;\n    this.background_attributes.stroke = style;\n    return this;\n  }\n\n  setStrokeStyle(style) {\n    this.attributes.stroke = style;\n    return this;\n  }\n\n  setShadowColor(style) {\n    this.shadow_attributes.color = style;\n    return this;\n  }\n\n  setShadowBlur(blur) {\n    this.shadow_attributes.width = blur;\n    return this;\n  }\n\n  setLineWidth(width) {\n    this.attributes['stroke-width'] = width;\n    this.lineWidth = width;\n  }\n\n  // @param array {lineDash} as [dashInt, spaceInt, dashInt, spaceInt, etc...]\n  setLineDash(lineDash) {\n    if (Object.prototype.toString.call(lineDash) === '[object Array]') {\n      lineDash = lineDash.join(', ');\n      this.attributes['stroke-dasharray'] = lineDash;\n      return this;\n    } else {\n      throw new Vex.RERR('ArgumentError', 'lineDash must be an array of integers.');\n    }\n  }\n\n  setLineCap(lineCap) {\n    this.attributes['stroke-linecap'] = lineCap;\n    return this;\n  }\n\n  // ### Sizing & Scaling Methods:\n\n  // TODO (GCR): See note at scale() -- seperate our internal\n  // conception of pixel-based width/height from the style.width\n  // and style.height properties eventually to allow users to\n  // apply responsive sizing attributes to the SVG.\n  resize(width, height) {\n    this.width = width;\n    this.height = height;\n    this.element.style.width = width;\n    const attributes = {\n      width,\n      height,\n    };\n    this.applyAttributes(this.svg, attributes);\n    this.scale(this.state.scale.x, this.state.scale.y);\n    return this;\n  }\n\n  scale(x, y) {\n    // uses viewBox to scale\n    // TODO (GCR): we may at some point want to distinguish the\n    // style.width / style.height properties that are applied to\n    // the SVG object from our internal conception of the SVG\n    // width/height.  This would allow us to create automatically\n    // scaling SVG's that filled their containers, for instance.\n    //\n    // As this isn't implemented in Canvas or Raphael contexts,\n    // I've left as is for now, but in using the viewBox to\n    // handle internal scaling, am trying to make it possible\n    // for us to eventually move in that direction.\n\n    this.state.scale = { x, y };\n    const visibleWidth = this.width / x;\n    const visibleHeight = this.height / y;\n    this.setViewBox(0, 0, visibleWidth, visibleHeight);\n\n    return this;\n  }\n\n  setViewBox(...args) {\n    // Override for \"x y w h\" style:\n    if (args.length === 1) {\n      const [viewBox] = args;\n      this.svg.setAttribute('viewBox', viewBox);\n    } else {\n      const [xMin, yMin, width, height] = args;\n      const viewBoxString = xMin + ' ' + yMin + ' ' + width + ' ' + height;\n      this.svg.setAttribute('viewBox', viewBoxString);\n    }\n  }\n\n  // ### Drawing helper methods:\n\n  applyAttributes(element, attributes) {\n    const attrNamesToIgnore = attrNamesToIgnoreMap[element.nodeName];\n    Object\n      .keys(attributes)\n      .forEach(propertyName => {\n        if (attrNamesToIgnore && attrNamesToIgnore[propertyName]) {\n          return;\n        }\n        element.setAttributeNS(null, propertyName, attributes[propertyName]);\n      });\n\n    return element;\n  }\n\n  // ### Shape & Path Methods:\n\n  clear() {\n    // Clear the SVG by removing all inner children.\n\n    // (This approach is usually slightly more efficient\n    // than removing the old SVG & adding a new one to\n    // the container element, since it does not cause the\n    // container to resize twice.  Also, the resize\n    // triggered by removing the entire SVG can trigger\n    // a touchcancel event when the element resizes away\n    // from a touch point.)\n\n    while (this.svg.lastChild) {\n      this.svg.removeChild(this.svg.lastChild);\n    }\n\n    // Replace the viewbox attribute we just removed:\n    this.scale(this.state.scale.x, this.state.scale.y);\n  }\n\n  // ## Rectangles:\n\n  rect(x, y, width, height, attributes) {\n    // Avoid invalid negative height attribs by\n    // flipping the rectangle on its head:\n    if (height < 0) {\n      y += height;\n      height *= -1;\n    }\n\n    // Create the rect & style it:\n    const rectangle = this.create('rect');\n    if (typeof attributes === 'undefined') {\n      attributes = {\n        fill: 'none',\n        'stroke-width': this.lineWidth,\n        stroke: 'black',\n      };\n    }\n\n    Vex.Merge(attributes, {\n      x,\n      y,\n      width,\n      height,\n    });\n\n    this.applyAttributes(rectangle, attributes);\n\n    this.add(rectangle);\n    return this;\n  }\n\n  fillRect(x, y, width, height) {\n    if (height < 0) {\n      y += height;\n      height *= -1;\n    }\n\n    this.rect(x, y, width, height, this.attributes);\n    return this;\n  }\n\n  clearRect(x, y, width, height) {\n    // TODO(GCR): Improve implementation of this...\n    // Currently it draws a box of the background color, rather\n    // than creating alpha through lower z-levels.\n    //\n    // See the implementation of this in SVGKit:\n    // http://sourceforge.net/projects/svgkit/\n    // as a starting point.\n    //\n    // Adding a large number of transform paths (as we would\n    // have to do) could be a real performance hit.  Since\n    // tabNote seems to be the only module that makes use of this\n    // it may be worth creating a seperate tabStave that would\n    // draw lines around locations of tablature fingering.\n    //\n\n    this.rect(x, y, width, height, this.background_attributes);\n    return this;\n  }\n\n  // ## Paths:\n\n  beginPath() {\n    this.path = '';\n    this.pen.x = NaN;\n    this.pen.y = NaN;\n    return this;\n  }\n\n  moveTo(x, y) {\n    this.path += 'M' + x + ' ' + y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  lineTo(x, y) {\n    this.path += 'L' + x + ' ' + y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  bezierCurveTo(x1, y1, x2, y2, x, y) {\n    this.path += 'C' +\n      x1 + ' ' +\n      y1 + ',' +\n      x2 + ' ' +\n      y2 + ',' +\n      x + ' ' +\n      y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  quadraticCurveTo(x1, y1, x, y) {\n    this.path += 'Q' +\n      x1 + ' ' +\n      y1 + ',' +\n      x + ' ' +\n      y;\n    this.pen.x = x;\n    this.pen.y = y;\n    return this;\n  }\n\n  // This is an attempt (hack) to simulate the HTML5 canvas\n  // arc method.\n  arc(x, y, radius, startAngle, endAngle, antiClockwise) {\n    function normalizeAngle(angle) {\n      while (angle < 0) {\n        angle += Math.PI * 2;\n      }\n\n      while (angle > Math.PI * 2) {\n        angle -= Math.PI * 2;\n      }\n      return angle;\n    }\n\n    startAngle = normalizeAngle(startAngle);\n    endAngle = normalizeAngle(endAngle);\n\n    if (startAngle > endAngle) {\n      const tmp = startAngle;\n      startAngle = endAngle;\n      endAngle = tmp;\n      antiClockwise = !antiClockwise;\n    }\n\n    const delta = endAngle - startAngle;\n\n    if (delta > Math.PI) {\n      this.arcHelper(x, y, radius, startAngle, startAngle + delta / 2, antiClockwise);\n      this.arcHelper(x, y, radius, startAngle + delta / 2, endAngle, antiClockwise);\n    } else {\n      this.arcHelper(x, y, radius, startAngle, endAngle, antiClockwise);\n    }\n    return this;\n  }\n\n  arcHelper(x, y, radius, startAngle, endAngle, antiClockwise) {\n    const x1 = x + radius * Math.cos(startAngle);\n    const y1 = y + radius * Math.sin(startAngle);\n\n    const x2 = x + radius * Math.cos(endAngle);\n    const y2 = y + radius * Math.sin(endAngle);\n\n    let largeArcFlag = 0;\n    let sweepFlag = 0;\n    if (antiClockwise) {\n      sweepFlag = 1;\n      if (endAngle - startAngle < Math.PI) {\n        largeArcFlag = 1;\n      }\n    } else if (endAngle - startAngle > Math.PI) {\n      largeArcFlag = 1;\n    }\n\n    this.path += 'M' + x1 + ' ' + y1 + ' A' +\n      radius + ' ' + radius + ' 0 ' + largeArcFlag + ' ' + sweepFlag + ' ' +\n      x2 + ' ' + y2;\n    if (!isNaN(this.pen.x) && !isNaN(this.pen.y)) {\n      this.peth += 'M' + this.pen.x + ' ' + this.pen.y;\n    }\n  }\n\n  closePath() {\n    this.path += 'Z';\n\n    return this;\n  }\n\n  // Adapted from the source for Raphael's Element.glow\n  glow() {\n    // Calculate the width & paths of the glow:\n    if (this.shadow_attributes.width > 0) {\n      const sa = this.shadow_attributes;\n      const num_paths = sa.width / 2;\n      // Stroke at varying widths to create effect of gaussian blur:\n      for (let i = 1; i <= num_paths; i++) {\n        const attributes = {\n          stroke: sa.color,\n          'stroke-linejoin': 'round',\n          'stroke-linecap': 'round',\n          'stroke-width': +((sa.width * 0.4) / num_paths * i).toFixed(3),\n          opacity: +((sa.opacity || 0.3) / num_paths).toFixed(3),\n        };\n\n        const path = this.create('path');\n        attributes.d = this.path;\n        this.applyAttributes(path, attributes);\n        this.add(path);\n      }\n    }\n    return this;\n  }\n\n  fill(attributes) {\n    // If our current path is set to glow, make it glow\n    this.glow();\n\n    const path = this.create('path');\n    if (typeof attributes === 'undefined') {\n      attributes = {};\n      Vex.Merge(attributes, this.attributes);\n      attributes.stroke = 'none';\n    }\n\n    attributes.d = this.path;\n\n    this.applyAttributes(path, attributes);\n    this.add(path);\n    return this;\n  }\n\n  stroke() {\n    // If our current path is set to glow, make it glow.\n    this.glow();\n\n    const path = this.create('path');\n    const attributes = {};\n    Vex.Merge(attributes, this.attributes);\n    attributes.fill = 'none';\n    attributes['stroke-width'] = this.lineWidth;\n    attributes.d = this.path;\n\n    this.applyAttributes(path, attributes);\n    this.add(path);\n    return this;\n  }\n\n  // ## Text Methods:\n  measureText(text) {\n    const txt = this.create('text');\n    if (typeof (txt.getBBox) !== 'function') {\n      return { x: 0, y: 0, width: 0, height: 0 };\n    }\n\n    txt.textContent = text;\n    this.applyAttributes(txt, this.attributes);\n\n    // Temporarily add it to the document for measurement.\n    this.svg.appendChild(txt);\n\n    let bbox = txt.getBBox();\n    if (this.ie && text !== '' && this.attributes['font-style'] === 'italic') {\n      bbox = this.ieMeasureTextFix(bbox, text);\n    }\n\n    this.svg.removeChild(txt);\n    return bbox;\n  }\n\n  ieMeasureTextFix(bbox) {\n    // Internet Explorer over-pads text in italics,\n    // resulting in giant width estimates for measureText.\n    // To fix this, we use this formula, tested against\n    // ie 11:\n    // overestimate (in pixels) = FontSize(in pt) * 1.196 + 1.96\n    // And then subtract the overestimate from calculated width.\n\n    const fontSize = Number(this.fontSize);\n    const m = 1.196;\n    const b = 1.9598;\n    const widthCorrection = (m * fontSize) + b;\n    const width = bbox.width - widthCorrection;\n    const height = bbox.height - 1.5;\n\n    // Get non-protected copy:\n    const box = {\n      x: bbox.x,\n      y: bbox.y,\n      width,\n      height,\n    };\n\n    return box;\n  }\n\n  fillText(text, x, y) {\n    if (!text || text.length <= 0) {\n      return;\n    }\n    const attributes = {};\n    Vex.Merge(attributes, this.attributes);\n    attributes.stroke = 'none';\n    attributes.x = x;\n    attributes.y = y;\n\n    const txt = this.create('text');\n    txt.textContent = text;\n    this.applyAttributes(txt, attributes);\n    this.add(txt);\n  }\n\n  save() {\n    // TODO(mmuthanna): State needs to be deep-copied.\n    this.state_stack.push({\n      state: {\n        'font-family': this.state['font-family'],\n        'font-weight': this.state['font-weight'],\n        'font-style': this.state['font-style'],\n        'font-size': this.state['font-size'],\n        scale: this.state.scale,\n      },\n      attributes: {\n        'font-family': this.attributes['font-family'],\n        'font-weight': this.attributes['font-weight'],\n        'font-style': this.attributes['font-style'],\n        'font-size': this.attributes['font-size'],\n        fill: this.attributes.fill,\n        stroke: this.attributes.stroke,\n        'stroke-width': this.attributes['stroke-width'],\n        'stroke-dasharray': this.attributes['stroke-dasharray'],\n      },\n      shadow_attributes: {\n        width: this.shadow_attributes.width,\n        color: this.shadow_attributes.color,\n      },\n      lineWidth: this.lineWidth,\n    });\n    return this;\n  }\n\n  restore() {\n    // TODO(0xfe): State needs to be deep-restored.\n    const state = this.state_stack.pop();\n    this.state['font-family'] = state.state['font-family'];\n    this.state['font-weight'] = state.state['font-weight'];\n    this.state['font-style'] = state.state['font-style'];\n    this.state['font-size'] = state.state['font-size'];\n    this.state.scale = state.state.scale;\n\n    this.attributes['font-family'] = state.attributes['font-family'];\n    this.attributes['font-weight'] = state.attributes['font-weight'];\n    this.attributes['font-style'] = state.attributes['font-style'];\n    this.attributes['font-size'] = state.attributes['font-size'];\n\n    this.attributes.fill = state.attributes.fill;\n    this.attributes.stroke = state.attributes.stroke;\n    this.attributes['stroke-width'] = state.attributes['stroke-width'];\n    this.attributes['stroke-dasharray'] = state.attributes['stroke-dasharray'];\n\n    this.shadow_attributes.width = state.shadow_attributes.width;\n    this.shadow_attributes.color = state.shadow_attributes.color;\n\n    this.lineWidth = state.lineWidth;\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Support for different rendering contexts: Canvas, Raphael\n\nimport { CanvasContext } from './canvascontext';\nimport { RaphaelContext } from './raphaelcontext';\nimport { SVGContext } from './svgcontext';\nimport { Vex } from './vex';\n\nlet lastContext = null;\n\nexport class Renderer {\n  static get Backends() {\n    return {\n      CANVAS: 1,\n      RAPHAEL: 2,\n      SVG: 3,\n      VML: 4,\n    };\n  }\n\n  // End of line types\n  static get LineEndType() {\n    return {\n      NONE: 1, // No leg\n      UP: 2,   // Upward leg\n      DOWN: 3, // Downward leg\n    };\n  }\n\n  // Set this to true if you're using VexFlow inside a runtime\n  // that does not allow modifiying canvas objects. There is a small\n  // performance degradation due to the extra indirection.\n  static get USE_CANVAS_PROXY() {\n    return false;\n  }\n\n  static get lastContext() {\n    return lastContext;\n  }\n  static set lastContext(ctx) {\n    lastContext = ctx;\n  }\n\n  static buildContext(elementId, backend, width, height, background) {\n    const renderer = new Renderer(elementId, backend);\n    if (width && height) {\n      renderer.resize(width, height);\n    }\n\n    if (!background) background = '#FFF';\n    const ctx = renderer.getContext();\n    ctx.setBackgroundFillStyle(background);\n    Renderer.lastContext = ctx;\n    return ctx;\n  }\n\n  static getCanvasContext(elementId, width, height, background) {\n    return Renderer.buildContext(elementId, Renderer.Backends.CANVAS, width, height, background);\n  }\n\n  static getRaphaelContext(elementId, width, height, background) {\n    return Renderer.buildContext(elementId, Renderer.Backends.RAPHAEL, width, height, background);\n  }\n\n  static getSVGContext(elementId, width, height, background) {\n    return Renderer.buildContext(elementId, Renderer.Backends.SVG, width, height, background);\n  }\n\n  static bolsterCanvasContext(ctx) {\n    if (Renderer.USE_CANVAS_PROXY) {\n      return new CanvasContext(ctx);\n    }\n\n    const methodNames = [\n      'clear', 'setFont', 'setRawFont', 'setFillStyle', 'setBackgroundFillStyle',\n      'setStrokeStyle', 'setShadowColor', 'setShadowBlur', 'setLineWidth',\n      'setLineCap', 'setLineDash', 'openGroup', 'closeGroup', 'getGroup',\n    ];\n\n    ctx.vexFlowCanvasContext = ctx;\n\n    methodNames.forEach(methodName => {\n      ctx[methodName] = ctx[methodName] || CanvasContext.prototype[methodName];\n    });\n\n    return ctx;\n  }\n\n  // Draw a dashed line (horizontal, vertical or diagonal\n  // dashPattern = [3,3] draws a 3 pixel dash followed by a three pixel space.\n  // setting the second number to 0 draws a solid line.\n  static drawDashedLine(context, fromX, fromY, toX, toY, dashPattern) {\n    context.beginPath();\n\n    const dx = toX - fromX;\n    const dy = toY - fromY;\n    const angle = Math.atan2(dy, dx);\n    let x = fromX;\n    let y = fromY;\n    context.moveTo(fromX, fromY);\n    let idx = 0;\n    let draw = true;\n    while (!((dx < 0 ? x <= toX : x >= toX) && (dy < 0 ? y <= toY : y >= toY))) {\n      const dashLength = dashPattern[idx++ % dashPattern.length];\n      const nx = x + (Math.cos(angle) * dashLength);\n      x = dx < 0 ? Math.max(toX, nx) : Math.min(toX, nx);\n      const ny = y + (Math.sin(angle) * dashLength);\n      y = dy < 0 ? Math.max(toY, ny) : Math.min(toY, ny);\n      if (draw) {\n        context.lineTo(x, y);\n      } else {\n        context.moveTo(x, y);\n      }\n      draw = !draw;\n    }\n\n    context.closePath();\n    context.stroke();\n  }\n\n  constructor(elementId, backend) {\n    this.elementId = elementId;\n    if (!this.elementId) {\n      throw new Vex.RERR('BadArgument', 'Invalid id for renderer.');\n    }\n\n    this.element = document.getElementById(elementId);\n    if (!this.element) this.element = elementId;\n\n    // Verify backend and create context\n    this.ctx = null;\n    this.paper = null;\n    this.backend = backend;\n    if (this.backend === Renderer.Backends.CANVAS) {\n      // Create context.\n      if (!this.element.getContext) {\n        throw new Vex.RERR('BadElement', `Can't get canvas context from element: ${elementId}`);\n      }\n      this.ctx = Renderer.bolsterCanvasContext(this.element.getContext('2d'));\n    } else if (this.backend === Renderer.Backends.RAPHAEL) {\n      this.ctx = new RaphaelContext(this.element);\n    } else if (this.backend === Renderer.Backends.SVG) {\n      this.ctx = new SVGContext(this.element);\n    } else {\n      throw new Vex.RERR('InvalidBackend', `No support for backend: ${this.backend}`);\n    }\n  }\n\n  resize(width, height) {\n    if (this.backend === Renderer.Backends.CANVAS) {\n      if (!this.element.getContext) {\n        throw new Vex.RERR(\n          'BadElement', `Can't get canvas context from element: ${this.elementId}`\n        );\n      }\n      [width, height] = CanvasContext.SanitizeCanvasDims(width, height);\n\n      const devicePixelRatio = window.devicePixelRatio || 1;\n\n      this.element.width = width * devicePixelRatio;\n      this.element.height = height * devicePixelRatio;\n      this.element.style.width = width + 'px';\n      this.element.style.height = height + 'px';\n\n      this.ctx = Renderer.bolsterCanvasContext(this.element.getContext('2d'));\n      this.ctx.scale(devicePixelRatio, devicePixelRatio);\n    } else {\n      this.ctx.resize(width, height);\n    }\n\n    return this;\n  }\n\n  getContext() { return this.ctx; }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `Stem` object. Generally this object is handled\n// by its parent `StemmableNote`.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\n\n// To enable logging for this class. Set `Vex.Flow.Stem.DEBUG` to `true`.\nfunction L(...args) { if (Stem.DEBUG) Vex.L('Vex.Flow.Stem', args); }\n\nexport class Stem extends Element {\n  static get CATEGORY() { return 'stem'; }\n\n  // Stem directions\n  static get UP() {\n    return 1;\n  }\n  static get DOWN() {\n    return -1;\n  }\n\n  // Theme\n  static get WIDTH() {\n    return Flow.STEM_WIDTH;\n  }\n  static get HEIGHT() {\n    return Flow.STEM_HEIGHT;\n  }\n\n  constructor(options = {}) {\n    super();\n    this.setAttribute('type', 'Stem');\n\n    // Default notehead x bounds\n    this.x_begin = options.x_begin || 0;\n    this.x_end = options.x_end || 0;\n\n    // Y bounds for top/bottom most notehead\n    this.y_top = options.y_top || 0;\n    this.y_bottom = options.y_bottom || 0;\n\n    // Stem top extension\n    this.stem_extension = options.stem_extension || 0;\n\n    // Direction of the stem\n    this.stem_direction = options.stem_direction || 0;\n\n    // Flag to override all draw calls\n    this.hide = options.hide || false;\n\n    this.isStemlet = options.isStemlet || false;\n    this.stemletHeight = options.stemletHeight || 0;\n\n    // Use to adjust the rendered height without affecting\n    // the results of `.getExtents()`\n    this.renderHeightAdjustment = 0;\n    this.setOptions(options);\n  }\n\n  setOptions(options) {\n    // Changing where the stem meets the head\n    this.stem_up_y_offset = options.stem_up_y_offset || 0;\n    this.stem_down_y_offset = options.stem_down_y_offset || 0;\n  }\n\n  // Set the x bounds for the default notehead\n  setNoteHeadXBounds(x_begin, x_end) {\n    this.x_begin = x_begin;\n    this.x_end = x_end;\n    return this;\n  }\n\n  // Set the direction of the stem in relation to the noteheads\n  setDirection(direction) { this.stem_direction = direction; }\n\n  // Set the extension for the stem, generally for flags or beams\n  setExtension(ext) { this.stem_extension = ext; }\n  getExtension() { return this.stem_extension; }\n\n  // The the y bounds for the top and bottom noteheads\n  setYBounds(y_top, y_bottom) {\n    this.y_top = y_top;\n    this.y_bottom = y_bottom;\n  }\n\n  // The category of the object\n  getCategory() { return Stem.CATEGORY; }\n\n  // Gets the entire height for the stem\n  getHeight() {\n    const y_offset = (this.stem_direction === Stem.UP) ? this.stem_up_y_offset : this.stem_down_y_offset; // eslint-disable-line max-len\n    return ((this.y_bottom - this.y_top) * this.stem_direction) +\n           ((Stem.HEIGHT - y_offset + this.stem_extension) * this.stem_direction);\n  }\n  getBoundingBox() {\n    throw new Vex.RERR('NotImplemented', 'getBoundingBox() not implemented.');\n  }\n\n  // Get the y coordinates for the very base of the stem to the top of\n  // the extension\n  getExtents() {\n    const isStemUp = this.stem_direction === Stem.UP;\n    const ys = [this.y_top, this.y_bottom];\n    const stemHeight = Stem.HEIGHT + this.stem_extension;\n\n    const innerMostNoteheadY = (isStemUp ? Math.min : Math.max)(...ys);\n    const outerMostNoteheadY = (isStemUp ? Math.max : Math.min)(...ys);\n    const stemTipY = innerMostNoteheadY + (stemHeight * -this.stem_direction);\n\n    return { topY: stemTipY, baseY: outerMostNoteheadY };\n  }\n\n  setVisibility(isVisible) {\n    this.hide = !isVisible;\n    return this;\n  }\n\n  setStemlet(isStemlet, stemletHeight) {\n    this.isStemlet = isStemlet;\n    this.stemletHeight = stemletHeight;\n    return this;\n  }\n\n  // Render the stem onto the canvas\n  draw() {\n    this.setRendered();\n    if (this.hide) return;\n    const ctx = this.checkContext();\n\n    let stem_x;\n    let stem_y;\n    const stem_direction = this.stem_direction;\n\n    if (stem_direction === Stem.DOWN) {\n      // Down stems are rendered to the left of the head.\n      stem_x = this.x_begin;\n      stem_y = this.y_top + this.stem_down_y_offset;\n    } else {\n      // Up stems are rendered to the right of the head.\n      stem_x = this.x_end;\n      stem_y = this.y_bottom - this.stem_up_y_offset;\n    }\n\n    const stemHeight = this.getHeight();\n\n    L('Rendering stem - ', 'Top Y: ', this.y_top, 'Bottom Y: ', this.y_bottom);\n\n    // The offset from the stem's base which is required fo satisfy the stemlet height\n    const stemletYOffset = this.isStemlet\n      ? stemHeight - this.stemletHeight * this.stem_direction\n      : 0;\n\n    // Draw the stem\n    ctx.save();\n    this.applyStyle(ctx);\n    ctx.beginPath();\n    ctx.setLineWidth(Stem.WIDTH);\n    ctx.moveTo(stem_x, stem_y - stemletYOffset);\n    ctx.lineTo(stem_x, stem_y - stemHeight - (this.renderHeightAdjustment * stem_direction));\n    ctx.stroke();\n    this.restoreStyle(ctx);\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\n/**\n * ## Description\n *\n * Create a new tuplet from the specified notes. The notes must\n * be part of the same voice. If they are of different rhythmic\n * values, then options.num_notes must be set.\n *\n * @constructor\n * @param {Array.<Vex.Flow.StaveNote>} A set of notes: staveNotes,\n *   notes, etc... any class that inherits stemmableNote at some\n *   point in its prototype chain.\n * @param options: object {\n *\n *   num_notes: fit this many notes into...\n *   notes_occupied: ...the space of this many notes\n *\n *       Together, these two properties make up the tuplet ratio\n *     in the form of num_notes : notes_occupied.\n *       num_notes defaults to the number of notes passed in, so\n *     it is important that if you omit this property, all of\n *     the notes passed should be of the same note value.\n *       notes_occupied defaults to 2 -- so you should almost\n *     certainly pass this parameter for anything other than\n *     a basic triplet.\n *\n *   location:\n *     default 1, which is above the notes: ┌─── 3 ───┐\n *      -1 is below the notes └─── 3 ───┘\n *\n *   bracketed: boolean, draw a bracket around the tuplet number\n *     when true: ┌─── 3 ───┐   when false: 3\n *     defaults to true if notes are not beamed, false otherwise\n *\n *   ratioed: boolean\n *     when true: ┌─── 7:8 ───┐, when false: ┌─── 7 ───┐\n *     defaults to true if the difference between num_notes and\n *     notes_occupied is greater than 1.\n *\n *   y_offset: int, default 0\n *     manually offset a tuplet, for instance to avoid collisions\n *     with articulations, etc...\n * }\n */\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Formatter } from './formatter';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\n\nexport class Tuplet extends Element {\n  static get LOCATION_TOP() {\n    return 1;\n  }\n  static get LOCATION_BOTTOM() {\n    return -1;\n  }\n  static get NESTING_OFFSET() {\n    return 15;\n  }\n\n  constructor(notes, options) {\n    super();\n    this.setAttribute('type', 'Tuplet');\n    if (!notes || !notes.length) {\n      throw new Vex.RuntimeError('BadArguments', 'No notes provided for tuplet.');\n    }\n\n    this.options = Vex.Merge({}, options);\n    this.notes = notes;\n    this.num_notes = 'num_notes' in this.options ?\n      this.options.num_notes : notes.length;\n\n    // We accept beats_occupied, but warn that it's deprecated:\n    // the preferred property name is now notes_occupied.\n    if (this.options.beats_occupied) {\n      this.beatsOccupiedDeprecationWarning();\n    }\n    this.notes_occupied = this.options.notes_occupied ||\n      this.options.beats_occupied ||\n      2;\n    if ('bracketed' in this.options) {\n      this.bracketed = this.options.bracketed;\n    } else {\n      this.bracketed =\n        notes.some(note => note.beam === null);\n    }\n\n    this.ratioed = 'ratioed' in this.options ?\n      this.options.ratioed :\n      (Math.abs(this.notes_occupied - this.num_notes) > 1);\n    this.point = 28;\n    this.y_pos = 16;\n    this.x_pos = 100;\n    this.width = 200;\n    this.location = this.options.location || Tuplet.LOCATION_TOP;\n\n    Formatter.AlignRestsToNotes(notes, true, true);\n    this.resolveGlyphs();\n    this.attach();\n  }\n\n  attach() {\n    for (let i = 0; i < this.notes.length; i++) {\n      const note = this.notes[i];\n      note.setTuplet(this);\n    }\n  }\n\n  detach() {\n    for (let i = 0; i < this.notes.length; i++) {\n      const note = this.notes[i];\n      note.resetTuplet(this);\n    }\n  }\n\n  /**\n   * Set whether or not the bracket is drawn.\n   */\n  setBracketed(bracketed) {\n    this.bracketed = !!bracketed;\n    return this;\n  }\n\n  /**\n   * Set whether or not the ratio is shown.\n   */\n  setRatioed(ratioed) {\n    this.ratioed = !!ratioed;\n    return this;\n  }\n\n  /**\n   * Set the tuplet to be displayed either on the top or bottom of the stave\n   */\n  setTupletLocation(location) {\n    if (!location) {\n      location = Tuplet.LOCATION_TOP;\n    } else if (location !== Tuplet.LOCATION_TOP && location !== Tuplet.LOCATION_BOTTOM) {\n      throw new Vex.RERR('BadArgument', 'Invalid tuplet location: ' + location);\n    }\n\n    this.location = location;\n    return this;\n  }\n\n  getNotes() {\n    return this.notes;\n  }\n\n  getNoteCount() {\n    return this.num_notes;\n  }\n\n  beatsOccupiedDeprecationWarning() {\n    const msg = [\n      'beats_occupied has been deprecated as an ',\n      'option for tuplets. Please use notes_occupied ',\n      'instead. Calls to getBeatsOccupied and ',\n      'setBeatsOccupied should now be routed to ',\n      'getNotesOccupied and setNotesOccupied instead',\n    ].join('');\n\n    if (console && console.warn) { // eslint-disable-line no-console\n      console.warn(msg); // eslint-disable-line no-console\n    } else if (console) {\n      console.log(msg); // eslint-disable-line no-console\n    }\n  }\n\n  getBeatsOccupied() {\n    this.beatsOccupiedDeprecationWarning();\n    return this.getNotesOccupied();\n  }\n\n  setBeatsOccupied(beats) {\n    this.beatsOccupiedDeprecationWarning();\n    return this.setNotesOccupied(beats);\n  }\n\n  getNotesOccupied() {\n    return this.notes_occupied;\n  }\n\n  setNotesOccupied(notes) {\n    this.detach();\n    this.notes_occupied = notes;\n    this.resolveGlyphs();\n    this.attach();\n  }\n\n  resolveGlyphs() {\n    this.numerator_glyphs = [];\n    let n = this.num_notes;\n    while (n >= 1) {\n      this.numerator_glyphs.unshift(new Glyph('v' + (n % 10), this.point));\n      n = parseInt(n / 10, 10);\n    }\n\n    this.denom_glyphs = [];\n    n = this.notes_occupied;\n    while (n >= 1) {\n      this.denom_glyphs.unshift(new Glyph('v' + (n % 10), this.point));\n      n = parseInt(n / 10, 10);\n    }\n  }\n\n  // determine how many tuplets are nested within this tuplet\n  // on the same side (above/below), to calculate a y\n  // offset for this tuplet:\n  getNestedTupletCount() {\n    const location = this.location;\n    const first_note = this.notes[0];\n    let maxTupletCount = countTuplets(first_note, location);\n    let minTupletCount = countTuplets(first_note, location);\n\n    // Count the tuplets that are on the same side (above/below)\n    // as this tuplet:\n    function countTuplets(note, location) {\n      return note.tupletStack.filter(tuplet => tuplet.location === location).length;\n    }\n\n    this.notes.forEach(note => {\n      const tupletCount = countTuplets(note, location);\n      maxTupletCount = tupletCount > maxTupletCount ? tupletCount : maxTupletCount;\n      minTupletCount = tupletCount < minTupletCount ? tupletCount : minTupletCount;\n    });\n\n    return maxTupletCount - minTupletCount;\n  }\n\n  // determine the y position of the tuplet:\n  getYPosition() {\n    // offset the tuplet for any nested tuplets between\n    // it and the notes:\n    const nested_tuplet_y_offset =\n      this.getNestedTupletCount() *\n      Tuplet.NESTING_OFFSET *\n      -this.location;\n\n    // offset the tuplet for any manual y_offset:\n    const y_offset = this.options.y_offset || 0;\n\n    // now iterate through the notes and find our highest\n    // or lowest locations, to form a base y_pos\n    const first_note = this.notes[0];\n    let y_pos;\n    if (this.location === Tuplet.LOCATION_TOP) {\n      y_pos = first_note.getStave().getYForLine(0) - 15;\n      // y_pos = first_note.getStemExtents().topY - 10;\n\n      for (let i = 0; i < this.notes.length; ++i) {\n        const top_y = this.notes[i].getStemDirection() === Stem.UP\n          ? this.notes[i].getStemExtents().topY - 10\n          : this.notes[i].getStemExtents().baseY - 20;\n\n        if (top_y < y_pos) {\n          y_pos = top_y;\n        }\n      }\n    } else {\n      y_pos = first_note.getStave().getYForLine(4) + 20;\n\n      for (let i = 0; i < this.notes.length; ++i) {\n        const bottom_y = this.notes[i].getStemDirection() === Stem.UP\n          ? this.notes[i].getStemExtents().baseY + 20\n          : this.notes[i].getStemExtents().topY + 10;\n        if (bottom_y > y_pos) {\n          y_pos = bottom_y;\n        }\n      }\n    }\n\n    return y_pos + nested_tuplet_y_offset + y_offset;\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    // determine x value of left bound of tuplet\n    const first_note = this.notes[0];\n    const last_note = this.notes[this.notes.length - 1];\n\n    if (!this.bracketed) {\n      this.x_pos = first_note.getStemX();\n      this.width = last_note.getStemX() - this.x_pos;\n    } else {\n      this.x_pos = first_note.getTieLeftX() - 5;\n      this.width = last_note.getTieRightX() - this.x_pos + 5;\n    }\n\n    // determine y value for tuplet\n    this.y_pos = this.getYPosition();\n\n    const addGlyphWidth = (width, glyph) => width + glyph.getMetrics().width;\n\n    // calculate total width of tuplet notation\n    let width = this.numerator_glyphs.reduce(addGlyphWidth, 0);\n    if (this.ratioed) {\n      width = this.denom_glyphs.reduce(addGlyphWidth, width);\n      width += this.point * 0.32;\n    }\n\n    const notation_center_x = this.x_pos + (this.width / 2);\n    const notation_start_x = notation_center_x - (width / 2);\n\n    // draw bracket if the tuplet is not beamed\n    if (this.bracketed) {\n      const line_width = this.width / 2 - width / 2 - 5;\n\n      // only draw the bracket if it has positive length\n      if (line_width > 0) {\n        this.context.fillRect(this.x_pos, this.y_pos, line_width, 1);\n        this.context.fillRect(\n          this.x_pos + this.width / 2 + width / 2 + 5,\n          this.y_pos,\n          line_width,\n          1\n        );\n        this.context.fillRect(\n          this.x_pos,\n          this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM),\n          1,\n          this.location * 10\n        );\n        this.context.fillRect(\n          this.x_pos + this.width,\n          this.y_pos + (this.location === Tuplet.LOCATION_BOTTOM),\n          1,\n          this.location * 10\n        );\n      }\n    }\n\n    // draw numerator glyphs\n    let x_offset = 0;\n    this.numerator_glyphs.forEach(glyph => {\n      glyph.render(this.context, notation_start_x + x_offset, this.y_pos + (this.point / 3) - 2);\n      x_offset += glyph.getMetrics().width;\n    });\n\n    // display colon and denominator if the ratio is to be shown\n    if (this.ratioed) {\n      const colon_x = notation_start_x + x_offset + this.point * 0.16;\n      const colon_radius = this.point * 0.06;\n      this.context.beginPath();\n      this.context.arc(colon_x, this.y_pos - this.point * 0.08, colon_radius, 0, Math.PI * 2, true);\n      this.context.closePath();\n      this.context.fill();\n      this.context.beginPath();\n      this.context.arc(colon_x, this.y_pos + this.point * 0.12, colon_radius, 0, Math.PI * 2, true);\n      this.context.closePath();\n      this.context.fill();\n      x_offset += this.point * 0.32;\n      this.denom_glyphs.forEach(glyph => {\n        glyph.render(this.context, notation_start_x + x_offset, this.y_pos + (this.point / 3) - 2);\n        x_offset += glyph.getMetrics().width;\n      });\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `Beams` that span over a set of `StemmableNotes`.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Tuplet } from './tuplet';\nimport { Stem } from './stem';\n\nfunction calculateStemDirection(notes) {\n  let lineSum = 0;\n  notes.forEach(note => {\n    if (note.keyProps) {\n      note.keyProps.forEach(keyProp => {\n        lineSum += (keyProp.line - 3);\n      });\n    }\n  });\n\n  if (lineSum >= 0) {\n    return Stem.DOWN;\n  }\n  return Stem.UP;\n}\n\nconst getStemSlope = (firstNote, lastNote) => {\n  const firstStemTipY = firstNote.getStemExtents().topY;\n  const firstStemX = firstNote.getStemX();\n  const lastStemTipY = lastNote.getStemExtents().topY;\n  const lastStemX = lastNote.getStemX();\n  return (lastStemTipY - firstStemTipY) / (lastStemX - firstStemX);\n};\n\nconst BEAM_LEFT = 'L';\nconst BEAM_RIGHT = 'R';\nconst BEAM_BOTH = 'B';\n\nexport class Beam extends Element {\n  // Gets the default beam groups for a provided time signature.\n  // Attempts to guess if the time signature is not found in table.\n  // Currently this is fairly naive.\n  static getDefaultBeamGroups(time_sig) {\n    if (!time_sig || time_sig === 'c') {\n      time_sig = '4/4';\n    }\n\n    const defaults = {\n      '1/2': ['1/2'],\n      '2/2': ['1/2'],\n      '3/2': ['1/2'],\n      '4/2': ['1/2'],\n\n      '1/4': ['1/4'],\n      '2/4': ['1/4'],\n      '3/4': ['1/4'],\n      '4/4': ['1/4'],\n\n      '1/8': ['1/8'],\n      '2/8': ['2/8'],\n      '3/8': ['3/8'],\n      '4/8': ['2/8'],\n\n      '1/16': ['1/16'],\n      '2/16': ['2/16'],\n      '3/16': ['3/16'],\n      '4/16': ['2/16'],\n    };\n\n    const groups = defaults[time_sig];\n\n    if (groups === undefined) {\n      // If no beam groups found, naively determine\n      // the beam groupings from the time signature\n      const beatTotal = parseInt(time_sig.split('/')[0], 10);\n      const beatValue = parseInt(time_sig.split('/')[1], 10);\n\n      const tripleMeter = beatTotal % 3 === 0;\n\n      if (tripleMeter) {\n        return [new Fraction(3, beatValue)];\n      } else if (beatValue > 4) {\n        return [new Fraction(2, beatValue)];\n      } else if (beatValue <= 4) {\n        return [new Fraction(1, beatValue)];\n      }\n    } else {\n      return groups.map(group => new Fraction().parse(group));\n    }\n\n    return [new Fraction(1, 4)];\n  }\n\n  // A helper function to automatically build basic beams for a voice. For more\n  // complex auto-beaming use `Beam.generateBeams()`.\n  //\n  // Parameters:\n  // * `voice` - The voice to generate the beams for\n  // * `stem_direction` - A stem direction to apply to the entire voice\n  // * `groups` - An array of `Fraction` representing beat groupings for the beam\n  static applyAndGetBeams(voice, stem_direction, groups) {\n    return Beam.generateBeams(voice.getTickables(), {\n      groups,\n      stem_direction,\n    });\n  }\n\n  // A helper function to autimatically build beams for a voice with\n  // configuration options.\n  //\n  // Example configuration object:\n  //\n  // ```\n  // config = {\n  //   groups: [new Vex.Flow.Fraction(2, 8)],\n  //   stem_direction: -1,\n  //   beam_rests: true,\n  //   beam_middle_only: true,\n  //   show_stemlets: false\n  // };\n  // ```\n  //\n  // Parameters:\n  // * `notes` - An array of notes to create the beams for\n  // * `config` - The configuration object\n  //    * `groups` - Array of `Fractions` that represent the beat structure to beam the notes\n  //    * `stem_direction` - Set to apply the same direction to all notes\n  //    * `beam_rests` - Set to `true` to include rests in the beams\n  //    * `beam_middle_only` - Set to `true` to only beam rests in the middle of the beat\n  //    * `show_stemlets` - Set to `true` to draw stemlets for rests\n  //    * `maintain_stem_directions` - Set to `true` to not apply new stem directions\n  //\n  static generateBeams(notes, config) {\n    if (!config) config = {};\n\n    if (!config.groups || !config.groups.length) {\n      config.groups = [new Fraction(2, 8)];\n    }\n\n    // Convert beam groups to tick amounts\n    const tickGroups = config.groups.map(group => {\n      if (!group.multiply) {\n        throw new Vex.RuntimeError('InvalidBeamGroups',\n          'The beam groups must be an array of Vex.Flow.Fractions');\n      }\n      return group.clone().multiply(Flow.RESOLUTION, 1);\n    });\n\n    const unprocessedNotes = notes;\n    let currentTickGroup = 0;\n    let noteGroups = [];\n    let currentGroup = [];\n\n    function getTotalTicks(vf_notes) {\n      return vf_notes.reduce((memo, note) => note.getTicks().clone().add(memo), new Fraction(0, 1));\n    }\n\n    function nextTickGroup() {\n      if (tickGroups.length - 1 > currentTickGroup) {\n        currentTickGroup += 1;\n      } else {\n        currentTickGroup = 0;\n      }\n    }\n\n    function createGroups() {\n      let nextGroup = [];\n\n      unprocessedNotes.forEach(unprocessedNote => {\n        nextGroup = [];\n        if (unprocessedNote.shouldIgnoreTicks()) {\n          noteGroups.push(currentGroup);\n          currentGroup = nextGroup;\n          return; // Ignore untickables (like bar notes)\n        }\n\n        currentGroup.push(unprocessedNote);\n        const ticksPerGroup = tickGroups[currentTickGroup].clone();\n        const totalTicks = getTotalTicks(currentGroup);\n\n        // Double the amount of ticks in a group, if it's an unbeamable tuplet\n        const unbeamable = Flow.durationToNumber(unprocessedNote.duration) < 8;\n        if (unbeamable && unprocessedNote.tuplet) {\n          ticksPerGroup.numerator *= 2;\n        }\n\n        // If the note that was just added overflows the group tick total\n        if (totalTicks.greaterThan(ticksPerGroup)) {\n          // If the overflow note can be beamed, start the next group\n          // with it. Unbeamable notes leave the group overflowed.\n          if (!unbeamable) {\n            nextGroup.push(currentGroup.pop());\n          }\n          noteGroups.push(currentGroup);\n          currentGroup = nextGroup;\n          nextTickGroup();\n        } else if (totalTicks.equals(ticksPerGroup)) {\n          noteGroups.push(currentGroup);\n          currentGroup = nextGroup;\n          nextTickGroup();\n        }\n      });\n\n      // Adds any remainder notes\n      if (currentGroup.length > 0) {\n        noteGroups.push(currentGroup);\n      }\n    }\n\n    function getBeamGroups() {\n      return noteGroups.filter(group => {\n        if (group.length > 1) {\n          let beamable = true;\n          group.forEach(note => {\n            if (note.getIntrinsicTicks() >= Flow.durationToTicks('4')) {\n              beamable = false;\n            }\n          });\n          return beamable;\n        }\n        return false;\n      });\n    }\n\n    // Splits up groups by Rest\n    function sanitizeGroups() {\n      const sanitizedGroups = [];\n      noteGroups.forEach(group => {\n        let tempGroup = [];\n        group.forEach((note, index, group) => {\n          const isFirstOrLast = index === 0 || index === group.length - 1;\n          const prevNote = group[index - 1];\n\n          const breaksOnEachRest = !config.beam_rests && note.isRest();\n          const breaksOnFirstOrLastRest = (config.beam_rests &&\n            config.beam_middle_only && note.isRest() && isFirstOrLast);\n\n          let breakOnStemChange = false;\n          if (config.maintain_stem_directions && prevNote &&\n            !note.isRest() && !prevNote.isRest()) {\n            const prevDirection = prevNote.getStemDirection();\n            const currentDirection = note.getStemDirection();\n            breakOnStemChange = currentDirection !== prevDirection;\n          }\n\n          const isUnbeamableDuration = parseInt(note.duration, 10) < 8;\n\n          // Determine if the group should be broken at this note\n          const shouldBreak = breaksOnEachRest || breaksOnFirstOrLastRest ||\n            breakOnStemChange || isUnbeamableDuration;\n\n          if (shouldBreak) {\n            // Add current group\n            if (tempGroup.length > 0) {\n              sanitizedGroups.push(tempGroup);\n            }\n\n            // Start a new group. Include the current note if the group\n            // was broken up by stem direction, as that note needs to start\n            // the next group of notes\n            tempGroup = breakOnStemChange ? [note] : [];\n          } else {\n            // Add note to group\n            tempGroup.push(note);\n          }\n        });\n\n        // If there is a remaining group, add it as well\n        if (tempGroup.length > 0) {\n          sanitizedGroups.push(tempGroup);\n        }\n      });\n\n      noteGroups = sanitizedGroups;\n    }\n\n    function formatStems() {\n      noteGroups.forEach(group => {\n        let stemDirection;\n        if (config.maintain_stem_directions) {\n          const note = findFirstNote(group);\n          stemDirection = note ? note.getStemDirection() : Stem.UP;\n        } else {\n          if (config.stem_direction) {\n            stemDirection = config.stem_direction;\n          } else {\n            stemDirection = calculateStemDirection(group);\n          }\n        }\n        applyStemDirection(group, stemDirection);\n      });\n    }\n\n    function findFirstNote(group) {\n      for (let i = 0; i < group.length; i++) {\n        const note = group[i];\n        if (!note.isRest()) {\n          return note;\n        }\n      }\n\n      return false;\n    }\n\n    function applyStemDirection(group, direction) {\n      group.forEach(note => {\n        note.setStemDirection(direction);\n      });\n    }\n\n    // Get all of the tuplets in all of the note groups\n    function getTuplets() {\n      const uniqueTuplets = [];\n\n      // Go through all of the note groups and inspect for tuplets\n      noteGroups.forEach(group => {\n        let tuplet = null;\n        group.forEach(note => {\n          if (note.tuplet && (tuplet !== note.tuplet)) {\n            tuplet = note.tuplet;\n            uniqueTuplets.push(tuplet);\n          }\n        });\n      });\n      return uniqueTuplets;\n    }\n\n\n    // Using closures to store the variables throughout the various functions\n    // IMO Keeps it this process lot cleaner - but not super consistent with\n    // the rest of the API's style - Silverwolf90 (Cyril)\n    createGroups();\n    sanitizeGroups();\n    formatStems();\n\n    // Get the notes to be beamed\n    const beamedNoteGroups = getBeamGroups();\n\n    // Get the tuplets in order to format them accurately\n    const allTuplets = getTuplets();\n\n    // Create a Vex.Flow.Beam from each group of notes to be beamed\n    const beams = [];\n    beamedNoteGroups.forEach(group => {\n      const beam = new Beam(group);\n\n      if (config.show_stemlets) {\n        beam.render_options.show_stemlets = true;\n      }\n      if (config.secondary_breaks) {\n        beam.render_options.secondary_break_ticks = Flow.durationToTicks(config.secondary_breaks);\n      }\n      if (config.flat_beams === true) {\n        beam.render_options.flat_beams = true;\n        beam.render_options.flat_beam_offset = config.flat_beam_offset;\n      }\n      beams.push(beam);\n    });\n\n    // Reformat tuplets\n    allTuplets.forEach(tuplet => {\n      // Set the tuplet location based on the stem direction\n      const direction = tuplet.notes[0].stem_direction === Stem.DOWN ?\n        Tuplet.LOCATION_BOTTOM : Tuplet.LOCATION_TOP;\n      tuplet.setTupletLocation(direction);\n\n      // If any of the notes in the tuplet are not beamed, draw a bracket.\n      let bracketed = false;\n      for (let i = 0; i < tuplet.notes.length; i++) {\n        const note = tuplet.notes[i];\n        if (note.beam === null) {\n          bracketed = true;\n          break;\n        }\n      }\n      tuplet.setBracketed(bracketed);\n    });\n\n    return beams;\n  }\n\n  constructor(notes, auto_stem) {\n    super();\n    this.setAttribute('type', 'Beam');\n\n    if (!notes || notes === []) {\n      throw new Vex.RuntimeError('BadArguments', 'No notes provided for beam.');\n    }\n\n    if (notes.length === 1) {\n      throw new Vex.RuntimeError('BadArguments', 'Too few notes for beam.');\n    }\n\n    // Validate beam line, direction and ticks.\n    this.ticks = notes[0].getIntrinsicTicks();\n\n    if (this.ticks >= Flow.durationToTicks('4')) {\n      throw new Vex.RuntimeError('BadArguments',\n        'Beams can only be applied to notes shorter than a quarter note.');\n    }\n\n    let i; // shared iterator\n    let note;\n\n    this.stem_direction = Stem.UP;\n\n    for (i = 0; i < notes.length; ++i) {\n      note = notes[i];\n      if (note.hasStem()) {\n        this.stem_direction = note.getStemDirection();\n        break;\n      }\n    }\n\n    let stem_direction = this.stem_direction;\n    // Figure out optimal stem direction based on given notes\n    if (auto_stem && notes[0].getCategory() === 'stavenotes') {\n      stem_direction = calculateStemDirection(notes);\n    } else if (auto_stem && notes[0].getCategory() === 'tabnotes') {\n      // Auto Stem TabNotes\n      const stem_weight = notes.reduce((memo, note) => memo + note.stem_direction, 0);\n\n      stem_direction = stem_weight > -1 ? Stem.UP : Stem.DOWN;\n    }\n\n    // Apply stem directions and attach beam to notes\n    for (i = 0; i < notes.length; ++i) {\n      note = notes[i];\n      if (auto_stem) {\n        note.setStemDirection(stem_direction);\n        this.stem_direction = stem_direction;\n      }\n      note.setBeam(this);\n    }\n\n    this.postFormatted = false;\n    this.notes = notes;\n    this.beam_count = this.getBeamCount();\n    this.break_on_indices = [];\n    this.render_options = {\n      beam_width: 5,\n      max_slope: 0.25,\n      min_slope: -0.25,\n      slope_iterations: 20,\n      slope_cost: 100,\n      show_stemlets: false,\n      stemlet_extension: 7,\n      partial_beam_length: 10,\n      flat_beams: false,\n      min_flat_beam_offset: 15,\n    };\n  }\n\n  // Get the notes in this beam\n  getNotes() { return this.notes; }\n\n  // Get the max number of beams in the set of notes\n  getBeamCount() {\n    const beamCounts = this.notes.map(note => note.getGlyph().beam_count);\n\n    const maxBeamCount = beamCounts.reduce((max, beamCount) => beamCount > max ? beamCount : max);\n\n    return maxBeamCount;\n  }\n\n  // Set which note `indices` to break the secondary beam at\n  breakSecondaryAt(indices) {\n    this.break_on_indices = indices;\n    return this;\n  }\n\n  // Return the y coordinate for linear function\n  getSlopeY(x, first_x_px, first_y_px, slope) {\n    return first_y_px + ((x - first_x_px) * slope);\n  }\n\n  // Calculate the best possible slope for the provided notes\n  calculateSlope() {\n    const {\n      notes,\n      stem_direction: stemDirection,\n      render_options: { max_slope, min_slope, slope_iterations, slope_cost },\n    } = this;\n\n    const firstNote = notes[0];\n    const initialSlope = getStemSlope(firstNote, notes[notes.length - 1]);\n    const increment = (max_slope - min_slope) / slope_iterations;\n    let minCost = Number.MAX_VALUE;\n    let bestSlope = 0;\n    let yShift = 0;\n\n    // iterate through slope values to find best weighted fit\n    for (let slope = min_slope; slope <= max_slope; slope += increment) {\n      let totalStemExtension = 0;\n      let yShiftTemp = 0;\n\n      // iterate through notes, calculating y shift and stem extension\n      for (let i = 1; i < notes.length; ++i) {\n        const note = notes[i];\n        const adjustedStemTipY = this.getSlopeY(\n          note.getStemX(),\n          firstNote.getStemX(),\n          firstNote.getStemExtents().topY,\n          slope\n        ) + yShiftTemp;\n\n        const stemTipY = note.getStemExtents().topY;\n        // beam needs to be shifted up to accommodate note\n        if (stemTipY * stemDirection < adjustedStemTipY * stemDirection) {\n          const diff = Math.abs(stemTipY - adjustedStemTipY);\n          yShiftTemp += diff * -stemDirection;\n          totalStemExtension += diff * i;\n        } else { // beam overshoots note, account for the difference\n          totalStemExtension += (stemTipY - adjustedStemTipY) * stemDirection;\n        }\n      }\n\n      // most engraving books suggest aiming for a slope about half the angle of the\n      // difference between the first and last notes' stem length;\n      const idealSlope = initialSlope / 2;\n      const distanceFromIdeal = Math.abs(idealSlope - slope);\n\n      // This tries to align most beams to something closer to the idealSlope, but\n      // doesn't go crazy. To disable, set this.render_options.slope_cost = 0\n      const cost = slope_cost * distanceFromIdeal + Math.abs(totalStemExtension);\n\n      // update state when a more ideal slope is found\n      if (cost < minCost) {\n        minCost = cost;\n        bestSlope = slope;\n        yShift = yShiftTemp;\n      }\n    }\n\n    this.slope = bestSlope;\n    this.y_shift = yShift;\n  }\n\n  // Calculate a slope and y-shift for flat beams\n  calculateFlatSlope() {\n    const {\n      notes, stem_direction,\n      render_options: { beam_width, min_flat_beam_offset, flat_beam_offset },\n    } = this;\n\n    // If a flat beam offset has not yet been supplied or calculated,\n    // generate one based on the notes in this particular note group\n    let total = 0;\n    let extremeY = 0;  // Store the highest or lowest note here\n    let extremeBeamCount = 0;  // The beam count of the extreme note\n    let currentExtreme = 0;\n    for (let i = 0; i < notes.length; i++) {\n      // Total up all of the offsets so we can average them out later\n      const note = notes[i];\n      const stemTipY = note.getStemExtents().topY;\n      total += stemTipY;\n\n      // Store the highest (stems-up) or lowest (stems-down) note so the\n      //  offset can be adjusted in case the average isn't enough\n      if (stem_direction === Stem.DOWN && currentExtreme < stemTipY) {\n        currentExtreme = stemTipY;\n        extremeY = Math.max(...note.getYs());\n        extremeBeamCount = note.getBeamCount();\n      } else if (\n        stem_direction === Stem.UP && (currentExtreme === 0 || currentExtreme > stemTipY)\n      ) {\n        currentExtreme = stemTipY;\n        extremeY = Math.min(...note.getYs());\n        extremeBeamCount = note.getBeamCount();\n      }\n    }\n\n    // Average the offsets to try and come up with a reasonable one that\n    //  works for all of the notes in the beam group.\n    let offset = total / notes.length;\n\n    // In case the average isn't long enough, add or subtract some more\n    //  based on the highest or lowest note (again, based on the stem\n    //  direction). This also takes into account the added height due to\n    //  the width of the beams.\n    const beamWidth = beam_width * 1.5;\n    const extremeTest = min_flat_beam_offset + (extremeBeamCount * beamWidth);\n    const newOffset = extremeY + (extremeTest * -stem_direction);\n    if (stem_direction === Stem.DOWN && offset < newOffset) {\n      offset = extremeY + extremeTest;\n    } else if (stem_direction === Stem.UP && offset > newOffset) {\n      offset = extremeY - extremeTest;\n    }\n\n    if (!flat_beam_offset) {\n      // Set the offset for the group based on the calculations above.\n      this.render_options.flat_beam_offset = offset;\n    } else if (stem_direction === Stem.DOWN && offset > flat_beam_offset) {\n      this.render_options.flat_beam_offset = offset;\n    } else if (stem_direction === Stem.UP && offset < flat_beam_offset) {\n      this.render_options.flat_beam_offset = offset;\n    }\n\n    // for flat beams, the slope and y_shift are simply 0\n    this.slope = 0;\n    this.y_shift = 0;\n  }\n\n  getBeamYToDraw() {\n    const firstNote = this.notes[0];\n    const firstStemTipY = firstNote.getStemExtents().topY;\n    let beamY = firstStemTipY;\n\n    // For flat beams, set the first and last Y to the offset, rather than\n    //  using the note's stem extents.\n    if (this.render_options.flat_beams && this.render_options.flat_beam_offset) {\n      beamY = this.render_options.flat_beam_offset;\n    }\n    return beamY;\n  }\n\n  // Create new stems for the notes in the beam, so that each stem\n  // extends into the beams.\n  applyStemExtensions() {\n    const {\n      notes, slope, y_shift, stem_direction, beam_count,\n      render_options: {\n        show_stemlets,\n        stemlet_extension,\n        beam_width,\n      },\n    } = this;\n\n    const firstNote = notes[0];\n    const firstStemTipY = this.getBeamYToDraw();\n    const firstStemX = firstNote.getStemX();\n\n    for (let i = 0; i < notes.length; ++i) {\n      const note = notes[i];\n      const stemX = note.getStemX();\n      const { topY: stemTipY } = note.getStemExtents();\n      const beamedStemTipY = this.getSlopeY(stemX, firstStemX, firstStemTipY, slope) + y_shift;\n      const preBeamExtension = note.getStem().getExtension();\n      const beamExtension = stem_direction === Stem.UP\n        ? stemTipY - beamedStemTipY\n        : beamedStemTipY - stemTipY;\n\n      note.stem.setExtension(preBeamExtension + beamExtension);\n      note.stem.renderHeightAdjustment = -Stem.WIDTH / 2;\n\n      if (note.isRest() && show_stemlets) {\n        const beamWidth = beam_width;\n        const totalBeamWidth = ((beam_count - 1) * beamWidth * 1.5) + beamWidth;\n        note.stem\n          .setVisibility(true)\n          .setStemlet(true, totalBeamWidth + stemlet_extension);\n      }\n    }\n  }\n\n  // return upper level beam direction.\n  lookupBeamDirection(duration, prev_tick, tick, next_tick) {\n    if (duration === '4') {\n      return BEAM_LEFT;\n    }\n\n    const lookup_duration =  `${Flow.durationToNumber(duration) / 2}`;\n    const prev_note_gets_beam = prev_tick < Flow.durationToTicks(lookup_duration);\n    const next_note_gets_beam = next_tick < Flow.durationToTicks(lookup_duration);\n    const note_gets_beam = tick < Flow.durationToTicks(lookup_duration);\n\n    if (prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n      return BEAM_BOTH;\n    } else if (prev_note_gets_beam && !next_note_gets_beam && note_gets_beam) {\n      return BEAM_LEFT;\n    } else if (!prev_note_gets_beam && next_note_gets_beam && note_gets_beam) {\n      return BEAM_RIGHT;\n    }\n\n    return this.lookupBeamDirection(lookup_duration, prev_tick, tick, next_tick);\n  }\n\n  // Get the x coordinates for the beam lines of specific `duration`\n  getBeamLines(duration) {\n    const tick_of_duration = Flow.durationToTicks(duration);\n    const beam_lines = [];\n    let beam_started = false;\n    let current_beam = null;\n    const partial_beam_length = this.render_options.partial_beam_length;\n    let previous_should_break = false;\n    let tick_tally = 0;\n    for (let i = 0; i < this.notes.length; ++i) {\n      const note = this.notes[i];\n\n      // See if we need to break secondary beams on this note.\n      const ticks = note.ticks.value();\n      tick_tally += ticks;\n      let should_break = false;\n\n      // 8th note beams are always drawn.\n      if (parseInt(duration, 10) >= 8) {\n        // First, check to see if any indices were set up through breakSecondaryAt()\n        should_break = this.break_on_indices.indexOf(i) !== -1;\n\n        // If the secondary breaks were auto-configured in the render options,\n        //  handle that as well.\n        if (this.render_options.secondary_break_ticks && tick_tally >=\n          this.render_options.secondary_break_ticks) {\n          tick_tally = 0;\n          should_break = true;\n        }\n      }\n      const note_gets_beam = note.getIntrinsicTicks() < tick_of_duration;\n\n      const stem_x = note.getStemX() - (Stem.WIDTH / 2);\n\n      // Check to see if the next note in the group will get a beam at this\n      //  level. This will help to inform the partial beam logic below.\n      const prev_note = this.notes[i - 1];\n      const next_note = this.notes[i + 1];\n      const next_note_gets_beam = next_note && next_note.getIntrinsicTicks() < tick_of_duration;\n      const prev_note_gets_beam = prev_note && prev_note.getIntrinsicTicks() < tick_of_duration;\n      const beam_alone = prev_note && next_note &&\n      note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n      // const beam_alone = note_gets_beam && !prev_note_gets_beam && !next_note_gets_beam;\n      if (note_gets_beam) {\n        // This note gets a beam at the current level\n        if (beam_started) {\n          // We're currently in the middle of a beam. Just continue it on to\n          //  the stem X of the current note.\n          current_beam = beam_lines[beam_lines.length - 1];\n          current_beam.end = stem_x;\n\n          // If a secondary beam break is set up, end the beam right now.\n          if (should_break) {\n            beam_started = false;\n            if (next_note && !next_note_gets_beam && current_beam.end === null) {\n              // This note gets a beam,.but the next one does not. This means\n              //  we need a partial pointing right.\n              current_beam.end = current_beam.start - partial_beam_length;\n            }\n          }\n        } else {\n          // No beam started yet. Start a new one.\n          current_beam = { start: stem_x, end: null };\n          beam_started = true;\n\n          if (beam_alone) {\n            // previous and next beam exists and does not get a beam but current gets it.\n            const prev_tick = prev_note.getIntrinsicTicks();\n            const next_tick = next_note.getIntrinsicTicks();\n            const tick = note.getIntrinsicTicks();\n            const beam_direction = this.lookupBeamDirection(duration, prev_tick, tick, next_tick);\n\n            if ([BEAM_LEFT, BEAM_BOTH].includes(beam_direction)) {\n              current_beam.end = current_beam.start - partial_beam_length;\n            } else {\n              current_beam.end = current_beam.start + partial_beam_length;\n            }\n          } else if (!next_note_gets_beam) {\n            // The next note doesn't get a beam. Draw a partial.\n            if ((previous_should_break || i === 0) && next_note) {\n              // This is the first note (but not the last one), or it is\n              //  following a secondary break. Draw a partial to the right.\n              current_beam.end = current_beam.start + partial_beam_length;\n            } else {\n              // By default, draw a partial to the left.\n              current_beam.end = current_beam.start - partial_beam_length;\n            }\n          } else if (should_break) {\n            // This note should have a secondary break after it. Even though\n            //  we just started a beam, it needs to end immediately.\n            current_beam.end = current_beam.start - partial_beam_length;\n            beam_started = false;\n          }\n          beam_lines.push(current_beam);\n        }\n      } else {\n        // The current note does not get a beam.\n        beam_started = false;\n      }\n\n      // Store the secondary break flag to inform the partial beam logic in\n      //  the next iteration of the loop.\n      previous_should_break = should_break;\n    }\n\n    // Add a partial beam pointing left if this is the last note in the group\n    const last_beam = beam_lines[beam_lines.length - 1];\n    if (last_beam && last_beam.end === null) {\n      last_beam.end = last_beam.start - partial_beam_length;\n    }\n    return beam_lines;\n  }\n\n  // Render the stems for each notes\n  drawStems() {\n    this.notes.forEach(note => {\n      if (note.getStem()) {\n        note.getStem().setContext(this.context).draw();\n      }\n    }, this);\n  }\n\n  // Render the beam lines\n  drawBeamLines() {\n    this.checkContext();\n\n    const valid_beam_durations = ['4', '8', '16', '32', '64'];\n\n    const firstNote = this.notes[0];\n    let beamY = this.getBeamYToDraw();\n    const firstStemX = firstNote.getStemX();\n    const beamThickness = this.render_options.beam_width * this.stem_direction;\n\n    // Draw the beams.\n    for (let i = 0; i < valid_beam_durations.length; ++i) {\n      const duration = valid_beam_durations[i];\n      const beamLines = this.getBeamLines(duration);\n\n      for (let j = 0; j < beamLines.length; ++j) {\n        const beam_line = beamLines[j];\n        const startBeamX = beam_line.start;\n\n        const startBeamY = this.getSlopeY(startBeamX, firstStemX, beamY, this.slope);\n        const lastBeamX = beam_line.end;\n        const lastBeamY = this.getSlopeY(lastBeamX, firstStemX, beamY, this.slope);\n\n        this.context.beginPath();\n        this.context.moveTo(startBeamX, startBeamY);\n        this.context.lineTo(startBeamX, startBeamY + beamThickness);\n        this.context.lineTo(lastBeamX + 1, lastBeamY + beamThickness);\n        this.context.lineTo(lastBeamX + 1, lastBeamY);\n        this.context.closePath();\n        this.context.fill();\n      }\n\n      beamY += beamThickness * 1.5;\n    }\n  }\n\n  // Pre-format the beam\n  preFormat() { return this; }\n\n  // Post-format the beam. This can only be called after\n  // the notes in the beam have both `x` and `y` values. ie: they've\n  // been formatted and have staves\n  postFormat() {\n    if (this.postFormatted) return;\n\n    // Calculate a smart slope if we're not forcing the beams to be flat.\n    if (this.notes[0].getCategory() === 'tabnotes' || this.render_options.flat_beams) {\n      this.calculateFlatSlope();\n    } else {\n      this.calculateSlope();\n    }\n    this.applyStemExtensions();\n\n    this.postFormatted = true;\n  }\n\n  // Render the beam to the canvas context\n  draw() {\n    this.checkContext();\n    this.setRendered();\n    if (this.unbeamable) return;\n\n    if (!this.postFormatted) {\n      this.postFormat();\n    }\n\n    this.drawStems();\n    this.applyStyle();\n    this.drawBeamLines();\n    this.restoreStyle();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the main Voice class. It's mainly a container\n// object to group `Tickables` for formatting.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\n\nexport class Voice extends Element {\n  // Modes allow the addition of ticks in three different ways:\n  //\n  // STRICT: This is the default. Ticks must fill the voice.\n  // SOFT:   Ticks can be added without restrictions.\n  // FULL:   Ticks do not need to fill the voice, but can't exceed the maximum\n  //         tick length.\n  static get Mode() {\n    return {\n      STRICT: 1,\n      SOFT: 2,\n      FULL: 3,\n    };\n  }\n\n  constructor(time) {\n    super();\n    this.setAttribute('type', 'Voice');\n\n    // Time signature shortcut: \"4/4\", \"3/8\", etc.\n    if (typeof(time) === 'string') {\n      const match = time.match(/(\\d+)\\/(\\d+)/);\n      if (match) {\n        time = {\n          num_beats: match[1],\n          beat_value: match[2],\n          resolution: Flow.RESOLUTION,\n        };\n      }\n    }\n\n    // Default time sig is 4/4\n    this.time = Vex.Merge({\n      num_beats: 4,\n      beat_value: 4,\n      resolution: Flow.RESOLUTION,\n    }, time);\n\n    // Recalculate total ticks.\n    this.totalTicks = new Fraction(\n      this.time.num_beats * (this.time.resolution / this.time.beat_value), 1);\n\n    this.resolutionMultiplier = 1;\n\n    // Set defaults\n    this.tickables = [];\n    this.ticksUsed = new Fraction(0, 1);\n    this.smallestTickCount = this.totalTicks.clone();\n    this.largestTickWidth = 0;\n    this.stave = null;\n    // Do we care about strictly timed notes\n    this.mode = Voice.Mode.STRICT;\n\n    // This must belong to a VoiceGroup\n    this.voiceGroup = null;\n  }\n\n  // Get the total ticks in the voice\n  getTotalTicks() { return this.totalTicks; }\n\n  // Get the total ticks used in the voice by all the tickables\n  getTicksUsed() { return this.ticksUsed; }\n\n  // Get the largest width of all the tickables\n  getLargestTickWidth() { return this.largestTickWidth; }\n\n  // Get the tick count for the shortest tickable\n  getSmallestTickCount() { return this.smallestTickCount; }\n\n  // Get the tickables in the voice\n  getTickables() { return this.tickables; }\n\n  // Get/set the voice mode, use a value from `Voice.Mode`\n  getMode() { return this.mode; }\n  setMode(mode) { this.mode = mode; return this; }\n\n  // Get the resolution multiplier for the voice\n  getResolutionMultiplier() { return this.resolutionMultiplier; }\n\n  // Get the actual tick resolution for the voice\n  getActualResolution() { return this.resolutionMultiplier * this.time.resolution; }\n\n  // Set the voice's stave\n  setStave(stave) {\n    this.stave = stave;\n    this.boundingBox = null; // Reset bounding box so we can reformat\n    return this;\n  }\n\n  // Get the bounding box for the voice\n  getBoundingBox() {\n    let stave;\n    let boundingBox;\n    let bb;\n    let i;\n\n    if (!this.boundingBox) {\n      if (!this.stave) throw new Vex.RERR('NoStave', \"Can't get bounding box without stave.\");\n      stave = this.stave;\n      boundingBox = null;\n\n      for (i = 0; i < this.tickables.length; ++i) {\n        this.tickables[i].setStave(stave);\n\n        bb = this.tickables[i].getBoundingBox();\n        if (!bb) continue;\n\n        boundingBox = boundingBox ? boundingBox.mergeWith(bb) : bb;\n      }\n\n      this.boundingBox = boundingBox;\n    }\n    return this.boundingBox;\n  }\n\n  // Every tickable must be associated with a voiceGroup. This allows formatters\n  // and preformatters to associate them with the right modifierContexts.\n  getVoiceGroup() {\n    if (!this.voiceGroup) {\n      throw new Vex.RERR('NoVoiceGroup', 'No voice group for voice.');\n    }\n\n    return this.voiceGroup;\n  }\n\n  // Set the voice group\n  setVoiceGroup(g) { this.voiceGroup = g; return this; }\n\n  // Set the voice mode to strict or soft\n  setStrict(strict) {\n    this.mode = strict ? Voice.Mode.STRICT : Voice.Mode.SOFT;\n    return this;\n  }\n\n  // Determine if the voice is complete according to the voice mode\n  isComplete() {\n    if (this.mode === Voice.Mode.STRICT || this.mode === Voice.Mode.FULL) {\n      return this.ticksUsed.equals(this.totalTicks);\n    } else {\n      return true;\n    }\n  }\n\n  // Add a tickable to the voice\n  addTickable(tickable) {\n    if (!tickable.shouldIgnoreTicks()) {\n      const ticks = tickable.getTicks();\n\n      // Update the total ticks for this line.\n      this.ticksUsed.add(ticks);\n\n      if (\n        (this.mode === Voice.Mode.STRICT || this.mode === Voice.Mode.FULL) &&\n        this.ticksUsed.greaterThan(this.totalTicks)\n      ) {\n        this.ticksUsed.subtract(ticks);\n        throw new Vex.RERR('BadArgument', 'Too many ticks.');\n      }\n\n      // Track the smallest tickable for formatting.\n      if (ticks.lessThan(this.smallestTickCount)) {\n        this.smallestTickCount = ticks.clone();\n      }\n\n      this.resolutionMultiplier = this.ticksUsed.denominator;\n\n      // Expand total ticks using denominator from ticks used.\n      this.totalTicks.add(0, this.ticksUsed.denominator);\n    }\n\n    // Add the tickable to the line.\n    this.tickables.push(tickable);\n    tickable.setVoice(this);\n    return this;\n  }\n\n  // Add an array of tickables to the voice.\n  addTickables(tickables) {\n    for (let i = 0; i < tickables.length; ++i) {\n      this.addTickable(tickables[i]);\n    }\n\n    return this;\n  }\n\n  // Preformats the voice by applying the voice's stave to each note.\n  preFormat() {\n    if (this.preFormatted) return this;\n\n    this.tickables.forEach((tickable) => {\n      if (!tickable.getStave()) {\n        tickable.setStave(this.stave);\n      }\n    });\n\n    this.preFormatted = true;\n    return this;\n  }\n\n  // Render the voice onto the canvas `context` and an optional `stave`.\n  // If `stave` is omitted, it is expected that the notes have staves\n  // already set.\n  draw(context = this.context, stave = this.stave) {\n    this.setRendered();\n    let boundingBox = null;\n    for (let i = 0; i < this.tickables.length; ++i) {\n      const tickable = this.tickables[i];\n\n      // Set the stave if provided\n      if (stave) tickable.setStave(stave);\n\n      if (!tickable.getStave()) {\n        throw new Vex.RuntimeError(\n          'MissingStave', 'The voice cannot draw tickables without staves.'\n        );\n      }\n\n      if (i === 0) boundingBox = tickable.getBoundingBox();\n\n      if (i > 0 && boundingBox) {\n        const tickable_bb = tickable.getBoundingBox();\n        if (tickable_bb) boundingBox.mergeWith(tickable_bb);\n      }\n\n      tickable.setContext(context);\n      tickable.drawWithStyle();\n    }\n\n    this.boundingBox = boundingBox;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Glyph } from './glyph';\n\nfunction drawBoldDoubleLine(ctx, type, topX, topY, botY) {\n  if (\n    type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n    type !== StaveConnector.type.BOLD_DOUBLE_RIGHT\n  ) {\n    throw new Vex.RERR(\n      'InvalidConnector', 'A REPEAT_BEGIN or REPEAT_END type must be provided.'\n    );\n  }\n\n  let x_shift = 3;\n  let variableWidth = 3.5; // Width for avoiding anti-aliasing width issues\n  const thickLineOffset = 2; // For aesthetics\n\n  if (type === StaveConnector.type.BOLD_DOUBLE_RIGHT) {\n    x_shift = -5; // Flips the side of the thin line\n    variableWidth = 3;\n  }\n\n  // Thin line\n  ctx.fillRect(topX + x_shift, topY, 1, botY - topY);\n  // Thick line\n  ctx.fillRect(topX - thickLineOffset, topY, variableWidth, botY - topY);\n}\n\nexport class StaveConnector extends Element {\n  // SINGLE_LEFT and SINGLE are the same value for compatibility\n  // with older versions of vexflow which didn't have right sided\n  // stave connectors\n  static get type() {\n    return {\n      SINGLE_RIGHT: 0,\n      SINGLE_LEFT: 1,\n      SINGLE: 1,\n      DOUBLE: 2,\n      BRACE: 3,\n      BRACKET: 4,\n      BOLD_DOUBLE_LEFT: 5,\n      BOLD_DOUBLE_RIGHT: 6,\n      THIN_DOUBLE: 7,\n      NONE: 8,\n    };\n  }\n\n  static get typeString() {\n    return {\n      singleRight: StaveConnector.type.SINGLE_RIGHT,\n      singleLeft: StaveConnector.type.SINGLE_LEFT,\n      single: StaveConnector.type.SINGLE,\n      double: StaveConnector.type.DOUBLE,\n      brace: StaveConnector.type.BRACE,\n      bracket: StaveConnector.type.BRACKET,\n      boldDoubleLeft: StaveConnector.type.BOLD_DOUBLE_LEFT,\n      boldDoubleRight: StaveConnector.type.BOLD_DOUBLE_RIGHT,\n      thinDouble: StaveConnector.type.THIN_DOUBLE,\n      none: StaveConnector.type.NONE,\n    };\n  }\n\n  constructor(top_stave, bottom_stave) {\n    super();\n    this.setAttribute('type', 'StaveConnector');\n\n    this.thickness = Flow.STAVE_LINE_THICKNESS;\n    this.width = 3;\n    this.top_stave = top_stave;\n    this.bottom_stave = bottom_stave;\n    this.type = StaveConnector.type.DOUBLE;\n    this.font = {\n      family: 'times',\n      size: 16,\n      weight: 'normal',\n    };\n    // 1. Offset Bold Double Left to align with offset Repeat Begin bars\n    // 2. Offset BRACE type not to overlap with another StaveConnector\n    this.x_shift = 0;\n    this.texts = [];\n  }\n\n  setType(type) {\n    type = typeof(type) === 'string'\n      ? StaveConnector.typeString[type]\n      : type;\n\n    if (type >= StaveConnector.type.SINGLE_RIGHT && type <= StaveConnector.type.NONE) {\n      this.type = type;\n    }\n    return this;\n  }\n\n  setText(text, options) {\n    this.texts.push({\n      content: text,\n      options: Vex.Merge({ shift_x: 0, shift_y: 0 }, options),\n    });\n    return this;\n  }\n\n  setFont(font) {\n    Vex.Merge(this.font, font);\n  }\n\n  setXShift(x_shift) {\n    if (typeof x_shift !== 'number') {\n      throw Vex.RERR('InvalidType', 'x_shift must be a Number');\n    }\n\n    this.x_shift = x_shift;\n    return this;\n  }\n\n  draw() {\n    const ctx = this.checkContext();\n    this.setRendered();\n\n    let topY = this.top_stave.getYForLine(0);\n    let botY = this.bottom_stave.getYForLine(this.bottom_stave.getNumLines() - 1) +\n      this.thickness;\n    let width = this.width;\n    let topX = this.top_stave.getX();\n\n    const isRightSidedConnector = (\n      this.type === StaveConnector.type.SINGLE_RIGHT ||\n      this.type === StaveConnector.type.BOLD_DOUBLE_RIGHT ||\n      this.type === StaveConnector.type.THIN_DOUBLE\n    );\n\n    if (isRightSidedConnector) {\n      topX = this.top_stave.getX() + this.top_stave.width;\n    }\n\n    let attachment_height = botY - topY;\n    switch (this.type) {\n      case StaveConnector.type.SINGLE:\n        width = 1;\n        break;\n      case StaveConnector.type.SINGLE_LEFT:\n        width = 1;\n        break;\n      case StaveConnector.type.SINGLE_RIGHT:\n        width = 1;\n        break;\n      case StaveConnector.type.DOUBLE:\n        topX -= (this.width + 2);\n        break;\n      case StaveConnector.type.BRACE: {\n        width = 12;\n        // May need additional code to draw brace\n        const x1 = this.top_stave.getX() - 2 + this.x_shift;\n        const y1 = topY;\n        const x3 = x1;\n        const y3 = botY;\n        const x2 = x1 - width;\n        const y2 = y1 + attachment_height / 2.0;\n        const cpx1 = x2 - (0.90 * width);\n        const cpy1 = y1 + (0.2 * attachment_height);\n        const cpx2 = x1 + (1.10 * width);\n        const cpy2 = y2 - (0.135 * attachment_height);\n        const cpx3 = cpx2;\n        const cpy3 = y2 + (0.135 * attachment_height);\n        const cpx4 = cpx1;\n        const cpy4 = y3 - (0.2 * attachment_height);\n        const cpx5 = x2 - width;\n        const cpy5 = cpy4;\n        const cpx6 = x1 + (0.40 * width);\n        const cpy6 = y2 + (0.135 * attachment_height);\n        const cpx7 = cpx6;\n        const cpy7 = y2 - (0.135 * attachment_height);\n        const cpx8 = cpx5;\n        const cpy8 = cpy1;\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);\n        ctx.bezierCurveTo(cpx3, cpy3, cpx4, cpy4, x3, y3);\n        ctx.bezierCurveTo(cpx5, cpy5, cpx6, cpy6, x2, y2);\n        ctx.bezierCurveTo(cpx7, cpy7, cpx8, cpy8, x1, y1);\n        ctx.fill();\n        ctx.stroke();\n        break;\n      } case StaveConnector.type.BRACKET:\n        topY -= 4;\n        botY += 4;\n        attachment_height = botY - topY;\n        Glyph.renderGlyph(ctx, topX - 5, topY - 3, 40, 'v1b', true);\n        Glyph.renderGlyph(ctx, topX - 5, botY + 3, 40, 'v10', true);\n        topX -= (this.width + 2);\n        break;\n      case StaveConnector.type.BOLD_DOUBLE_LEFT:\n        drawBoldDoubleLine(ctx, this.type, topX + this.x_shift, topY, botY);\n        break;\n      case StaveConnector.type.BOLD_DOUBLE_RIGHT:\n        drawBoldDoubleLine(ctx, this.type, topX, topY, botY);\n        break;\n      case StaveConnector.type.THIN_DOUBLE:\n        width = 1;\n        break;\n      case StaveConnector.type.NONE:\n        break;\n      default:\n        throw new Vex.RERR(\n          'InvalidType', `The provided StaveConnector.type (${this.type}) is invalid`\n        );\n    }\n\n    if (\n      this.type !== StaveConnector.type.BRACE &&\n      this.type !== StaveConnector.type.BOLD_DOUBLE_LEFT &&\n      this.type !== StaveConnector.type.BOLD_DOUBLE_RIGHT &&\n      this.type !== StaveConnector.type.NONE\n    ) {\n      ctx.fillRect(topX, topY, width, attachment_height);\n    }\n\n    // If the connector is a thin double barline, draw the paralell line\n    if (this.type === StaveConnector.type.THIN_DOUBLE) {\n      ctx.fillRect(topX - 3, topY, width, attachment_height);\n    }\n\n    ctx.save();\n    ctx.lineWidth = 2;\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    // Add stave connector text\n    for (let i = 0; i < this.texts.length; i++) {\n      const text = this.texts[i];\n      const text_width = ctx.measureText('' + text.content).width;\n      const x = this.top_stave.getX() - text_width - 24 + text.options.shift_x;\n      const y = (this.top_stave.getYForLine(0) + this.bottom_stave.getBottomLineY()) / 2 +\n        text.options.shift_y;\n\n      ctx.fillText('' + text.content, x, y + 4);\n    }\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// The tickable interface. Tickables are things that sit on a score and\n// have a duration, i.e., they occupy space in the musical rendering dimension.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\n\nexport class Tickable extends Element {\n  constructor() {\n    super();\n    this.setAttribute('type', 'Tickable');\n\n    // These properties represent the duration of\n    // this tickable element.\n    this.ticks = new Fraction(0, 1);\n    this.intrinsicTicks = 0;\n    this.tickMultiplier = new Fraction(1, 1);\n\n    this.width = 0;\n    this.x_shift = 0; // Shift from tick context\n    this.voice = null;\n    this.tickContext = null;\n    this.modifierContext = null;\n    this.modifiers = [];\n    this.preFormatted = false;\n    this.postFormatted = false;\n    this.tuplet = null;\n    this.tupletStack = [];\n\n    this.align_center = false;\n    this.center_x_shift = 0; // Shift from tick context if center aligned\n\n    // This flag tells the formatter to ignore this tickable during\n    // formatting and justification. It is set by tickables such as BarNote.\n    this.ignore_ticks = false;\n\n    // This is a space for an external formatting class or function to maintain\n    // metrics.\n    this.formatterMetrics = {\n      // The freedom of a tickable is the distance it can move without colliding\n      // with neighboring elements. A formatter can set these values during its\n      // formatting pass, which a different formatter can then use to fine tune.\n      freedom: { left: 0, right: 0 },\n\n      // The simplified rational duration of this tick as a string. It can be\n      // used as an index to a map or hashtable.\n      duration: '',\n\n      // The number of formatting iterations undergone.\n      iterations: 0,\n\n      // The space in pixels allocated by this formatter, along with the mean space\n      // for tickables of this duration, and the deviation from the mean.\n      space: {\n        used: 0,\n        mean: 0,\n        deviation: 0,\n      },\n    };\n  }\n\n  reset() { return this; }\n  getTicks() { return this.ticks; }\n  shouldIgnoreTicks() { return this.ignore_ticks; }\n  getWidth() { return this.width; }\n\n  getFormatterMetrics() { return this.formatterMetrics; }\n\n  setXShift(x) { this.x_shift = x; }\n  getCenterXShift() {\n    if (this.isCenterAligned()) {\n      return this.center_x_shift;\n    }\n\n    return 0;\n  }\n  isCenterAligned() { return this.align_center; }\n  setCenterAlignment(align_center) {\n    this.align_center = align_center;\n    return this;\n  }\n\n  // Every tickable must be associated with a voice. This allows formatters\n  // and preFormatter to associate them with the right modifierContexts.\n  getVoice() {\n    if (!this.voice) throw new Vex.RERR('NoVoice', 'Tickable has no voice.');\n    return this.voice;\n  }\n  setVoice(voice) { this.voice = voice; }\n  getTuplet() { return this.tuplet; }\n\n  /*\n   * resetTuplet\n   * @param tuplet -- the specific tuplet to reset\n   *   if this is not provided, all tuplets are reset.\n   * @returns this\n   *\n   * Removes any prior tuplets from the tick calculation and\n   * resets the intrinsic tick value to\n   */\n  resetTuplet(tuplet) {\n    let noteCount;\n    let notesOccupied;\n    if (tuplet) {\n      const i = this.tupletStack.indexOf(tuplet);\n      if (i !== -1) {\n        this.tupletStack.splice(i, 1);\n        noteCount = tuplet.getNoteCount();\n        notesOccupied = tuplet.getNotesOccupied();\n\n        // Revert old multiplier by inverting numerator & denom.:\n        this.applyTickMultiplier(noteCount, notesOccupied);\n      }\n      return this;\n    }\n\n    while (this.tupletStack.length) {\n      tuplet = this.tupletStack.pop();\n      noteCount = tuplet.getNoteCount();\n      notesOccupied = tuplet.getNotesOccupied();\n\n      // Revert old multiplier by inverting numerator & denom.:\n      this.applyTickMultiplier(noteCount, notesOccupied);\n    }\n    return this;\n  }\n\n  setTuplet(tuplet) {\n    // Attach to new tuplet\n\n    if (tuplet) {\n      this.tupletStack.push(tuplet);\n\n      const noteCount = tuplet.getNoteCount();\n      const notesOccupied = tuplet.getNotesOccupied();\n\n      this.applyTickMultiplier(notesOccupied, noteCount);\n    }\n\n    this.tuplet = tuplet;\n\n    return this;\n  }\n\n  /** optional, if tickable has modifiers **/\n  addToModifierContext(mc) {\n    this.modifierContext = mc;\n    // Add modifiers to modifier context (if any)\n    this.preFormatted = false;\n  }\n\n  /** optional, if tickable has modifiers **/\n  addModifier(mod) {\n    this.modifiers.push(mod);\n    this.preFormatted = false;\n    return this;\n  }\n  getModifiers() {\n    return this.modifiers;\n  }\n  setTickContext(tc) {\n    this.tickContext = tc;\n    this.preFormatted = false;\n  }\n  preFormat() {\n    if (this.preFormatted) return;\n\n    this.width = 0;\n    if (this.modifierContext) {\n      this.modifierContext.preFormat();\n      this.width += this.modifierContext.getWidth();\n    }\n  }\n  postFormat() {\n    if (this.postFormatted) return this;\n    this.postFormatted = true;\n    return this;\n  }\n  getIntrinsicTicks() {\n    return this.intrinsicTicks;\n  }\n  setIntrinsicTicks(intrinsicTicks) {\n    this.intrinsicTicks = intrinsicTicks;\n    this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n  }\n  getTickMultiplier() {\n    return this.tickMultiplier;\n  }\n  applyTickMultiplier(numerator, denominator) {\n    this.tickMultiplier.multiply(numerator, denominator);\n    this.ticks = this.tickMultiplier.clone().multiply(this.intrinsicTicks);\n  }\n  setDuration(duration) {\n    const ticks = duration.numerator * (Flow.RESOLUTION / duration.denominator);\n    this.ticks = this.tickMultiplier.clone().multiply(ticks);\n    this.intrinsicTicks = this.ticks.value();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements an abstract interface for notes and chords that\n// are rendered on a stave. Notes have some common properties: All of them\n// have a value (e.g., pitch, fret, etc.) and a duration (quarter, half, etc.)\n//\n// Some notes have stems, heads, dots, etc. Most notational elements that\n// surround a note are called *modifiers*, and every note has an associated\n// array of them. All notes also have a rendering context and belong to a stave.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Tickable } from './tickable';\n\nexport class Note extends Tickable {\n  static get CATEGORY() { return 'note'; }\n  static get STAVEPADDING() { return 12; }\n\n  // Debug helper. Displays various note metrics for the given\n  // note.\n  static plotMetrics(ctx, note, yPos) {\n    const metrics = note.getMetrics();\n    const xStart = note.getAbsoluteX() - metrics.modLeftPx - metrics.extraLeftPx;\n    const xPre1 = note.getAbsoluteX() - metrics.extraLeftPx;\n    const xAbs = note.getAbsoluteX();\n    const xPost1 = note.getAbsoluteX() + metrics.noteWidth;\n    const xPost2 = note.getAbsoluteX() + metrics.noteWidth + metrics.extraRightPx;\n    const xEnd = note.getAbsoluteX()\n      + metrics.noteWidth\n      + metrics.extraRightPx\n      + metrics.modRightPx;\n    const xFreedomRight = xEnd + note.getFormatterMetrics().freedom.right;\n\n    const xWidth = xEnd - xStart;\n    ctx.save();\n    ctx.setFont('Arial', 8, '');\n    ctx.fillText(Math.round(xWidth) + 'px', xStart + note.getXShift(), yPos);\n\n    const y = (yPos + 7);\n    function stroke(x1, x2, color, yy = y) {\n      ctx.beginPath();\n      ctx.setStrokeStyle(color);\n      ctx.setFillStyle(color);\n      ctx.setLineWidth(3);\n      ctx.moveTo(x1 + note.getXShift(), yy);\n      ctx.lineTo(x2 + note.getXShift(), yy);\n      ctx.stroke();\n    }\n\n    stroke(xStart, xPre1, 'red');\n    stroke(xPre1, xAbs, '#999');\n    stroke(xAbs, xPost1, 'green');\n    stroke(xPost1, xPost2, '#999');\n    stroke(xPost2, xEnd, 'red');\n    stroke(xEnd, xFreedomRight, '#DD0');\n    stroke(xStart - note.getXShift(), xStart, '#BBB'); // Shift\n    Vex.drawDot(ctx, xAbs + note.getXShift(), y, 'blue');\n\n    const formatterMetrics = note.getFormatterMetrics();\n    if (formatterMetrics.iterations > 0) {\n      const spaceDeviation = formatterMetrics.space.deviation;\n      const prefix = spaceDeviation >= 0 ? '+' : '';\n      ctx.setFillStyle('red');\n      ctx.fillText(prefix + Math.round(spaceDeviation),\n        xAbs + note.getXShift(), yPos - 10);\n    }\n    ctx.restore();\n  }\n\n  // Every note is a tickable, i.e., it can be mutated by the `Formatter` class for\n  // positioning and layout.\n  // To create a new note you need to provide a `noteStruct`, which consists\n  // of the following fields:\n  //\n  // `type`: The note type (e.g., `r` for rest, `s` for slash notes, etc.)\n  // `dots`: The number of dots, which affects the duration.\n  // `duration`: The time length (e.g., `q` for quarter, `h` for half, `8` for eighth etc.)\n  //\n  // The range of values for these parameters are available in `src/tables.js`.\n  constructor(noteStruct) {\n    super();\n    this.setAttribute('type', 'Note');\n\n    if (!noteStruct) {\n      throw new Vex.RuntimeError(\n        'BadArguments', 'Note must have valid initialization data to identify duration and type.'\n      );\n    }\n\n    // Parse `noteStruct` and get note properties.\n    const initStruct = Flow.parseNoteStruct(noteStruct);\n    if (!initStruct) {\n      throw new Vex.RuntimeError(\n        'BadArguments', `Invalid note initialization object: ${JSON.stringify(noteStruct)}`\n      );\n    }\n\n    // Set note properties from parameters.\n    this.duration = initStruct.duration;\n    this.dots = initStruct.dots;\n    this.noteType = initStruct.type;\n    this.customTypes = initStruct.customTypes;\n\n    if (noteStruct.duration_override) {\n      // Custom duration\n      this.setDuration(noteStruct.duration_override);\n    } else {\n      // Default duration\n      this.setIntrinsicTicks(initStruct.ticks);\n    }\n\n    this.modifiers = [];\n\n    // Get the glyph code for this note from the font.\n    this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n    this.customGlyphs = this.customTypes.map(t => Flow.getGlyphProps(this.duration, t));\n\n    if (this.positions && (typeof (this.positions) !== 'object' || !this.positions.length)) {\n      throw new Vex.RuntimeError('BadArguments', 'Note keys must be array type.');\n    }\n\n    // Note to play for audio players.\n    this.playNote = null;\n\n    // Positioning contexts used by the Formatter.\n    this.tickContext = null;    // The current tick context.\n    this.modifierContext = null;\n    this.ignore_ticks = false;\n\n    // Positioning variables\n    this.width = 0;             // Width in pixels calculated after preFormat\n    this.extraLeftPx = 0;       // Extra room on left for offset note head\n    this.extraRightPx = 0;      // Extra room on right for offset note head\n    this.x_shift = 0;           // X shift from tick context X\n    this.left_modPx = 0;        // Max width of left modifiers\n    this.right_modPx = 0;       // Max width of right modifiers\n    this.voice = null;          // The voice that this note is in\n    this.preFormatted = false;  // Is this note preFormatted?\n    this.ys = [];               // list of y coordinates for each note\n    // we need to hold on to these for ties and beams.\n\n    if (noteStruct.align_center) {\n      this.setCenterAlignment(noteStruct.align_center);\n    }\n\n    // The render surface.\n    this.stave = null;\n    this.render_options = {\n      annotation_spacing: 5,\n      stave_padding: Note.STAVEPADDING,\n    };\n  }\n\n  // Get and set the play note, which is arbitrary data that can be used by an\n  // audio player.\n  getPlayNote() { return this.playNote; }\n  setPlayNote(note) { this.playNote = note; return this; }\n\n  // Don't play notes by default, call them rests. This is also used by things like\n  // beams and dots for positioning.\n  isRest() { return false; }\n\n  // TODO(0xfe): Why is this method here?\n  addStroke(index, stroke) {\n    stroke.setNote(this);\n    stroke.setIndex(index);\n    this.modifiers.push(stroke);\n    this.setPreFormatted(false);\n    return this;\n  }\n\n  // Get and set the target stave.\n  getStave() { return this.stave; }\n  setStave(stave) {\n    this.stave = stave;\n    this.setYs([stave.getYForLine(0)]); // Update Y values if the stave is changed.\n    this.context = this.stave.context;\n    return this;\n  }\n\n  // `Note` is not really a modifier, but is used in\n  // a `ModifierContext`.\n  getCategory() { return Note.CATEGORY; }\n\n  // Set the rendering context for the note.\n  setContext(context) { this.context = context; return this; }\n\n  // Get and set spacing to the left and right of the notes.\n  getExtraLeftPx() { return this.extraLeftPx; }\n  getExtraRightPx() { return this.extraRightPx; }\n  setExtraLeftPx(x) { this.extraLeftPx = x; return this; }\n  setExtraRightPx(x) { this.extraRightPx = x; return this; }\n\n  // Returns true if this note has no duration (e.g., bar notes, spacers, etc.)\n  shouldIgnoreTicks() { return this.ignore_ticks; }\n\n  // Get the stave line number for the note.\n  getLineNumber() { return 0; }\n\n  // Get the stave line number for rest.\n  getLineForRest() { return 0; }\n\n  // Get the glyph associated with this note.\n  getGlyph() { return this.glyph; }\n\n  getGlyphWidth() {\n    return this.glyph.getWidth(this.render_options.glyph_font_scale);\n  }\n\n  // Set and get Y positions for this note. Each Y value is associated with\n  // an individual pitch/key within the note/chord.\n  setYs(ys) { this.ys = ys; return this; }\n  getYs() {\n    if (this.ys.length === 0) {\n      throw new Vex.RERR('NoYValues', 'No Y-values calculated for this note.');\n    }\n\n    return this.ys;\n  }\n\n  // Get the Y position of the space above the stave onto which text can\n  // be rendered.\n  getYForTopText(text_line) {\n    if (!this.stave) {\n      throw new Vex.RERR('NoStave', 'No stave attached to this note.');\n    }\n\n    return this.stave.getYForTopText(text_line);\n  }\n\n  // Get a `BoundingBox` for this note.\n  getBoundingBox() { return null; }\n\n  // Returns the voice that this note belongs in.\n  getVoice() {\n    if (!this.voice) throw new Vex.RERR('NoVoice', 'Note has no voice.');\n    return this.voice;\n  }\n\n  // Attach this note to `voice`.\n  setVoice(voice) {\n    this.voice = voice;\n    this.preFormatted = false;\n    return this;\n  }\n\n  // Get and set the `TickContext` for this note.\n  getTickContext() { return this.tickContext; }\n  setTickContext(tc) {\n    this.tickContext = tc;\n    this.preFormatted = false;\n    return this;\n  }\n\n  // Accessors for the note type.\n  getDuration() { return this.duration; }\n  isDotted() { return (this.dots > 0); }\n  hasStem() { return false; }\n  getDots() { return this.dots; }\n  getNoteType() { return this.noteType; }\n  setBeam() { return this; } // ignore parameters\n\n  // Attach this note to a modifier context.\n  setModifierContext(mc) { this.modifierContext = mc; return this; }\n\n  // Attach a modifier to this note.\n  addModifier(modifier, index = 0) {\n    modifier.setNote(this);\n    modifier.setIndex(index);\n    this.modifiers.push(modifier);\n    this.setPreFormatted(false);\n    return this;\n  }\n\n  // Get the coordinates for where modifiers begin.\n  getModifierStartXY() {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n    }\n\n    return {\n      x: this.getAbsoluteX(),\n      y: this.ys[0],\n    };\n  }\n\n  // Get bounds and metrics for this note.\n  //\n  // Returns a struct with fields:\n  // `width`: The total width of the note (including modifiers.)\n  // `noteWidth`: The width of the note head only.\n  // `left_shift`: The horizontal displacement of the note.\n  // `modLeftPx`: Start `X` for left modifiers.\n  // `modRightPx`: Start `X` for right modifiers.\n  // `extraLeftPx`: Extra space on left of note.\n  // `extraRightPx`: Extra space on right of note.\n  getMetrics() {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call getMetrics on an unformatted note.\");\n    }\n\n    let modLeftPx = 0;\n    let modRightPx = 0;\n    if (this.modifierContext != null) {\n      modLeftPx = this.modifierContext.state.left_shift;\n      modRightPx = this.modifierContext.state.right_shift;\n    }\n\n    const width = this.getWidth();\n    return {\n      width,\n      noteWidth: width - modLeftPx - modRightPx - this.extraLeftPx - this.extraRightPx,\n      left_shift: this.x_shift, // TODO(0xfe): Make style consistent\n\n      // Modifiers, accidentals etc.\n      modLeftPx,\n      modRightPx,\n\n      // Displaced note head on left or right.\n      extraLeftPx: this.extraLeftPx,\n      extraRightPx: this.extraRightPx,\n    };\n  }\n\n  // Get and set width of note. Used by the formatter for positioning.\n  setWidth(width) { this.width = width; }\n  getWidth() {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call GetWidth on an unformatted note.\");\n    }\n\n    return this.width + (this.modifierContext ? this.modifierContext.getWidth() : 0);\n  }\n\n  // Displace note by `x` pixels. Used by the formatter.\n  setXShift(x) { this.x_shift = x; return this; }\n  getXShift() { return this.x_shift; }\n\n  // Get `X` position of this tick context.\n  getX() {\n    if (!this.tickContext) {\n      throw new Vex.RERR('NoTickContext', 'Note needs a TickContext assigned for an X-Value');\n    }\n\n    return this.tickContext.getX() + this.x_shift;\n  }\n\n  // Get the absolute `X` position of this note's tick context. This\n  // excludes x_shift, so you'll need to factor it in if you're\n  // looking for the post-formatted x-position.\n  getAbsoluteX() {\n    if (!this.tickContext) {\n      throw new Vex.RERR('NoTickContext', 'Note needs a TickContext assigned for an X-Value');\n    }\n\n    // Position note to left edge of tick context.\n    let x = this.tickContext.getX();\n    if (this.stave) {\n      x += this.stave.getNoteStartX() + this.render_options.stave_padding;\n    }\n\n    if (this.isCenterAligned()) {\n      x += this.getCenterXShift();\n    }\n\n    return x;\n  }\n  setPreFormatted(value) {\n    this.preFormatted = value;\n\n    // Maintain the width of left and right modifiers in pixels.\n    if (this.preFormatted) {\n      const extra = this.tickContext.getExtraPx();\n      this.left_modPx = Math.max(this.left_modPx, extra.left);\n      this.right_modPx = Math.max(this.right_modPx, extra.right);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `NoteHeads`. `NoteHeads` are typically not manipulated\n// directly, but used internally in `StaveNote`.\n//\n// See `tests/notehead_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Note } from './note';\nimport { Stem } from './stem';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.NoteHead.DEBUG` to `true`.\nfunction L(...args) { if (NoteHead.DEBUG) Vex.L('Vex.Flow.NoteHead', args); }\n\n// Draw slashnote head manually. No glyph exists for this.\n//\n// Parameters:\n// * `ctx`: the Canvas context\n// * `duration`: the duration of the note. ex: \"4\"\n// * `x`: the x coordinate to draw at\n// * `y`: the y coordinate to draw at\n// * `stem_direction`: the direction of the stem\nfunction drawSlashNoteHead(ctx, duration, x, y, stem_direction, staveSpace) {\n  const width = Flow.SLASH_NOTEHEAD_WIDTH;\n  ctx.save();\n  ctx.setLineWidth(Flow.STEM_WIDTH);\n\n  let fill = false;\n\n  if (Flow.durationToNumber(duration) > 2) {\n    fill = true;\n  }\n\n  if (!fill) x -= (Flow.STEM_WIDTH / 2) * stem_direction;\n\n  ctx.beginPath();\n  ctx.moveTo(x, y + staveSpace);\n  ctx.lineTo(x, y + 1);\n  ctx.lineTo(x + width, y - staveSpace);\n  ctx.lineTo(x + width, y);\n  ctx.lineTo(x, y + staveSpace);\n  ctx.closePath();\n\n  if (fill) {\n    ctx.fill();\n  } else {\n    ctx.stroke();\n  }\n\n  if (Flow.durationToFraction(duration).equals(0.5)) {\n    const breve_lines = [-3, -1, width + 1, width + 3];\n    for (let i = 0; i < breve_lines.length; i++) {\n      ctx.beginPath();\n      ctx.moveTo(x + breve_lines[i], y - 10);\n      ctx.lineTo(x + breve_lines[i], y + 11);\n      ctx.stroke();\n    }\n  }\n\n  ctx.restore();\n}\n\nexport class NoteHead extends Note {\n  static get CATEGORY() { return 'notehead'; }\n\n  constructor(head_options) {\n    super(head_options);\n    this.setAttribute('type', 'NoteHead');\n\n    this.index = head_options.index;\n    this.x = head_options.x || 0;\n    this.y = head_options.y || 0;\n    this.note_type = head_options.note_type;\n    this.duration = head_options.duration;\n    this.displaced = head_options.displaced || false;\n    this.stem_direction = head_options.stem_direction || StaveNote.STEM_UP;\n    this.line = head_options.line;\n\n    // Get glyph code based on duration and note type. This could be\n    // regular notes, rests, or other custom codes.\n    this.glyph = Flow.getGlyphProps(this.duration, this.note_type);\n    if (!this.glyph) {\n      throw new Vex.RuntimeError(\n        'BadArguments',\n        `No glyph found for duration '${this.duration}' and type '${this.note_type}'`);\n    }\n\n    this.glyph_code = this.glyph.code_head;\n    this.x_shift = head_options.x_shift || 0;\n    if (head_options.custom_glyph_code) {\n      this.custom_glyph = true;\n      this.glyph_code = head_options.custom_glyph_code;\n      this.stem_up_x_offset = head_options.stem_up_x_offset || 0;\n      this.stem_down_x_offset = head_options.stem_down_x_offset || 0;\n    }\n\n    this.style = head_options.style;\n    this.slashed = head_options.slashed;\n\n    Vex.Merge(this.render_options, {\n      // font size for note heads\n      glyph_font_scale: head_options.glyph_font_scale || Flow.DEFAULT_NOTATION_FONT_SCALE,\n      // number of stroke px to the left and right of head\n      stroke_px: 3,\n    });\n\n    this.setWidth(this.glyph.getWidth(this.render_options.glyph_font_scale));\n  }\n\n  getCategory() { return NoteHead.CATEGORY; }\n\n  // Get the width of the notehead\n  getWidth() { return this.width; }\n\n  // Determine if the notehead is displaced\n  isDisplaced() { return this.displaced === true; }\n\n  // Get the glyph data\n  getGlyph() { return this.glyph; }\n\n  // Set the X coordinate\n  setX(x) { this.x = x; return this; }\n\n  // get/set the Y coordinate\n  getY() { return this.y; }\n  setY(y) { this.y = y;  return this; }\n\n  // Get/set the stave line the notehead is placed on\n  getLine() { return this.line; }\n  setLine(line) { this.line = line; return this; }\n\n  // Get the canvas `x` coordinate position of the notehead.\n  getAbsoluteX() {\n    // If the note has not been preformatted, then get the static x value\n    // Otherwise, it's been formatted and we should use it's x value relative\n    // to its tick context\n    const x = !this.preFormatted ? this.x : super.getAbsoluteX();\n\n    // For a more natural displaced notehead, we adjust the displacement amount\n    // by half the stem width in order to maintain a slight overlap with the stem\n    const displacementStemAdjustment = (Stem.WIDTH / 2);\n\n    return x + (this.displaced\n      ? (this.width - displacementStemAdjustment) * this.stem_direction\n      : 0\n    );\n  }\n\n  // Get the `BoundingBox` for the `NoteHead`\n  getBoundingBox() {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n    }\n\n    const spacing = this.stave.getSpacingBetweenLines();\n    const half_spacing = spacing / 2;\n    const min_y = this.y - half_spacing;\n\n    return new Flow.BoundingBox(this.getAbsoluteX(), min_y, this.width, spacing);\n  }\n\n  // Set notehead to a provided `stave`\n  setStave(stave) {\n    const line = this.getLine();\n\n    this.stave = stave;\n    this.setY(stave.getYForNote(line));\n    this.context = this.stave.context;\n    return this;\n  }\n\n  // Pre-render formatting\n  preFormat() {\n    if (this.preFormatted) return this;\n\n    const width = this.getWidth() + this.extraLeftPx + this.extraRightPx;\n\n    this.setWidth(width);\n    this.setPreFormatted(true);\n    return this;\n  }\n\n  // Draw the notehead\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const ctx = this.context;\n    let head_x = this.getAbsoluteX();\n    if (this.custom_glyph) {\n      // head_x += this.x_shift;\n      head_x += this.stem_direction === Stem.UP ? this.stem_up_x_offset : this.stem_down_x_offset;\n    }\n\n    const y = this.y;\n\n    L(\"Drawing note head '\", this.note_type, this.duration, \"' at\", head_x, y);\n\n    // Begin and end positions for head.\n    const stem_direction = this.stem_direction;\n    const glyph_font_scale = this.render_options.glyph_font_scale;\n\n    if (this.style) {\n      this.applyStyle(ctx);\n    }\n\n    if (this.note_type === 's') {\n      const staveSpace = this.stave.getSpacingBetweenLines();\n      drawSlashNoteHead(ctx, this.duration, head_x, y, stem_direction, staveSpace);\n    } else {\n      Glyph.renderGlyph(ctx, head_x, y, glyph_font_scale, this.glyph_code);\n    }\n\n    if (this.style) {\n      this.restoreStyle(ctx);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `StemmableNote` is an abstract interface for notes with optional stems.\n// Examples of stemmable notes are `StaveNote` and `TabNote`\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Stem } from './stem';\nimport { Glyph } from './glyph';\nimport { Note } from './note';\n\nexport class StemmableNote extends Note {\n  constructor(note_struct) {\n    super(note_struct);\n    this.setAttribute('type', 'StemmableNote');\n\n    this.stem = null;\n    this.stemExtensionOverride = null;\n    this.beam = null;\n  }\n\n  // Get and set the note's `Stem`\n  getStem() { return this.stem; }\n  setStem(stem) { this.stem = stem; return this; }\n\n  // Builds and sets a new stem\n  buildStem() {\n    const stem = new Stem();\n    this.setStem(stem);\n    return this;\n  }\n\n  buildFlag() {\n    const { glyph, beam } = this;\n    const shouldRenderFlag = beam === null;\n\n    if (glyph && glyph.flag && shouldRenderFlag) {\n      const flagCode = this.getStemDirection() === Stem.DOWN\n        ? glyph.code_flag_downstem\n        : glyph.code_flag_upstem;\n\n      this.flag = new Glyph(flagCode, this.render_options.glyph_font_scale);\n    }\n  }\n\n  // Get the glyph associated with the top key of this note\n  getTopGlyph() {\n    if (this.getStemDirection() === Stem.DOWN) {\n      return this.customGlyphs[this.customGlyphs.length - 1];\n    } else {\n      return this.customGlyphs[0];\n    }\n  }\n\n  // Get the full length of stem\n  getStemLength() {\n    return Stem.HEIGHT + this.getStemExtension();\n  }\n\n  // Get the number of beams for this duration\n  getBeamCount() {\n    const glyph = this.getGlyph();\n\n    if (glyph) {\n      return glyph.beam_count;\n    } else {\n      return 0;\n    }\n  }\n\n  // Get the minimum length of stem\n  getStemMinumumLength() {\n    const frac = Flow.durationToFraction(this.duration);\n    let length = frac.value() <= 1 ? 0 : 20;\n    // if note is flagged, cannot shorten beam\n    switch (this.duration) {\n      case '8':\n        if (this.beam == null) length = 35;\n        break;\n      case '16':\n        length = this.beam == null ? 35 : 25;\n        break;\n      case '32':\n        length = this.beam == null ? 45 : 35;\n        break;\n      case '64':\n        length = this.beam == null ? 50 : 40;\n        break;\n      case '128':\n        length = this.beam == null ? 55 : 45;\n        break;\n      default:\n        break;\n    }\n    return length;\n  }\n\n  // Get/set the direction of the stem\n  getStemDirection() { return this.stem_direction; }\n  setStemDirection(direction) {\n    if (!direction) direction = Stem.UP;\n    if (direction !== Stem.UP && direction !== Stem.DOWN) {\n      throw new Vex.RERR('BadArgument', `Invalid stem direction: ${direction}`);\n    }\n\n    this.stem_direction = direction;\n    if (this.stem) {\n      this.stem.setDirection(direction);\n      this.stem.setExtension(this.getStemExtension());\n      const glyph = this.getTopGlyph() || this.getGlyph();\n      this.stem.setOptions({\n        stem_up_y_offset: glyph.stem_up_y_offset,\n        stem_down_y_offset: glyph.stem_down_y_offset\n      });\n    }\n\n    this.reset();\n    if (this.flag) {\n      this.buildFlag();\n    }\n\n    this.beam = null;\n    if (this.preFormatted) {\n      this.preFormat();\n    }\n\n    return this;\n  }\n\n  // Get the `x` coordinate of the stem\n  getStemX() {\n    const x_begin = this.getAbsoluteX() + this.x_shift;\n    const x_end = this.getAbsoluteX() + this.x_shift + this.getGlyphWidth();\n    const stem_x = this.stem_direction === Stem.DOWN ? x_begin : x_end;\n    return stem_x;\n  }\n\n  // Get the `x` coordinate for the center of the glyph.\n  // Used for `TabNote` stems and stemlets over rests\n  getCenterGlyphX() {\n    return this.getAbsoluteX() + this.x_shift + (this.getGlyphWidth() / 2);\n  }\n\n  // Get the stem extension for the current duration\n  getStemExtension() {\n    const glyph = this.getGlyph();\n\n    if (this.stemExtensionOverride != null) {\n      return this.stemExtensionOverride;\n    }\n\n    if (glyph) {\n      return this.getStemDirection() === 1\n        ? glyph.stem_up_extension\n        : glyph.stem_down_extension;\n    }\n\n    return 0;\n  }\n\n  // Set the stem length to a specific. Will override the default length.\n  setStemLength(height) {\n    this.stemExtensionOverride = (height - Stem.HEIGHT);\n    return this;\n  }\n\n  // Get the top and bottom `y` values of the stem.\n  getStemExtents() {\n    return this.stem.getExtents();\n  }\n\n  // Sets the current note's beam\n  setBeam(beam) { this.beam = beam; return this; }\n\n  // Get the `y` value for the top/bottom modifiers at a specific `textLine`\n  getYForTopText(textLine) {\n    const extents = this.getStemExtents();\n    if (this.hasStem()) {\n      return Math.min(\n        this.stave.getYForTopText(textLine),\n        extents.topY - (this.render_options.annotation_spacing * (textLine + 1))\n      );\n    } else {\n      return this.stave.getYForTopText(textLine);\n    }\n  }\n\n  getYForBottomText(textLine) {\n    const extents = this.getStemExtents();\n    if (this.hasStem()) {\n      return Math.max(\n        this.stave.getYForTopText(textLine),\n        extents.baseY + (this.render_options.annotation_spacing * (textLine))\n      );\n    } else {\n      return this.stave.getYForBottomText(textLine);\n    }\n  }\n\n  hasFlag() {\n    return Flow.getGlyphProps(this.duration).flag && !this.beam;\n  }\n\n  // Post format the note\n  postFormat() {\n    if (this.beam) this.beam.postFormat();\n\n    this.postFormatted = true;\n\n    return this;\n  }\n\n  // Render the stem onto the canvas\n  drawStem(stem_struct) {\n    this.checkContext();\n    this.setRendered();\n\n    this.setStem(new Stem(stem_struct));\n    this.stem.setContext(this.context).draw();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// `Modifier` is an abstract interface for notational elements that modify\n// a `Note`. Examples of modifiers are `Accidental`, `Annotation`, `Stroke`, etc.\n//\n// For a `Modifier` instance to be positioned correctly, it must be part of\n// a `ModifierContext`. All modifiers in the same context are rendered relative to\n// one another.\n//\n// Typically, all modifiers to a note are part of the same `ModifierContext` instance. Also,\n// in multi-voice staves, all modifiers to notes on the same `tick` are part of the same\n// `ModifierContext`. This ensures that multiple voices don't trample all over each other.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\n// To enable logging for this class. Set `Vex.Flow.Modifier.DEBUG` to `true`.\n// function L(...args) { if (Modifier.DEBUG) Vex.L('Vex.Flow.Modifier', args); }\n\nexport class Modifier extends Element {\n  static get CATEGORY() { return 'none'; }\n\n  // Modifiers can be positioned almost anywhere, relative to a note.\n  static get Position() {\n    return {\n      LEFT: 1,\n      RIGHT: 2,\n      ABOVE: 3,\n      BELOW: 4,\n    };\n  }\n\n  static get PositionString() {\n    return {\n      above: Modifier.Position.ABOVE,\n      below: Modifier.Position.BELOW,\n      left: Modifier.Position.LEFT,\n      right: Modifier.Position.RIGHT,\n    };\n  }\n\n  constructor() {\n    super();\n    this.setAttribute('type', 'Modifier');\n\n    this.width = 0;\n\n    // Modifiers are attached to a note and an index. An index is a\n    // specific head in a chord.\n    this.note = null;\n    this.index = null;\n\n    // The `text_line` is reserved space above or below a stave.\n    this.text_line = 0;\n    this.position = Modifier.Position.LEFT;\n    this.modifier_context = null;\n    this.x_shift = 0;\n    this.y_shift = 0;\n    this.spacingFromNextModifier = 0;\n  }\n\n  // Every modifier has a category. The `ModifierContext` uses this to determine\n  // the type and order of the modifiers.\n  getCategory() { return Modifier.CATEGORY; }\n\n  // Get and set modifier widths.\n  getWidth() { return this.width; }\n  setWidth(width) { this.width = width; return this; }\n\n  // Get and set attached note (`StaveNote`, `TabNote`, etc.)\n  getNote() { return this.note; }\n  setNote(note) { this.note = note; return this; }\n\n  // Get and set note index, which is a specific note in a chord.\n  getIndex() { return this.index; }\n  setIndex(index) { this.index = index; return this; }\n\n  // Every modifier must be part of a `ModifierContext`.\n  getModifierContext() { return this.modifier_context; }\n  setModifierContext(c) { this.modifier_context = c; return this; }\n\n  // Get and set articulation position.\n  getPosition() { return this.position; }\n  setPosition(position) {\n    this.position = typeof(position) === 'string'\n      ? Modifier.PositionString[position]\n      : position;\n    return this;\n  }\n\n  // Set the `text_line` for the modifier.\n  setTextLine(line) { this.text_line = line; return this; }\n\n  // Shift modifier down `y` pixels. Negative values shift up.\n  setYShift(y) { this.y_shift = y; return this; }\n\n  setSpacingFromNextModifier(x) {\n    this.spacingFromNextModifier = x;\n  }\n\n  getSpacingFromNextModifier() { return this.spacingFromNextModifier; }\n\n  // Shift modifier `x` pixels in the direction of the modifier. Negative values\n  // shift reverse.\n  setXShift(x) {\n    this.x_shift = 0;\n    if (this.position === Modifier.Position.LEFT) {\n      this.x_shift -= x;\n    } else {\n      this.x_shift += x;\n    }\n  }\n  getXShift() { return this.x_shift; }\n\n  // Render the modifier onto the canvas.\n  draw() {\n    this.checkContext();\n    throw new Vex.RERR('MethodNotImplemented', 'draw() not implemented for this modifier.');\n  }\n\n  // aligns sub notes of NoteSubGroup (or GraceNoteGroup) to the main note with correct x-offset\n  alignSubNotesWithNote(subNotes, note) {\n    // Shift over the tick contexts of each note\n    const tickContext = note.getTickContext();\n    const extraPx = tickContext.getExtraPx();\n    const subNoteXOffset = tickContext.getX() - extraPx.left - extraPx.extraLeft\n      + this.getSpacingFromNextModifier();\n\n    subNotes.forEach((subNote) => {\n      const subTickContext = subNote.getTickContext();\n      subNote.setStave(note.stave);\n      subTickContext.setXOffset(subNoteXOffset); // don't touch baseX to avoid shift each render\n    });\n  }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements dot modifiers for notes.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\n\nexport class Dot extends Modifier {\n  static get CATEGORY() { return 'dots'; }\n\n  // Arrange dots inside a ModifierContext.\n  static format(dots, state) {\n    const right_shift = state.right_shift;\n    const dot_spacing = 1;\n\n    if (!dots || dots.length === 0) return false;\n\n    const dot_list = [];\n    const max_shift_map = {};\n    for (let i = 0; i < dots.length; ++i) {\n      const dot = dots[i];\n      const note = dot.getNote();\n\n      let props;\n      let shift;\n      // Only StaveNote has .getKeyProps()\n      if (typeof note.getKeyProps === 'function') {\n        props = note.getKeyProps()[dot.getIndex()];\n        shift = (props.displaced ? note.getExtraRightPx() : 0);\n      } else { // Else it's a TabNote\n        props = { line: 0.5 }; // Shim key props for dot placement\n        shift = 0;\n      }\n\n      const note_id = note.getAttribute('id');\n      dot_list.push({ line: props.line, note, note_id, dot });\n      max_shift_map[note_id] = Math.max(max_shift_map[note_id] || shift, shift);\n    }\n\n    // Sort dots by line number.\n    dot_list.sort((a, b) => b.line - a.line);\n\n    let dot_shift = right_shift;\n    let x_width = 0;\n    let last_line = null;\n    let last_note = null;\n    let prev_dotted_space = null;\n    let half_shiftY = 0;\n\n    for (let i = 0; i < dot_list.length; ++i) {\n      const { dot, note, note_id, line } = dot_list[i];\n\n      // Reset the position of the dot every line.\n      if (line !== last_line || note !== last_note) {\n        dot_shift = max_shift_map[note_id];\n      }\n\n      if (!note.isRest() && line !== last_line) {\n        if (Math.abs(line % 1) === 0.5) {\n          // note is on a space, so no dot shift\n          half_shiftY = 0;\n        } else {\n          // note is on a line, so shift dot to space above the line\n          half_shiftY = 0.5;\n          if (last_note != null &&\n              !last_note.isRest() && last_line - line === 0.5) {\n            // previous note on a space, so shift dot to space below the line\n            half_shiftY = -0.5;\n          } else if (line + half_shiftY === prev_dotted_space) {\n            // previous space is dotted, so shift dot to space below the line\n            half_shiftY = -0.5;\n          }\n        }\n      }\n\n      // convert half_shiftY to a multiplier for dots.draw()\n      if (note.isRest()) {\n        dot.dot_shiftY += -half_shiftY;\n      } else {\n        dot.dot_shiftY = -half_shiftY;\n      }\n      prev_dotted_space = line + half_shiftY;\n\n      dot.setXShift(dot_shift);\n      dot_shift += dot.getWidth() + dot_spacing; // spacing\n      x_width = (dot_shift > x_width) ? dot_shift : x_width;\n      last_line = line;\n      last_note = note;\n    }\n\n    // Update state.\n    state.right_shift += x_width;\n    return true;\n  }\n\n  /**\n   * @constructor\n   */\n  constructor() {\n    super();\n    this.setAttribute('type', 'Dot');\n\n    this.note = null;\n    this.index = null;\n    this.position = Modifier.Position.RIGHT;\n\n    this.radius = 2;\n    this.setWidth(5);\n    this.dot_shiftY = 0;\n  }\n\n  getCategory() { return Dot.CATEGORY; }\n\n  setNote(note) {\n    this.note = note;\n\n    if (this.note.getCategory() === 'gracenotes') {\n      this.radius *= 0.50;\n      this.setWidth(3);\n    }\n  }\n\n  setDotShiftY(y) { this.dot_shiftY = y; return this; }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    if (!this.note || this.index === null) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw dot without a note and index.\");\n    }\n\n    const lineSpace = this.note.stave.options.spacing_between_lines_px;\n\n    const start = this.note.getModifierStartXY(this.position, this.index,\n      { forceFlagRight: true });\n\n    // Set the starting y coordinate to the base of the stem for TabNotes\n    if (this.note.getCategory() === 'tabnotes') {\n      start.y = this.note.getStemExtents().baseY;\n    }\n\n    const x = (start.x + this.x_shift) + this.width - this.radius;\n    const y = start.y + this.y_shift + (this.dot_shiftY * lineSpace);\n    const ctx = this.context;\n\n    ctx.beginPath();\n    ctx.arc(x, y, this.radius, 0, Math.PI * 2, false);\n    ctx.fill();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements notes for standard notation. This consists of one or\n// more `NoteHeads`, an optional stem, and an optional flag.\n//\n// *Throughout these comments, a \"note\" refers to the entire `StaveNote`,\n// and a \"key\" refers to a specific pitch/notehead within a note.*\n//\n// See `tests/stavenote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { BoundingBox } from './boundingbox';\nimport { Stem } from './stem';\nimport { NoteHead } from './notehead';\nimport { StemmableNote } from './stemmablenote';\nimport { Modifier } from './modifier';\nimport { Dot } from './dot';\n\n// To enable logging for this class. Set `Vex.Flow.StaveNote.DEBUG` to `true`.\nfunction L(...args) { if (StaveNote.DEBUG) Vex.L('Vex.Flow.StaveNote', args); }\n\nconst getStemAdjustment = (note) => Stem.WIDTH / (2 * -note.getStemDirection());\n\nconst isInnerNoteIndex = (note, index) =>\n  index === (note.getStemDirection() === Stem.UP ? note.keyProps.length - 1 : 0);\n\n// Helper methods for rest positioning in ModifierContext.\nfunction shiftRestVertical(rest, note, dir) {\n  const delta = (note.isrest ? 0.0 : 1.0) * dir;\n\n  rest.line += delta;\n  rest.maxLine += delta;\n  rest.minLine += delta;\n  rest.note.setKeyLine(0, rest.note.getKeyLine(0) + (delta));\n}\n\n// Called from formatNotes :: center a rest between two notes\nfunction centerRest(rest, noteU, noteL) {\n  const delta = rest.line - Vex.MidLine(noteU.minLine, noteL.maxLine);\n  rest.note.setKeyLine(0, rest.note.getKeyLine(0) - delta);\n  rest.line -= delta;\n  rest.maxLine -= delta;\n  rest.minLine -= delta;\n}\n\nexport class StaveNote extends StemmableNote {\n  static get CATEGORY() { return 'stavenotes'; }\n  static get STEM_UP() { return Stem.UP; }\n  static get STEM_DOWN() { return Stem.DOWN; }\n  static get DEFAULT_LEDGER_LINE_OFFSET() { return 3; }\n\n  // ## Static Methods\n  //\n  // Format notes inside a ModifierContext.\n  static format(notes, state) {\n    if (!notes || notes.length < 2) return false;\n\n    // FIXME: VexFlow will soon require that a stave be set before formatting.\n    // Which, according to the below condition, means that following branch will\n    // always be taken and the rest of this function is dead code.\n    //\n    // Problematically, `Formatter#formatByY` was not designed to work for more\n    // than 2 voices (although, doesn't throw on this condition, just tries\n    // to power through).\n    //\n    // Based on the above:\n    //   * 2 voices can be formatted *with or without* a stave being set but\n    //     the output will be different\n    //   * 3 voices can only be formatted *without* a stave\n    if (notes[0].getStave()) {\n      return StaveNote.formatByY(notes, state);\n    }\n\n    const notesList = [];\n\n    for (let i = 0; i < notes.length; i++) {\n      const props = notes[i].getKeyProps();\n      const line = props[0].line;\n      let minL = props[props.length - 1].line;\n      const stemDirection = notes[i].getStemDirection();\n      const stemMax = notes[i].getStemLength() / 10;\n      const stemMin = notes[i].getStemMinumumLength() / 10;\n\n      let maxL;\n      if (notes[i].isRest()) {\n        maxL = line + notes[i].glyph.line_above;\n        minL = line - notes[i].glyph.line_below;\n      } else {\n        maxL = stemDirection === 1\n          ? props[props.length - 1].line + stemMax\n          : props[props.length - 1].line;\n\n        minL = stemDirection === 1\n          ? props[0].line\n          : props[0].line - stemMax;\n      }\n\n      notesList.push({\n        line: props[0].line, // note/rest base line\n        maxLine: maxL, // note/rest upper bounds line\n        minLine: minL, // note/rest lower bounds line\n        isrest: notes[i].isRest(),\n        stemDirection,\n        stemMax, // Maximum (default) note stem length;\n        stemMin, // minimum note stem length\n        voice_shift: notes[i].getVoiceShiftWidth(),\n        is_displaced: notes[i].isDisplaced(), // note manually displaced\n        note: notes[i],\n      });\n    }\n\n    const voices = notesList.length;\n\n    let noteU = notesList[0];\n    const noteM = voices > 2 ? notesList[1] : null;\n    let noteL = voices > 2 ? notesList[2] : notesList[1];\n\n    // for two voice backward compatibility, ensure upper voice is stems up\n    // for three voices, the voices must be in order (upper, middle, lower)\n    if (voices === 2 && noteU.stemDirection === -1 && noteL.stemDirection === 1) {\n      noteU = notesList[1];\n      noteL = notesList[0];\n    }\n\n    const voiceXShift = Math.max(noteU.voice_shift, noteL.voice_shift);\n    let xShift = 0;\n    let stemDelta;\n\n    // Test for two voice note intersection\n    if (voices === 2) {\n      const lineSpacing = noteU.stemDirection === noteL.stemDirection ? 0.0 : 0.5;\n      // if top voice is a middle voice, check stem intersection with lower voice\n      if (noteU.stemDirection === noteL.stemDirection &&\n        noteU.minLine <= noteL.maxLine) {\n        if (!noteU.isrest) {\n          stemDelta = Math.abs(noteU.line - (noteL.maxLine + 0.5));\n          stemDelta = Math.max(stemDelta, noteU.stemMin);\n          noteU.minLine = noteU.line - stemDelta;\n          noteU.note.setStemLength(stemDelta * 10);\n        }\n      }\n      if (noteU.minLine <= noteL.maxLine + lineSpacing) {\n        if (noteU.isrest) {\n          // shift rest up\n          shiftRestVertical(noteU, noteL, 1);\n        } else if (noteL.isrest) {\n          // shift rest down\n          shiftRestVertical(noteL, noteU, -1);\n        } else {\n          xShift = voiceXShift;\n          if (noteU.stemDirection === noteL.stemDirection) {\n            // upper voice is middle voice, so shift it right\n            noteU.note.setXShift(xShift + 3);\n          } else {\n            // shift lower voice right\n            noteL.note.setXShift(xShift);\n          }\n        }\n      }\n\n      // format complete\n      return true;\n    }\n\n    // Check middle voice stem intersection with lower voice\n    if (noteM !== null && noteM.minLine < noteL.maxLine + 0.5) {\n      if (!noteM.isrest) {\n        stemDelta = Math.abs(noteM.line - (noteL.maxLine + 0.5));\n        stemDelta = Math.max(stemDelta, noteM.stemMin);\n        noteM.minLine = noteM.line - stemDelta;\n        noteM.note.setStemLength(stemDelta * 10);\n      }\n    }\n\n    // For three voices, test if rests can be repositioned\n    //\n    // Special case 1 :: middle voice rest between two notes\n    //\n    if (noteM.isrest && !noteU.isrest && !noteL.isrest) {\n      if (noteU.minLine <= noteM.maxLine || noteM.minLine <= noteL.maxLine) {\n        const restHeight = noteM.maxLine - noteM.minLine;\n        const space = noteU.minLine - noteL.maxLine;\n        if (restHeight < space) {\n          // center middle voice rest between the upper and lower voices\n          centerRest(noteM, noteU, noteL);\n        } else {\n          xShift = voiceXShift + 3;    // shift middle rest right\n          noteM.note.setXShift(xShift);\n        }\n        // format complete\n        return true;\n      }\n    }\n\n    // Special case 2 :: all voices are rests\n    if (noteU.isrest && noteM.isrest && noteL.isrest) {\n      // Shift upper voice rest up\n      shiftRestVertical(noteU, noteM, 1);\n      // Shift lower voice rest down\n      shiftRestVertical(noteL, noteM, -1);\n      // format complete\n      return true;\n    }\n\n    // Test if any other rests can be repositioned\n    if (noteM.isrest && noteU.isrest && noteM.minLine <= noteL.maxLine) {\n      // Shift middle voice rest up\n      shiftRestVertical(noteM, noteL, 1);\n    }\n    if (noteM.isrest && noteL.isrest && noteU.minLine <= noteM.maxLine) {\n      // Shift middle voice rest down\n      shiftRestVertical(noteM, noteU, -1);\n    }\n    if (noteU.isrest && noteU.minLine <= noteM.maxLine) {\n      // shift upper voice rest up;\n      shiftRestVertical(noteU, noteM, 1);\n    }\n    if (noteL.isrest && noteM.minLine <= noteL.maxLine) {\n      // shift lower voice rest down\n      shiftRestVertical(noteL, noteM, -1);\n    }\n\n    // If middle voice intersects upper or lower voice\n    if ((!noteU.isrest && !noteM.isrest && noteU.minLine <= noteM.maxLine + 0.5) ||\n      (!noteM.isrest && !noteL.isrest && noteM.minLine <= noteL.maxLine)) {\n      xShift = voiceXShift + 3;      // shift middle note right\n      noteM.note.setXShift(xShift);\n    }\n\n    return true;\n  }\n\n  static formatByY(notes, state) {\n    // NOTE: this function does not support more than two voices per stave\n    // use with care.\n    let hasStave = true;\n\n    for (let i = 0; i < notes.length; i++) {\n      hasStave = hasStave && notes[i].getStave() != null;\n    }\n\n    if (!hasStave) {\n      throw new Vex.RERR(\n        'Stave Missing',\n        'All notes must have a stave - Vex.Flow.ModifierContext.formatMultiVoice!'\n      );\n    }\n\n    let xShift = 0;\n\n    for (let i = 0; i < notes.length - 1; i++) {\n      let topNote = notes[i];\n      let bottomNote = notes[i + 1];\n\n      if (topNote.getStemDirection() === Stem.DOWN) {\n        topNote = notes[i + 1];\n        bottomNote = notes[i];\n      }\n\n      const topKeys = topNote.getKeyProps();\n      const bottomKeys = bottomNote.getKeyProps();\n\n      const HALF_NOTEHEAD_HEIGHT = 0.5;\n\n      // `keyProps` and `stave.getYForLine` have different notions of a `line`\n      // so we have to convert the keyProps value by subtracting 5.\n      // See https://github.com/0xfe/vexflow/wiki/Development-Gotchas\n      //\n      // We also extend the y for each note by a half notehead because the\n      // notehead's origin is centered\n      const topNoteBottomY = topNote\n        .getStave()\n        .getYForLine(5 - topKeys[0].line + HALF_NOTEHEAD_HEIGHT);\n\n      const bottomNoteTopY = bottomNote\n        .getStave()\n        .getYForLine(5 - bottomKeys[bottomKeys.length - 1].line - HALF_NOTEHEAD_HEIGHT);\n\n      const areNotesColliding = bottomNoteTopY - topNoteBottomY < 0;\n\n      if (areNotesColliding) {\n        xShift = topNote.getVoiceShiftWidth() + 2;\n        bottomNote.setXShift(xShift);\n      }\n    }\n\n    state.right_shift += xShift;\n  }\n\n  static postFormat(notes) {\n    if (!notes) return false;\n\n    notes.forEach(note => note.postFormat());\n\n    return true;\n  }\n\n  constructor(noteStruct) {\n    super(noteStruct);\n    this.setAttribute('type', 'StaveNote');\n\n    this.keys = noteStruct.keys;\n    this.clef = noteStruct.clef;\n    this.octave_shift = noteStruct.octave_shift;\n    this.beam = null;\n\n    // Pull note rendering properties\n    this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n\n    if (!this.glyph) {\n      throw new Vex.RuntimeError(\n        'BadArguments',\n        `Invalid note initialization data (No glyph found): ${JSON.stringify(noteStruct)}`\n      );\n    }\n\n    // if true, displace note to right\n    this.displaced = false;\n    this.dot_shiftY = 0;\n    // per-pitch properties\n    this.keyProps = [];\n    // for displaced ledger lines\n    this.use_default_head_x = false;\n\n    // Drawing\n    this.note_heads = [];\n    this.modifiers = [];\n\n    Vex.Merge(this.render_options, {\n      // font size for note heads and rests\n      glyph_font_scale: noteStruct.glyph_font_scale || Flow.DEFAULT_NOTATION_FONT_SCALE,\n      // number of stroke px to the left and right of head\n      stroke_px: noteStruct.stroke_px || StaveNote.DEFAULT_LEDGER_LINE_OFFSET,\n    });\n\n    this.calculateKeyProps();\n    this.buildStem();\n\n    // Set the stem direction\n    if (noteStruct.auto_stem) {\n      this.autoStem();\n    } else {\n      this.setStemDirection(noteStruct.stem_direction);\n    }\n    this.reset();\n    this.buildFlag();\n  }\n\n  reset() {\n    super.reset();\n\n    // Save prior noteHead styles & reapply them after making new noteheads.\n    const noteHeadStyles = this.note_heads.map(noteHead => noteHead.getStyle());\n    this.buildNoteHeads();\n    this.note_heads.forEach((noteHead, index) => noteHead.setStyle(noteHeadStyles[index]));\n\n    if (this.stave) {\n      this.note_heads.forEach(head => head.setStave(this.stave));\n    }\n    this.calcExtraPx();\n  }\n\n  setBeam(beam) {\n    this.beam = beam;\n    this.calcExtraPx();\n    return this;\n  }\n\n  getCategory() { return StaveNote.CATEGORY; }\n\n  // Builds a `Stem` for the note\n  buildStem() {\n    this.setStem(new Stem({ hide: !!this.isRest(), }));\n  }\n\n  // Builds a `NoteHead` for each key in the note\n  buildNoteHeads() {\n    this.note_heads = [];\n    const stemDirection = this.getStemDirection();\n    const keys = this.getKeys();\n\n    let lastLine = null;\n    let lineDiff = null;\n    let displaced = false;\n\n    // Draw notes from bottom to top.\n\n    // For down-stem notes, we draw from top to bottom.\n    let start;\n    let end;\n    let step;\n    if (stemDirection === Stem.UP) {\n      start = 0;\n      end = keys.length;\n      step = 1;\n    } else if (stemDirection === Stem.DOWN) {\n      start = keys.length - 1;\n      end = -1;\n      step = -1;\n    }\n\n    for (let i = start; i !== end; i += step) {\n      const noteProps = this.keyProps[i];\n      const line = noteProps.line;\n\n      // Keep track of last line with a note head, so that consecutive heads\n      // are correctly displaced.\n      if (lastLine === null) {\n        lastLine = line;\n      } else {\n        lineDiff = Math.abs(lastLine - line);\n        if (lineDiff === 0 || lineDiff === 0.5) {\n          displaced = !displaced;\n        } else {\n          displaced = false;\n          this.use_default_head_x = true;\n        }\n      }\n      lastLine = line;\n\n      const notehead = new NoteHead({\n        duration: this.duration,\n        note_type: this.noteType,\n        displaced,\n        stem_direction: stemDirection,\n        custom_glyph_code: noteProps.code,\n        glyph_font_scale: this.render_options.glyph_font_scale,\n        x_shift: noteProps.shift_right,\n        stem_up_x_offset: noteProps.stem_up_x_offset,\n        stem_down_x_offset: noteProps.stem_down_x_offset,\n        line: noteProps.line,\n      });\n\n      this.note_heads[i] = notehead;\n    }\n  }\n\n  // Automatically sets the stem direction based on the keys in the note\n  autoStem() {\n    // Figure out optimal stem direction based on given notes\n    this.minLine = this.keyProps[0].line;\n    this.maxLine = this.keyProps[this.keyProps.length - 1].line;\n\n    const MIDDLE_LINE = 3;\n    const decider = (this.minLine + this.maxLine) / 2;\n    const stemDirection = decider < MIDDLE_LINE ? Stem.UP : Stem.DOWN;\n\n    this.setStemDirection(stemDirection);\n  }\n\n  // Calculates and stores the properties for each key in the note\n  calculateKeyProps() {\n    let lastLine = null;\n    for (let i = 0; i < this.keys.length; ++i) {\n      const key = this.keys[i];\n\n      // All rests use the same position on the line.\n      // if (this.glyph.rest) key = this.glyph.position;\n      if (this.glyph.rest) this.glyph.position = key;\n\n      const options = { octave_shift: this.octave_shift || 0 };\n      const props = Flow.keyProperties(key, this.clef, options);\n\n      if (!props) {\n        throw new Vex.RuntimeError('BadArguments', `Invalid key for note properties: ${key}`);\n      }\n\n      // Override line placement for default rests\n      if (props.key === 'R') {\n        if (this.duration === '1' || this.duration === 'w') {\n          props.line = 4;\n        } else {\n          props.line = 3;\n        }\n      }\n\n      // Calculate displacement of this note\n      const line = props.line;\n      if (lastLine === null) {\n        lastLine = line;\n      } else {\n        if (Math.abs(lastLine - line) === 0.5) {\n          this.displaced = true;\n          props.displaced = true;\n\n          // Have to mark the previous note as\n          // displaced as well, for modifier placement\n          if (this.keyProps.length > 0) {\n            this.keyProps[i - 1].displaced = true;\n          }\n        }\n      }\n\n      lastLine = line;\n      this.keyProps.push(props);\n    }\n\n    // Sort the notes from lowest line to highest line\n    lastLine = -Infinity;\n    this.keyProps.forEach(key => {\n      if (key.line < lastLine) {\n        Vex.W(\n          'Unsorted keys in note will be sorted. ' +\n          'See https://github.com/0xfe/vexflow/issues/104 for details.'\n        );\n      }\n      lastLine = key.line;\n    });\n    this.keyProps.sort((a, b) => a.line - b.line);\n  }\n\n  // Get the `BoundingBox` for the entire note\n  getBoundingBox() {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call getBoundingBox on an unformatted note.\");\n    }\n\n    const { width: w, modLeftPx, extraLeftPx } = this.getMetrics();\n    const x = this.getAbsoluteX() - modLeftPx - extraLeftPx;\n\n    let minY = 0;\n    let maxY = 0;\n    const halfLineSpacing = this.getStave().getSpacingBetweenLines() / 2;\n    const lineSpacing = halfLineSpacing * 2;\n\n    if (this.isRest()) {\n      const y = this.ys[0];\n      const frac = Flow.durationToFraction(this.duration);\n      if (frac.equals(1) || frac.equals(2)) {\n        minY = y - halfLineSpacing;\n        maxY = y + halfLineSpacing;\n      } else {\n        minY = y - (this.glyph.line_above * lineSpacing);\n        maxY = y + (this.glyph.line_below * lineSpacing);\n      }\n    } else if (this.glyph.stem) {\n      const ys = this.getStemExtents();\n      ys.baseY += halfLineSpacing * this.stem_direction;\n      minY = Math.min(ys.topY, ys.baseY);\n      maxY = Math.max(ys.topY, ys.baseY);\n    } else {\n      minY = null;\n      maxY = null;\n\n      for (let i = 0; i < this.ys.length; ++i) {\n        const yy = this.ys[i];\n        if (i === 0) {\n          minY = yy;\n          maxY = yy;\n        } else {\n          minY = Math.min(yy, minY);\n          maxY = Math.max(yy, maxY);\n        }\n      }\n      minY -= halfLineSpacing;\n      maxY += halfLineSpacing;\n    }\n\n    return new BoundingBox(x, minY, w, maxY - minY);\n  }\n\n  // Gets the line number of the top or bottom note in the chord.\n  // If `isTopNote` is `true` then get the top note\n  getLineNumber(isTopNote) {\n    if (!this.keyProps.length) {\n      throw new Vex.RERR(\n        'NoKeyProps', \"Can't get bottom note line, because note is not initialized properly.\"\n      );\n    }\n\n    let resultLine = this.keyProps[0].line;\n\n    // No precondition assumed for sortedness of keyProps array\n    for (let i = 0; i < this.keyProps.length; i++) {\n      const thisLine = this.keyProps[i].line;\n      if (isTopNote) {\n        if (thisLine > resultLine) resultLine = thisLine;\n      } else {\n        if (thisLine < resultLine) resultLine = thisLine;\n      }\n    }\n\n    return resultLine;\n  }\n\n  // Determine if current note is a rest\n  isRest() { return this.glyph.rest; }\n\n  // Determine if the current note is a chord\n  isChord() { return !this.isRest() && this.keys.length > 1; }\n\n  // Determine if the `StaveNote` has a stem\n  hasStem() { return this.glyph.stem; }\n\n  hasFlag() {\n    return super.hasFlag() && !this.isRest();\n  }\n\n  getStemX() {\n    if (this.noteType === 'r') {\n      return this.getCenterGlyphX();\n    } else {\n      // We adjust the origin of the stem because we want the stem left-aligned\n      // with the notehead if stemmed-down, and right-aligned if stemmed-up\n      return super.getStemX() + getStemAdjustment(this);\n    }\n  }\n\n  // Get the `y` coordinate for text placed on the top/bottom of a\n  // note at a desired `text_line`\n  getYForTopText(textLine) {\n    const extents = this.getStemExtents();\n    return Math.min(\n      this.stave.getYForTopText(textLine),\n      extents.topY - (this.render_options.annotation_spacing * (textLine + 1))\n    );\n  }\n  getYForBottomText(textLine) {\n    const extents = this.getStemExtents();\n    return Math.max(\n      this.stave.getYForTopText(textLine),\n      extents.baseY + (this.render_options.annotation_spacing * (textLine))\n    );\n  }\n\n  // Sets the current note to the provided `stave`. This applies\n  // `y` values to the `NoteHeads`.\n  setStave(stave) {\n    super.setStave(stave);\n\n    const ys = this.note_heads.map(notehead => {\n      notehead.setStave(stave);\n      return notehead.getY();\n    });\n\n    this.setYs(ys);\n\n    if (this.stem) {\n      const { y_top, y_bottom } = this.getNoteHeadBounds();\n      this.stem.setYBounds(y_top, y_bottom);\n    }\n\n    return this;\n  }\n\n  // Get the pitches in the note\n  getKeys() { return this.keys; }\n\n  // Get the properties for all the keys in the note\n  getKeyProps() {\n    return this.keyProps;\n  }\n\n  // Check if note is shifted to the right\n  isDisplaced() {\n    return this.displaced;\n  }\n\n  // Sets whether shift note to the right. `displaced` is a `boolean`\n  setNoteDisplaced(displaced) {\n    this.displaced = displaced;\n    return this;\n  }\n\n  // Get the starting `x` coordinate for a `StaveTie`\n  getTieRightX() {\n    let tieStartX = this.getAbsoluteX();\n    tieStartX += this.getGlyphWidth() + this.x_shift + this.extraRightPx;\n    if (this.modifierContext) tieStartX += this.modifierContext.getExtraRightPx();\n    return tieStartX;\n  }\n\n  // Get the ending `x` coordinate for a `StaveTie`\n  getTieLeftX() {\n    let tieEndX = this.getAbsoluteX();\n    tieEndX += this.x_shift - this.extraLeftPx;\n    return tieEndX;\n  }\n\n  // Get the stave line on which to place a rest\n  getLineForRest() {\n    let restLine = this.keyProps[0].line;\n    if (this.keyProps.length > 1) {\n      const lastLine = this.keyProps[this.keyProps.length - 1].line;\n      const top = Math.max(restLine, lastLine);\n      const bot = Math.min(restLine, lastLine);\n      restLine = Vex.MidLine(top, bot);\n    }\n\n    return restLine;\n  }\n\n  // Get the default `x` and `y` coordinates for the provided `position`\n  // and key `index`\n  getModifierStartXY(position, index, options) {\n    options = options || {};\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n    }\n\n    if (this.ys.length === 0) {\n      throw new Vex.RERR('NoYValues', 'No Y-Values calculated for this note.');\n    }\n\n    const { ABOVE, BELOW, LEFT, RIGHT } = Modifier.Position;\n    let x = 0;\n    if (position === LEFT) {\n      // extra_left_px\n      // FIXME: What are these magic numbers?\n      x = -1 * 2;\n    } else if (position === RIGHT) {\n      // extra_right_px\n      // FIXME: What is this magical +2?\n      x = this.getGlyphWidth() + this.x_shift + 2;\n\n      if (this.stem_direction === Stem.UP && this.hasFlag() &&\n        (options.forceFlagRight || isInnerNoteIndex(this, index))) {\n        x += this.flag.getMetrics().width;\n      }\n    } else if (position === BELOW || position === ABOVE) {\n      x = this.getGlyphWidth() / 2;\n    }\n\n    return {\n      x: this.getAbsoluteX() + x,\n      y: this.ys[index],\n    };\n  }\n\n  // Sets the style of the complete StaveNote, including all keys\n  // and the stem.\n  setStyle(style) {\n    super.setStyle(style);\n    this.note_heads.forEach(notehead => notehead.setStyle(style));\n    this.stem.setStyle(style);\n  }\n\n  setStemStyle(style) {\n    const stem = this.getStem();\n    stem.setStyle(style);\n  }\n  getStemStyle() { return this.stem.getStyle(); }\n\n  setLedgerLineStyle(style) { this.ledgerLineStyle = style; }\n  getLedgerLineStyle() { return this.ledgerLineStyle; }\n\n  setFlagStyle(style) { this.flagStyle = style; }\n  getFlagStyle() { return this.flagStyle; }\n\n  // Sets the notehead at `index` to the provided coloring `style`.\n  //\n  // `style` is an `object` with the following properties: `shadowColor`,\n  // `shadowBlur`, `fillStyle`, `strokeStyle`\n  setKeyStyle(index, style) {\n    this.note_heads[index].setStyle(style);\n    return this;\n  }\n\n  setKeyLine(index, line) {\n    this.keyProps[index].line = line;\n    this.reset();\n    return this;\n  }\n\n  getKeyLine(index) {\n    return this.keyProps[index].line;\n  }\n\n  // Add self to modifier context. `mContext` is the `ModifierContext`\n  // to be added to.\n  addToModifierContext(mContext) {\n    this.setModifierContext(mContext);\n    for (let i = 0; i < this.modifiers.length; ++i) {\n      this.modifierContext.addModifier(this.modifiers[i]);\n    }\n    this.modifierContext.addModifier(this);\n    this.setPreFormatted(false);\n    return this;\n  }\n\n  // Generic function to add modifiers to a note\n  //\n  // Parameters:\n  // * `index`: The index of the key that we're modifying\n  // * `modifier`: The modifier to add\n  addModifier(index, modifier) {\n    modifier.setNote(this);\n    modifier.setIndex(index);\n    this.modifiers.push(modifier);\n    this.setPreFormatted(false);\n    return this;\n  }\n\n  // Helper function to add an accidental to a key\n  addAccidental(index, accidental) {\n    return this.addModifier(index, accidental);\n  }\n\n  // Helper function to add an articulation to a key\n  addArticulation(index, articulation) {\n    return this.addModifier(index, articulation);\n  }\n\n  // Helper function to add an annotation to a key\n  addAnnotation(index, annotation) {\n    return this.addModifier(index, annotation);\n  }\n\n  // Helper function to add a dot on a specific key\n  addDot(index) {\n    const dot = new Dot();\n    dot.setDotShiftY(this.glyph.dot_shiftY);\n    this.dots++;\n    return this.addModifier(index, dot);\n  }\n\n  // Convenience method to add dot to all keys in note\n  addDotToAll() {\n    for (let i = 0; i < this.keys.length; ++i) {\n      this.addDot(i);\n    }\n    return this;\n  }\n\n  // Get all accidentals in the `ModifierContext`\n  getAccidentals() {\n    return this.modifierContext.getModifiers('accidentals');\n  }\n\n  // Get all dots in the `ModifierContext`\n  getDots() {\n    return this.modifierContext.getModifiers('dots');\n  }\n\n  // Get the width of the note if it is displaced. Used for `Voice`\n  // formatting\n  getVoiceShiftWidth() {\n    // TODO: may need to accomodate for dot here.\n    return this.getGlyphWidth() * (this.displaced ? 2 : 1);\n  }\n\n  // Calculates and sets the extra pixels to the left or right\n  // if the note is displaced.\n  calcExtraPx() {\n    this.setExtraLeftPx(\n      this.displaced && this.stem_direction === Stem.DOWN\n        ? this.getGlyphWidth()\n        : 0\n    );\n\n    // For upstems with flags, the extra space is unnecessary, since it's taken\n    // up by the flag.\n    this.setExtraRightPx(\n      !this.hasFlag() && this.displaced && this.stem_direction === Stem.UP\n        ? this.getGlyphWidth()\n        : 0\n    );\n  }\n\n  // Pre-render formatting\n  preFormat() {\n    if (this.preFormatted) return;\n    if (this.modifierContext) this.modifierContext.preFormat();\n\n    let width = this.getGlyphWidth() + this.extraLeftPx + this.extraRightPx;\n\n    // For upward flagged notes, the width of the flag needs to be added\n    if (this.glyph.flag && this.beam === null && this.stem_direction === Stem.UP) {\n      width += this.getGlyphWidth();\n    }\n\n    this.setWidth(width);\n    this.setPreFormatted(true);\n  }\n\n  /**\n   * @typedef {Object} noteHeadBounds\n   * @property {number} y_top the highest notehead bound\n   * @property {number} y_bottom the lowest notehead bound\n   * @property {number|Null} displaced_x the starting x for displaced noteheads\n   * @property {number|Null} non_displaced_x the starting x for non-displaced noteheads\n   * @property {number} highest_line the highest notehead line in traditional music line\n   *  numbering (bottom line = 1, top line = 5)\n   * @property {number} lowest_line the lowest notehead line\n   * @property {number|false} highest_displaced_line the highest staff line number\n   *   for a displaced notehead\n   * @property {number|false} lowest_displaced_line\n   * @property {number} highest_non_displaced_line\n   * @property {number} lowest_non_displaced_line\n   */\n\n  /**\n   * Get the staff line and y value for the highest & lowest noteheads\n   * @returns {noteHeadBounds}\n   */\n  getNoteHeadBounds() {\n    // Top and bottom Y values for stem.\n    let yTop = null;\n    let yBottom = null;\n    let nonDisplacedX = null;\n    let displacedX = null;\n\n    let highestLine = this.stave.getNumLines();\n    let lowestLine = 1;\n    let highestDisplacedLine = false;\n    let lowestDisplacedLine = false;\n    let highestNonDisplacedLine = highestLine;\n    let lowestNonDisplacedLine = lowestLine;\n\n    this.note_heads.forEach(notehead => {\n      const line = notehead.getLine();\n      const y = notehead.getY();\n\n      if (yTop === null || y < yTop) {\n        yTop = y;\n      }\n\n      if (yBottom === null || y > yBottom) {\n        yBottom = y;\n      }\n\n      if (displacedX === null && notehead.isDisplaced()) {\n        displacedX = notehead.getAbsoluteX();\n      }\n\n      if (nonDisplacedX === null && !notehead.isDisplaced()) {\n        nonDisplacedX = notehead.getAbsoluteX();\n      }\n\n      highestLine = line > highestLine ? line : highestLine;\n      lowestLine = line < lowestLine ? line : lowestLine;\n\n      if (notehead.isDisplaced()) {\n        highestDisplacedLine = (highestDisplacedLine === false) ?\n          line : Math.max(line, highestDisplacedLine);\n        lowestDisplacedLine = (lowestDisplacedLine === false) ?\n          line : Math.min(line, lowestDisplacedLine);\n      } else {\n        highestNonDisplacedLine = Math.max(line, highestNonDisplacedLine);\n        lowestNonDisplacedLine = Math.min(line, lowestNonDisplacedLine);\n      }\n    }, this);\n\n    return {\n      y_top: yTop,\n      y_bottom: yBottom,\n      displaced_x: displacedX,\n      non_displaced_x: nonDisplacedX,\n      highest_line: highestLine,\n      lowest_line: lowestLine,\n      highest_displaced_line: highestDisplacedLine,\n      lowest_displaced_line: lowestDisplacedLine,\n      highest_non_displaced_line: highestNonDisplacedLine,\n      lowest_non_displaced_line: lowestNonDisplacedLine,\n    };\n  }\n\n  // Get the starting `x` coordinate for the noteheads\n  getNoteHeadBeginX() {\n    return this.getAbsoluteX() + this.x_shift;\n  }\n\n  // Get the ending `x` coordinate for the noteheads\n  getNoteHeadEndX() {\n    const xBegin = this.getNoteHeadBeginX();\n    return xBegin + this.getGlyphWidth();\n  }\n\n  // Draw the ledger lines between the stave and the highest/lowest keys\n  drawLedgerLines() {\n    const {\n      stave, glyph,\n      render_options: { stroke_px },\n      context: ctx,\n    } = this;\n\n    const width = glyph.getWidth() + (stroke_px * 2);\n    const doubleWidth = 2 * (glyph.getWidth() + stroke_px) - (Stem.WIDTH / 2);\n\n    if (this.isRest()) return;\n    if (!ctx) {\n      throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n    }\n\n    const {\n      highest_line,\n      lowest_line,\n      highest_displaced_line,\n      highest_non_displaced_line,\n      lowest_displaced_line,\n      lowest_non_displaced_line,\n      displaced_x,\n      non_displaced_x,\n    } = this.getNoteHeadBounds();\n\n    const min_x = Math.min(displaced_x, non_displaced_x);\n\n    const drawLedgerLine = (y, normal, displaced) => {\n      let x;\n      if (displaced && normal) x = min_x - stroke_px;\n      else if (normal) x = non_displaced_x - stroke_px;\n      else x = displaced_x - stroke_px;\n      const ledgerWidth = (normal && displaced) ? doubleWidth : width;\n\n      ctx.beginPath();\n      ctx.moveTo(x, y);\n      ctx.lineTo(x + ledgerWidth, y);\n      ctx.stroke();\n    };\n\n    const style = { ...stave.getStyle() || {}, ...this.getLedgerLineStyle() || {} };\n    this.applyStyle(ctx, style);\n\n    // Draw ledger lines below the staff:\n    for (let line = 6; line <= highest_line; ++line) {\n      const normal = (non_displaced_x !== null) && (line <= highest_non_displaced_line);\n      const displaced = (displaced_x !== null) && (line <= highest_displaced_line);\n      drawLedgerLine(stave.getYForNote(line), normal, displaced);\n    }\n\n    // Draw ledger lines above the staff:\n    for (let line = 0; line >= lowest_line; --line) {\n      const normal = (non_displaced_x !== null) && (line >= lowest_non_displaced_line);\n      const displaced = (displaced_x !== null) && (line >= lowest_displaced_line);\n      drawLedgerLine(stave.getYForNote(line), normal, displaced);\n    }\n\n    this.restoreStyle(ctx, style);\n  }\n\n  // Draw all key modifiers\n  drawModifiers() {\n    if (!this.context) {\n      throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n    }\n\n    const ctx = this.context;\n    ctx.openGroup('modifiers');\n    for (let i = 0; i < this.modifiers.length; i++) {\n      const modifier = this.modifiers[i];\n      const notehead = this.note_heads[modifier.getIndex()];\n      const noteheadStyle = notehead.getStyle();\n      notehead.applyStyle(ctx, noteheadStyle);\n      modifier.setContext(ctx);\n      modifier.drawWithStyle();\n      notehead.restoreStyle(ctx, noteheadStyle);\n    }\n    ctx.closeGroup();\n  }\n\n  // Draw the flag for the note\n  drawFlag() {\n    const { stem, beam, context: ctx } = this;\n\n    if (!ctx) {\n      throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n    }\n\n    const shouldRenderFlag = beam === null;\n    const glyph = this.getGlyph();\n\n    if (glyph.flag && shouldRenderFlag) {\n      const { y_top, y_bottom } = this.getNoteHeadBounds();\n      const noteStemHeight = stem.getHeight();\n      const flagX = this.getStemX();\n      // FIXME: What's with the magic +/- 2\n      const flagY = this.getStemDirection() === Stem.DOWN\n        // Down stems have flags on the left\n        ? y_top - noteStemHeight + 2\n        // Up stems have flags on the eft.\n        : y_bottom - noteStemHeight - 2;\n\n      // Draw the Flag\n      ctx.openGroup('flag', null, { pointerBBox: true });\n      this.applyStyle(ctx, this.getFlagStyle() || false);\n      this.flag.render(ctx, flagX, flagY);\n      this.restoreStyle(ctx, this.getFlagStyle() || false);\n      ctx.closeGroup();\n    }\n  }\n\n  // Draw the NoteHeads\n  drawNoteHeads() {\n    this.note_heads.forEach(notehead => {\n      this.context.openGroup('notehead', null, { pointerBBox: true });\n      notehead.setContext(this.context).draw();\n      this.context.closeGroup();\n    });\n  }\n\n  drawStem(stemStruct) {\n    // GCR TODO: I can't find any context in which this is called with the stemStruct\n    // argument in the codebase or tests. Nor can I find a case where super.drawStem\n    // is called at all. Perhaps these should be removed?\n    if (!this.context) {\n      throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n    }\n\n    if (stemStruct) {\n      this.setStem(new Stem(stemStruct));\n    }\n\n    this.context.openGroup('stem', null, { pointerBBox: true });\n    this.stem.setContext(this.context).draw();\n    this.context.closeGroup();\n  }\n\n  // Draws all the `StaveNote` parts. This is the main drawing method.\n  draw() {\n    if (!this.context) {\n      throw new Vex.RERR('NoCanvasContext', \"Can't draw without a canvas context.\");\n    }\n    if (!this.stave) {\n      throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n    }\n    if (this.ys.length === 0) {\n      throw new Vex.RERR('NoYValues', \"Can't draw note without Y values.\");\n    }\n\n    const xBegin = this.getNoteHeadBeginX();\n    const shouldRenderStem = this.hasStem() && !this.beam;\n\n    // Format note head x positions\n    this.note_heads.forEach(notehead => notehead.setX(xBegin));\n\n    // Format stem x positions\n    const stemX = this.getStemX();\n    this.stem.setNoteHeadXBounds(stemX, stemX);\n\n    L('Rendering ', this.isChord() ? 'chord :' : 'note :', this.keys);\n\n    // Draw each part of the note\n    this.drawLedgerLines();\n\n    // Apply the overall style -- may be contradicted by local settings:\n    this.applyStyle();\n    this.setAttribute('el', this.context.openGroup('stavenote', this.getAttribute('id')));\n    this.context.openGroup('note', null, { pointerBBox: true });\n    if (shouldRenderStem) this.drawStem();\n    this.drawNoteHeads();\n    this.drawFlag();\n    this.context.closeGroup();\n    this.drawModifiers();\n    this.context.closeGroup();\n    this.restoreStyle();\n    this.setRendered();\n  }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n// Author Larry Kuhns 2013\n// Class to draws string numbers into the notation.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\n\n/**\n * @constructor\n */\nexport class FretHandFinger extends Modifier {\n  static get CATEGORY() { return 'frethandfinger'; }\n\n  // Arrange fingerings inside a ModifierContext.\n  static format(nums, state) {\n    const { left_shift, right_shift } = state;\n    const num_spacing = 1;\n\n    if (!nums || nums.length === 0) return false;\n\n    const nums_list = [];\n    let prev_note = null;\n    let shiftLeft = 0;\n    let shiftRight = 0;\n\n    for (let i = 0; i < nums.length; ++i) {\n      const num = nums[i];\n      const note = num.getNote();\n      const pos = num.getPosition();\n      const props = note.getKeyProps()[num.getIndex()];\n      if (note !== prev_note) {\n        for (let n = 0; n < note.keys.length; ++n) {\n          const props_tmp = note.getKeyProps()[n];\n          if (left_shift === 0) {\n            shiftLeft = props_tmp.displaced ? note.getExtraLeftPx() : shiftLeft;\n          }\n          if (right_shift === 0) {\n            shiftRight = props_tmp.displaced ? note.getExtraRightPx() : shiftRight;\n          }\n        }\n        prev_note = note;\n      }\n\n      nums_list.push({\n        note,\n        num,\n        pos,\n        line: props.line,\n        shiftL: shiftLeft,\n        shiftR: shiftRight,\n      });\n    }\n\n    // Sort fingernumbers by line number.\n    nums_list.sort((a, b) => b.line - a.line);\n\n    let numShiftL = 0;\n    let numShiftR = 0;\n    let xWidthL = 0;\n    let xWidthR = 0;\n    let lastLine = null;\n    let lastNote = null;\n\n    for (let i = 0; i < nums_list.length; ++i) {\n      let num_shift = 0;\n      const { note, pos, num, line, shiftL, shiftR } = nums_list[i];\n\n      // Reset the position of the string number every line.\n      if (line !== lastLine || note !== lastNote) {\n        numShiftL = left_shift + shiftL;\n        numShiftR = right_shift + shiftR;\n      }\n\n      const numWidth = num.getWidth() + num_spacing;\n      if (pos === Modifier.Position.LEFT) {\n        num.setXShift(left_shift + numShiftL);\n        num_shift = left_shift + numWidth; // spacing\n        xWidthL = num_shift > xWidthL ? num_shift : xWidthL;\n      } else if (pos === Modifier.Position.RIGHT) {\n        num.setXShift(numShiftR);\n        num_shift = shiftRight + numWidth; // spacing\n        xWidthR = num_shift > xWidthR ? num_shift : xWidthR;\n      }\n      lastLine = line;\n      lastNote = note;\n    }\n\n    state.left_shift += xWidthL;\n    state.right_shift += xWidthR;\n\n    return true;\n  }\n\n  constructor(number) {\n    super();\n    this.setAttribute('type', 'FretHandFinger');\n\n    this.note = null;\n    this.index = null;\n    this.finger = number;\n    this.width = 7;\n    this.position = Modifier.Position.LEFT;  // Default position above stem or note head\n    this.x_shift = 0;\n    this.y_shift = 0;\n    this.x_offset = 0;       // Horizontal offset from default\n    this.y_offset = 0;       // Vertical offset from default\n    this.font = {\n      family: 'sans-serif',\n      size: 9,\n      weight: 'bold',\n    };\n  }\n  getCategory() { return FretHandFinger.CATEGORY; }\n  setFretHandFinger(number) { this.finger = number; return this; }\n  setOffsetX(x) { this.x_offset = x; return this; }\n  setOffsetY(y) { this.y_offset = y; return this; }\n\n  draw() {\n    this.checkContext();\n\n    if (!this.note || this.index == null) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw string number without a note and index.\");\n    }\n\n    this.setRendered();\n    const ctx = this.context;\n    const start = this.note.getModifierStartXY(this.position, this.index);\n    let dot_x = start.x + this.x_shift + this.x_offset;\n    let dot_y = start.y + this.y_shift + this.y_offset + 5;\n\n    switch (this.position) {\n      case Modifier.Position.ABOVE:\n        dot_x -= 4;\n        dot_y -= 12;\n        break;\n      case Modifier.Position.BELOW:\n        dot_x -= 2;\n        dot_y += 10;\n        break;\n      case Modifier.Position.LEFT:\n        dot_x -= this.width;\n        break;\n      case Modifier.Position.RIGHT:\n        dot_x += 1;\n        break;\n      default:\n        throw new Vex.RERR('InvalidPostion', `The position ${this.position} does not exist`);\n    }\n\n    ctx.save();\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    ctx.fillText('' + this.finger, dot_x, dot_y);\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements some standard music theory routines.\n\nimport { Vex } from './vex';\n\nexport class Music {\n  static get NUM_TONES() {\n    return 12;\n  }\n\n  static get roots() {\n    return ['c', 'd', 'e', 'f', 'g', 'a', 'b'];\n  }\n\n  static get root_values() {\n    return [0, 2, 4, 5, 7, 9, 11];\n  }\n\n  static get root_indices() {\n    return {\n      'c': 0,\n      'd': 1,\n      'e': 2,\n      'f': 3,\n      'g': 4,\n      'a': 5,\n      'b': 6,\n    };\n  }\n\n  static get canonical_notes() {\n    return [\n      'c', 'c#', 'd', 'd#',\n      'e', 'f', 'f#', 'g',\n      'g#', 'a', 'a#', 'b',\n    ];\n  }\n\n  static get diatonic_intervals() {\n    return [\n      'unison', 'm2', 'M2', 'm3', 'M3',\n      'p4', 'dim5', 'p5', 'm6', 'M6',\n      'b7', 'M7', 'octave',\n    ];\n  }\n\n  static get diatonic_accidentals() {\n    return {\n      'unison': { note: 0, accidental: 0 },\n      'm2': { note: 1, accidental: -1 },\n      'M2': { note: 1, accidental: 0 },\n      'm3': { note: 2, accidental: -1 },\n      'M3': { note: 2, accidental: 0 },\n      'p4': { note: 3, accidental: 0 },\n      'dim5': { note: 4, accidental: -1 },\n      'p5': { note: 4, accidental: 0 },\n      'm6': { note: 5, accidental: -1 },\n      'M6': { note: 5, accidental: 0 },\n      'b7': { note: 6, accidental: -1 },\n      'M7': { note: 6, accidental: 0 },\n      'octave': { note: 7, accidental: 0 },\n    };\n  }\n\n  static get intervals() {\n    return {\n      'u': 0, 'unison': 0,\n      'm2': 1, 'b2': 1, 'min2': 1, 'S': 1, 'H': 1,\n      '2': 2, 'M2': 2, 'maj2': 2, 'T': 2, 'W': 2,\n      'm3': 3, 'b3': 3, 'min3': 3,\n      'M3': 4, '3': 4, 'maj3': 4,\n      '4': 5, 'p4': 5,\n      '#4': 6, 'b5': 6, 'aug4': 6, 'dim5': 6,\n      '5': 7, 'p5': 7,\n      '#5': 8, 'b6': 8, 'aug5': 8,\n      '6': 9, 'M6': 9, 'maj6': 9,\n      'b7': 10, 'm7': 10, 'min7': 10, 'dom7': 10,\n      'M7': 11, 'maj7': 11,\n      '8': 12, 'octave': 12,\n    };\n  }\n\n  static get scales() {\n    return {\n      major: [2, 2, 1, 2, 2, 2, 1],\n      dorian: [2, 1, 2, 2, 2, 1, 2],\n      mixolydian: [2, 2, 1, 2, 2, 1, 2],\n      minor: [2, 1, 2, 2, 1, 2, 2],\n    };\n  }\n\n  static get scaleTypes() {\n    return {\n      'M': Music.scales.major,\n      'm': Music.scales.minor,\n    };\n  }\n\n  static get accidentals() {\n    return ['bb', 'b', 'n', '#', '##'];\n  }\n\n  static get noteValues() {\n    return {\n      'c': { root_index: 0, int_val: 0 },\n      'cn': { root_index: 0, int_val: 0 },\n      'c#': { root_index: 0, int_val: 1 },\n      'c##': { root_index: 0, int_val: 2 },\n      'cb': { root_index: 0, int_val: 11 },\n      'cbb': { root_index: 0, int_val: 10 },\n      'd': { root_index: 1, int_val: 2 },\n      'dn': { root_index: 1, int_val: 2 },\n      'd#': { root_index: 1, int_val: 3 },\n      'd##': { root_index: 1, int_val: 4 },\n      'db': { root_index: 1, int_val: 1 },\n      'dbb': { root_index: 1, int_val: 0 },\n      'e': { root_index: 2, int_val: 4 },\n      'en': { root_index: 2, int_val: 4 },\n      'e#': { root_index: 2, int_val: 5 },\n      'e##': { root_index: 2, int_val: 6 },\n      'eb': { root_index: 2, int_val: 3 },\n      'ebb': { root_index: 2, int_val: 2 },\n      'f': { root_index: 3, int_val: 5 },\n      'fn': { root_index: 3, int_val: 5 },\n      'f#': { root_index: 3, int_val: 6 },\n      'f##': { root_index: 3, int_val: 7 },\n      'fb': { root_index: 3, int_val: 4 },\n      'fbb': { root_index: 3, int_val: 3 },\n      'g': { root_index: 4, int_val: 7 },\n      'gn': { root_index: 4, int_val: 7 },\n      'g#': { root_index: 4, int_val: 8 },\n      'g##': { root_index: 4, int_val: 9 },\n      'gb': { root_index: 4, int_val: 6 },\n      'gbb': { root_index: 4, int_val: 5 },\n      'a': { root_index: 5, int_val: 9 },\n      'an': { root_index: 5, int_val: 9 },\n      'a#': { root_index: 5, int_val: 10 },\n      'a##': { root_index: 5, int_val: 11 },\n      'ab': { root_index: 5, int_val: 8 },\n      'abb': { root_index: 5, int_val: 7 },\n      'b': { root_index: 6, int_val: 11 },\n      'bn': { root_index: 6, int_val: 11 },\n      'b#': { root_index: 6, int_val: 0 },\n      'b##': { root_index: 6, int_val: 1 },\n      'bb': { root_index: 6, int_val: 10 },\n      'bbb': { root_index: 6, int_val: 9 },\n    };\n  }\n\n  isValidNoteValue(note) {\n    if (note == null || note < 0 || note >= Music.NUM_TONES) {\n      return false;\n    }\n    return true;\n  }\n\n  isValidIntervalValue(interval) {\n    return this.isValidNoteValue(interval);\n  }\n\n  getNoteParts(noteString) {\n    if (!noteString || noteString.length < 1) {\n      throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n    }\n\n    if (noteString.length > 3) {\n      throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n    }\n\n    const note = noteString.toLowerCase();\n\n    const regex = /^([cdefgab])(b|bb|n|#|##)?$/;\n    const match = regex.exec(note);\n\n    if (match != null) {\n      const root = match[1];\n      const accidental = match[2];\n\n      return {\n        root,\n        accidental,\n      };\n    } else {\n      throw new Vex.RERR('BadArguments', 'Invalid note name: ' + noteString);\n    }\n  }\n\n  getKeyParts(keyString) {\n    if (!keyString || keyString.length < 1) {\n      throw new Vex.RERR('BadArguments', 'Invalid key: ' + keyString);\n    }\n\n    const key = keyString.toLowerCase();\n\n    // Support Major, Minor, Melodic Minor, and Harmonic Minor key types.\n    const regex = /^([cdefgab])(b|#)?(mel|harm|m|M)?$/;\n    const match = regex.exec(key);\n\n    if (match != null) {\n      const root = match[1];\n      const accidental = match[2];\n      let type = match[3];\n\n      // Unspecified type implies major\n      if (!type) type = 'M';\n\n      return {\n        root,\n        accidental,\n        type,\n      };\n    } else {\n      throw new Vex.RERR('BadArguments', `Invalid key: ${keyString}`);\n    }\n  }\n\n  getNoteValue(noteString) {\n    const value = Music.noteValues[noteString];\n    if (value == null) {\n      throw new Vex.RERR('BadArguments', `Invalid note name: ${noteString}`);\n    }\n\n    return value.int_val;\n  }\n\n  getIntervalValue(intervalString) {\n    const value = Music.intervals[intervalString];\n    if (value == null) {\n      throw new Vex.RERR('BadArguments', `Invalid interval name: ${intervalString}`);\n    }\n\n    return value;\n  }\n\n  getCanonicalNoteName(noteValue) {\n    if (!this.isValidNoteValue(noteValue)) {\n      throw new Vex.RERR('BadArguments', `Invalid note value: ${noteValue}`);\n    }\n\n    return Music.canonical_notes[noteValue];\n  }\n\n  getCanonicalIntervalName(intervalValue) {\n    if (!this.isValidIntervalValue(intervalValue)) {\n      throw new Vex.RERR('BadArguments', `Invalid interval value: ${intervalValue}`);\n    }\n\n    return Music.diatonic_intervals[intervalValue];\n  }\n\n  /* Given a note, interval, and interval direction, product the\n   * relative note.\n   */\n  getRelativeNoteValue(noteValue, intervalValue, direction) {\n    if (direction == null) direction = 1;\n\n    if (direction !== 1 && direction !== -1) {\n      throw new Vex.RERR('BadArguments', `Invalid direction: ${direction}`);\n    }\n\n    let sum = (noteValue + (direction * intervalValue)) % Music.NUM_TONES;\n    if (sum < 0) sum += Music.NUM_TONES;\n\n    return sum;\n  }\n\n  getRelativeNoteName(root, noteValue) {\n    const parts = this.getNoteParts(root);\n    const rootValue = this.getNoteValue(parts.root);\n    let interval = noteValue - rootValue;\n\n    if (Math.abs(interval) > Music.NUM_TONES - 3) {\n      let multiplier = 1;\n      if (interval > 0) multiplier = -1;\n\n      // Possibly wrap around. (Add +1 for modulo operator)\n      const reverse_interval = (((noteValue + 1) + (rootValue + 1)) %\n        Music.NUM_TONES) * multiplier;\n\n      if (Math.abs(reverse_interval) > 2) {\n        throw new Vex.RERR('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n      } else {\n        interval = reverse_interval;\n      }\n    }\n\n    if (Math.abs(interval) > 2) {\n      throw new Vex.RERR('BadArguments', `Notes not related: ${root}, ${noteValue})`);\n    }\n\n    let relativeNoteName = parts.root;\n    if (interval > 0) {\n      for (let i = 1; i <= interval; ++i) {\n        relativeNoteName += '#';\n      }\n    } else if (interval < 0) {\n      for (let i = -1; i >= interval; --i) {\n        relativeNoteName += 'b';\n      }\n    }\n\n    return relativeNoteName;\n  }\n\n  /* Return scale tones, given intervals. Each successive interval is\n   * relative to the previous one, e.g., Major Scale:\n   *\n   *   TTSTTTS = [2,2,1,2,2,2,1]\n   *\n   * When used with key = 0, returns C scale (which is isomorphic to\n   * interval list).\n   */\n  getScaleTones(key, intervals) {\n    const tones = [key];\n\n    let nextNote = key;\n    for (let i = 0; i < intervals.length; i += 1) {\n      nextNote = this.getRelativeNoteValue(nextNote, intervals[i]);\n      if (nextNote !== key) tones.push(nextNote);\n    }\n\n    return tones;\n  }\n\n  /* Returns the interval of a note, given a diatonic scale.\n   *\n   * E.g., Given the scale C, and the note E, returns M3\n   */\n  getIntervalBetween(note1, note2, direction) {\n    if (direction == null) direction = 1;\n\n    if (direction !== 1 && direction !== -1) {\n      throw new Vex.RERR('BadArguments', `Invalid direction: ${direction}`);\n    }\n\n    if (!this.isValidNoteValue(note1) || !this.isValidNoteValue(note2)) {\n      throw new Vex.RERR('BadArguments', `Invalid notes: ${note1}, ${note2}`);\n    }\n\n    let difference = direction === 1\n      ? note2 - note1\n      : note1 - note2;\n\n    if (difference < 0) difference += Music.NUM_TONES;\n\n    return difference;\n  }\n\n  // Create a scale map that represents the pitch state for a\n  // `keySignature`. For example, passing a `G` to `keySignature` would\n  // return a scale map with every note naturalized except for `F` which\n  // has an `F#` state.\n  createScaleMap(keySignature) {\n    const keySigParts = this.getKeyParts(keySignature);\n    const scaleName = Music.scaleTypes[keySigParts.type];\n\n    let keySigString = keySigParts.root;\n    if (keySigParts.accidental) keySigString += keySigParts.accidental;\n\n    if (!scaleName) throw new Vex.RERR('BadArguments', 'Unsupported key type: ' + keySignature);\n\n    const scale = this.getScaleTones(this.getNoteValue(keySigString), scaleName);\n    const noteLocation = Music.root_indices[keySigParts.root];\n\n    const scaleMap = {};\n    for (let i = 0; i < Music.roots.length; ++i) {\n      const index = (noteLocation + i) % Music.roots.length;\n      const rootName = Music.roots[index];\n      let noteName = this.getRelativeNoteName(rootName, scale[i]);\n\n      if (noteName.length === 1) {\n        noteName += 'n';\n      }\n\n      scaleMap[rootName] = noteName;\n    }\n\n    return scaleMap;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n// @author Greg Ristow (modifications)\n//\n// ## Description\n//\n// This file implements accidentals as modifiers that can be attached to\n// notes. Support is included for both western and microtonal accidentals.\n//\n// See `tests/accidental_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Fraction } from './fraction';\nimport { Flow } from './tables';\nimport { Music } from './music';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.Accidental.DEBUG` to `true`.\nfunction L(...args) { if (Accidental.DEBUG) Vex.L('Vex.Flow.Accidental', args); }\n\nconst getGlyphWidth = glyph => glyph.getMetrics().width;\n\n// An `Accidental` inherits from `Modifier`, and is formatted within a\n// `ModifierContext`.\nexport class Accidental extends Modifier {\n  static get CATEGORY() { return 'accidentals'; }\n\n  // Arrange accidentals inside a ModifierContext.\n  static format(accidentals, state) {\n    const noteheadAccidentalPadding = 1;\n    const leftShift = state.left_shift + noteheadAccidentalPadding;\n    const accidentalSpacing = 3;\n\n    // If there are no accidentals, we needn't format their positions\n    if (!accidentals || accidentals.length === 0) return;\n\n    const accList = [];\n    let prevNote = null;\n    let shiftL = 0;\n\n    // First determine the accidentals' Y positions from the note.keys\n    let propsTemp;\n    for (let i = 0; i < accidentals.length; ++i) {\n      const acc = accidentals[i];\n      const note = acc.getNote();\n      const stave = note.getStave();\n      const props = note.getKeyProps()[acc.getIndex()];\n      if (note !== prevNote) {\n        // Iterate through all notes to get the displaced pixels\n        for (let n = 0; n < note.keys.length; ++n) {\n          propsTemp = note.getKeyProps()[n];\n          shiftL = propsTemp.displaced ? note.getExtraLeftPx() : shiftL;\n        }\n        prevNote = note;\n      }\n      if (stave !== null) {\n        const lineSpace = stave.options.spacing_between_lines_px;\n        const y = stave.getYForLine(props.line);\n        const accLine = Math.round(y / lineSpace * 2) / 2;\n        accList.push({ y, line: accLine, shift: shiftL, acc, lineSpace });\n      } else {\n        accList.push({ line: props.line, shift: shiftL, acc });\n      }\n    }\n\n    // Sort accidentals by line number.\n    accList.sort((a, b) => b.line - a.line);\n\n    // FIXME: Confusing name. Each object in this array has a property called `line`.\n    // So if this is a list of lines, you end up with: `line.line` which is very awkward.\n    const lineList = [];\n\n    // amount by which all accidentals must be shifted right or left for\n    // stem flipping, notehead shifting concerns.\n    let accShift = 0;\n    let previousLine = null;\n\n    // Create an array of unique line numbers (lineList) from accList\n    for (let i = 0; i < accList.length; i++) {\n      const acc = accList[i];\n\n      // if this is the first line, or a new line, add a lineList\n      if (previousLine === null || previousLine !== acc.line) {\n        lineList.push({\n          line: acc.line,\n          flatLine: true,\n          dblSharpLine: true,\n          numAcc: 0,\n          width: 0,\n        });\n      }\n      // if this accidental is not a flat, the accidental needs 3.0 lines lower\n      // clearance instead of 2.5 lines for b or bb.\n      // FIXME: Naming could use work. acc.acc is very awkward\n      if (acc.acc.type !== 'b' && acc.acc.type !== 'bb') {\n        lineList[lineList.length - 1].flatLine = false;\n      }\n\n      // if this accidental is not a double sharp, the accidental needs 3.0 lines above\n      if (acc.acc.type !== '##') {\n        lineList[lineList.length - 1].dblSharpLine = false;\n      }\n\n      // Track how many accidentals are on this line:\n      lineList[lineList.length - 1].numAcc++;\n\n      // Track the total x_offset needed for this line which will be needed\n      // for formatting lines w/ multiple accidentals:\n\n      // width = accidental width + universal spacing between accidentals\n      lineList[lineList.length - 1].width += acc.acc.getWidth() + accidentalSpacing;\n\n      // if this accShift is larger, use it to keep first column accidentals in the same line\n      accShift = acc.shift > accShift ? acc.shift : accShift;\n\n      previousLine = acc.line;\n    }\n\n    // ### Place Accidentals in Columns\n    //\n    // Default to a classic triangular layout (middle accidental farthest left),\n    // but follow exceptions as outlined in G. Read's _Music Notation_ and\n    // Elaine Gould's _Behind Bars_.\n    //\n    // Additionally, this implements different vertical collision rules for\n    // flats (only need 2.5 lines clearance below) and double sharps (only\n    // need 2.5 lines of clearance above or below).\n    //\n    // Classic layouts and exception patterns are found in the 'tables.js'\n    // in 'Vex.Flow.accidentalColumnsTable'\n    //\n    // Beyond 6 vertical accidentals, default to the parallel ascending lines approach,\n    // using as few columns as possible for the verticle structure.\n    //\n    // TODO (?): Allow column to be specified for an accidental at run-time?\n\n    let totalColumns = 0;\n\n    // establish the boundaries for a group of notes with clashing accidentals:\n    for (let i = 0; i < lineList.length; i++) {\n      let noFurtherConflicts = false;\n      const groupStart = i;\n      let groupEnd = i;\n\n      while (groupEnd + 1 < lineList.length && !noFurtherConflicts) {\n        // if this note conflicts with the next:\n        if (this.checkCollision(lineList[groupEnd], lineList[groupEnd + 1])) {\n          // include the next note in the group:\n          groupEnd++;\n        } else {\n          noFurtherConflicts = true;\n        }\n      }\n\n      // Gets an a line from the `lineList`, relative to the current group\n      const getGroupLine = (index) => lineList[groupStart + index];\n      const getGroupLines = (indexes) => indexes.map(getGroupLine);\n      const lineDifference = (indexA, indexB) => {\n        const [a, b] = getGroupLines([indexA, indexB]).map(item => item.line);\n        return a - b;\n      };\n\n      const notColliding = (...indexPairs) =>\n        indexPairs\n          .map(getGroupLines)\n          .every(lines => !this.checkCollision(...lines));\n\n      // Set columns for the lines in this group:\n      const groupLength = groupEnd - groupStart + 1;\n\n      // Set the accidental column for each line of the group\n      let endCase = this.checkCollision(lineList[groupStart], lineList[groupEnd]) ? 'a' : 'b';\n\n      switch (groupLength) {\n        case 3:\n          if (endCase === 'a' && lineDifference(1, 2) === 0.5 && lineDifference(0, 1) !== 0.5) {\n            endCase = 'second_on_bottom';\n          }\n          break;\n        case 4:\n          if (notColliding([0, 2], [1, 3])) {\n            endCase = 'spaced_out_tetrachord';\n          }\n          break;\n        case 5:\n          if (endCase === 'b' && notColliding([1, 3])) {\n            endCase = 'spaced_out_pentachord';\n            if (notColliding([0, 2], [2, 4])) {\n              endCase = 'very_spaced_out_pentachord';\n            }\n          }\n          break;\n        case 6:\n          if (notColliding([0, 3], [1, 4], [2, 5])) {\n            endCase = 'spaced_out_hexachord';\n          }\n          if (notColliding([0, 2], [2, 4], [1, 3], [3, 5])) {\n            endCase = 'very_spaced_out_hexachord';\n          }\n          break;\n        default:\n          break;\n      }\n\n      let groupMember;\n      let column;\n      // If the group contains more than seven members, use ascending parallel lines\n      // of accidentals, using as few columns as possible while avoiding collisions.\n      if (groupLength >= 7) {\n        // First, determine how many columns to use:\n        let patternLength = 2;\n        let collisionDetected = true;\n        while (collisionDetected === true) {\n          collisionDetected = false;\n          for (let line = 0; line + patternLength < lineList.length; line++) {\n            if (this.checkCollision(lineList[line], lineList[line + patternLength])) {\n              collisionDetected = true;\n              patternLength++;\n              break;\n            }\n          }\n        }\n        // Then, assign a column to each line of accidentals\n        for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n          column = ((groupMember - i) % patternLength) + 1;\n          lineList[groupMember].column = column;\n          totalColumns = (totalColumns > column) ? totalColumns : column;\n        }\n\n        // Otherwise, if the group contains fewer than seven members, use the layouts from\n        // the accidentalsColumnsTable housed in tables.js.\n      } else {\n        for (groupMember = i; groupMember <= groupEnd; groupMember++) {\n          column = Flow.accidentalColumnsTable[groupLength][endCase][groupMember - i];\n          lineList[groupMember].column = column;\n          totalColumns = (totalColumns > column) ? totalColumns : column;\n        }\n      }\n\n      // Increment i to the last note that was set, so that if a lower set of notes\n      // does not conflict at all with this group, it can have its own classic shape.\n      i = groupEnd;\n    }\n\n    // ### Convert Columns to x_offsets\n    //\n    // This keeps columns aligned, even if they have different accidentals within them\n    // which sometimes results in a larger x_offset than is an accidental might need\n    // to preserve the symmetry of the accidental shape.\n    //\n    // Neither A.C. Vinci nor G. Read address this, and it typically only happens in\n    // music with complex chord clusters.\n    //\n    // TODO (?): Optionally allow closer compression of accidentals, instead of forcing\n    // parallel columns.\n\n    // track each column's max width, which will be used as initial shift of later columns:\n    const columnWidths = [];\n    const columnXOffsets = [];\n    for (let i = 0; i <= totalColumns; i++) {\n      columnWidths[i] = 0;\n      columnXOffsets[i] = 0;\n    }\n\n    columnWidths[0] = accShift + leftShift;\n    columnXOffsets[0] = accShift + leftShift;\n\n    // Fill columnWidths with widest needed x-space;\n    // this is what keeps the columns parallel.\n    lineList.forEach(line => {\n      if (line.width > columnWidths[line.column]) columnWidths[line.column] = line.width;\n    });\n\n    for (let i = 1; i < columnWidths.length; i++) {\n      // this column's offset = this column's width + previous column's offset\n      columnXOffsets[i] = columnWidths[i] + columnXOffsets[i - 1];\n    }\n\n    const totalShift = columnXOffsets[columnXOffsets.length - 1];\n    // Set the xShift for each accidental according to column offsets:\n    let accCount = 0;\n    lineList.forEach(line => {\n      let lineWidth = 0;\n      const lastAccOnLine = accCount + line.numAcc;\n      // handle all of the accidentals on a given line:\n      for (accCount; accCount < lastAccOnLine; accCount++) {\n        const xShift = (columnXOffsets[line.column - 1] + lineWidth);\n        accList[accCount].acc.setXShift(xShift);\n        // keep track of the width of accidentals we've added so far, so that when\n        // we loop, we add space for them.\n        lineWidth += accList[accCount].acc.getWidth() + accidentalSpacing;\n        L('Line, accCount, shift: ', line.line, accCount, xShift);\n      }\n    });\n\n    // update the overall layout with the full width of the accidental shapes:\n    state.left_shift += totalShift;\n  }\n\n  // Helper function to determine whether two lines of accidentals collide vertically\n  static checkCollision(line1, line2) {\n    let clearance = line2.line - line1.line;\n    let clearanceRequired = 3;\n    // But less clearance is required for certain accidentals: b, bb and ##.\n    if (clearance > 0) { // then line 2 is on top\n      clearanceRequired = (line2.flatLine || line2.dblSharpLine) ? 2.5 : 3.0;\n      if (line1.dblSharpLine) clearance -= 0.5;\n    } else { // line 1 is on top\n      clearanceRequired = (line1.flatLine || line1.dblSharpLine) ? 2.5 : 3.0;\n      if (line2.dblSharpLine) clearance -= 0.5;\n    }\n    const collision = Math.abs(clearance) < clearanceRequired;\n    L('Line_1, Line_2, Collision: ', line1.line, line2.line, collision);\n    return collision;\n  }\n\n  // Use this method to automatically apply accidentals to a set of `voices`.\n  // The accidentals will be remembered between all the voices provided.\n  // Optionally, you can also provide an initial `keySignature`.\n  static applyAccidentals(voices, keySignature) {\n    const tickPositions = [];\n    const tickNoteMap = {};\n\n    // Sort the tickables in each voice by their tick position in the voice\n    voices.forEach(voice => {\n      const tickPosition = new Fraction(0, 1);\n      const notes = voice.getTickables();\n      notes.forEach(note => {\n        if (note.shouldIgnoreTicks()) return;\n\n        const notesAtPosition = tickNoteMap[tickPosition.value()];\n\n        if (!notesAtPosition) {\n          tickPositions.push(tickPosition.value());\n          tickNoteMap[tickPosition.value()] = [note];\n        } else {\n          notesAtPosition.push(note);\n        }\n\n        tickPosition.add(note.getTicks());\n      });\n    });\n\n    const music = new Music();\n\n    // Default key signature is C major\n    if (!keySignature) keySignature = 'C';\n\n    // Get the scale map, which represents the current state of each pitch\n    const scaleMap = music.createScaleMap(keySignature);\n\n    tickPositions.forEach(tick => {\n      const notes = tickNoteMap[tick];\n\n      // Array to store all pitches that modified accidental states\n      // at this tick position\n      const modifiedPitches = [];\n\n      const processNote = (note) => {\n        if (note.isRest() || note.shouldIgnoreTicks()) return;\n\n        // Go through each key and determine if an accidental should be\n        // applied\n        note.keys.forEach((keyString, keyIndex) => {\n          const key = music.getNoteParts(keyString.split('/')[0]);\n\n          // Force a natural for every key without an accidental\n          const accidentalString = key.accidental || 'n';\n          const pitch = key.root + accidentalString;\n\n          // Determine if the current pitch has the same accidental\n          // as the scale state\n          const sameAccidental = scaleMap[key.root] === pitch;\n\n          // Determine if an identical pitch in the chord already\n          // modified the accidental state\n          const previouslyModified = modifiedPitches.indexOf(pitch) > -1;\n\n          // Add the accidental to the StaveNote\n          if (!sameAccidental || (sameAccidental && previouslyModified)) {\n            // Modify the scale map so that the root pitch has an\n            // updated state\n            scaleMap[key.root] = pitch;\n\n            // Create the accidental\n            const accidental = new Accidental(accidentalString);\n\n            // Attach the accidental to the StaveNote\n            note.addAccidental(keyIndex, accidental);\n\n            // Add the pitch to list of pitches that modified accidentals\n            modifiedPitches.push(pitch);\n          }\n        });\n\n        // process grace notes\n        note.getModifiers().forEach(modifier => {\n          if (modifier.getCategory() === 'gracenotegroups') {\n            modifier.getGraceNotes().forEach(processNote);\n          }\n        });\n      };\n\n      notes.forEach(processNote);\n    });\n  }\n\n  // Create accidental. `type` can be a value from the\n  // `Vex.Flow.accidentalCodes.accidentals` table in `tables.js`. For\n  // example: `#`, `##`, `b`, `n`, etc.\n  constructor(type = null) {\n    super();\n    this.setAttribute('type', 'Accidental');\n\n    L('New accidental: ', type);\n\n    this.note = null;\n    // The `index` points to a specific note in a chord.\n    this.index = null;\n    this.type = type;\n    this.position = Modifier.Position.LEFT;\n\n    this.render_options = {\n      // Font size for glyphs\n      font_scale: 38,\n\n      // Length of stroke across heads above or below the stave.\n      stroke_px: 3,\n\n      // Padding between accidental and parentheses on each side\n      parenLeftPadding: 2,\n      parenRightPadding: 2,\n    };\n\n    this.accidental = Flow.accidentalCodes(this.type);\n    if (!this.accidental) {\n      throw new Vex.RERR('ArgumentError', `Unknown accidental type: ${type}`);\n    }\n\n    // Cautionary accidentals have parentheses around them\n    this.cautionary = false;\n    this.parenLeft = null;\n    this.parenRight = null;\n\n    this.reset();\n  }\n\n  reset() {\n    const fontScale = this.render_options.font_scale;\n    this.glyph = new Glyph(this.accidental.code, fontScale);\n    this.glyph.setOriginX(1.0);\n\n    if (this.cautionary) {\n      this.parenLeft = new Glyph(Flow.accidentalCodes('{').code, fontScale);\n      this.parenRight = new Glyph(Flow.accidentalCodes('}').code, fontScale);\n      this.parenLeft.setOriginX(1.0);\n      this.parenRight.setOriginX(1.0);\n    }\n  }\n\n  getCategory() { return Accidental.CATEGORY; }\n\n  getWidth() {\n    const parenWidth = this.cautionary\n      ? (\n        getGlyphWidth(this.parenLeft) +\n        getGlyphWidth(this.parenRight) +\n        this.render_options.parenLeftPadding +\n        this.render_options.parenRightPadding\n      )\n      : 0;\n\n    return getGlyphWidth(this.glyph) + parenWidth;\n  }\n\n  // Attach this accidental to `note`, which must be a `StaveNote`.\n  setNote(note) {\n    if (!note) {\n      throw new Vex.RERR('ArgumentError', `Bad note value: ${note}`);\n    }\n\n    this.note = note;\n\n    // Accidentals attached to grace notes are rendered smaller.\n    if (this.note.getCategory() === 'gracenotes') {\n      this.render_options.font_scale = 25;\n      this.reset();\n    }\n  }\n\n  // If called, draws parenthesis around accidental.\n  setAsCautionary() {\n    this.cautionary = true;\n    this.render_options.font_scale = 28;\n    this.reset();\n    return this;\n  }\n\n  // Render accidental onto canvas.\n  draw() {\n    const {\n      context,\n      type, position, note, index, cautionary,\n      x_shift, y_shift,\n      glyph, parenLeft, parenRight,\n      render_options: { parenLeftPadding, parenRightPadding },\n    } = this;\n\n    this.checkContext();\n\n    if (!(note && (index != null))) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw accidental without a note and index.\");\n    }\n\n    // Figure out the start `x` and `y` coordinates for note and index.\n    const start = note.getModifierStartXY(position, index);\n    let accX = start.x + x_shift;\n    const accY = start.y + y_shift;\n    L('Rendering: ', type, accX, accY);\n\n    if (!cautionary) {\n      glyph.render(context, accX, accY);\n    } else {\n      // Render the accidental in parentheses.\n      parenRight.render(context, accX, accY);\n      accX -= getGlyphWidth(parenRight);\n      accX -= parenRightPadding;\n      accX -= this.accidental.parenRightPaddingAdjustment;\n      glyph.render(context, accX, accY);\n      accX -= getGlyphWidth(glyph);\n      accX -= parenLeftPadding;\n      parenLeft.render(context, accX, accY);\n    }\n\n    this.setRendered();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2016\n//\n// ## Description\n//\n// This file implements `NoteSubGroup` which is used to format and\n// render notes as a `Modifier`\n// ex) ClefNote, TimeSigNote and BarNote.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Formatter } from './formatter';\nimport { Voice } from './voice';\n\nexport class NoteSubGroup extends Modifier {\n  static get CATEGORY() { return 'notesubgroup'; }\n\n  // Arrange groups inside a `ModifierContext`\n  static format(groups, state) {\n    if (!groups || groups.length === 0) return false;\n\n    let width = 0;\n    for (let i = 0; i < groups.length; ++i) {\n      const group = groups[i];\n      group.preFormat();\n      width += group.getWidth();\n    }\n\n    state.left_shift += width;\n    return true;\n  }\n\n  constructor(subNotes) {\n    super();\n    this.setAttribute('type', 'NoteSubGroup');\n\n    this.note = null;\n    this.index = null;\n    this.position = Modifier.Position.LEFT;\n    this.subNotes = subNotes;\n    this.subNotes.forEach(subNote => { subNote.ignore_ticks = false; });\n    this.width = 0;\n    this.preFormatted = false;\n\n    this.formatter = new Formatter();\n    this.voice = new Voice({\n      num_beats: 4,\n      beat_value: 4,\n      resolution: Flow.RESOLUTION,\n    }).setStrict(false);\n\n    this.voice.addTickables(this.subNotes);\n\n    return this;\n  }\n\n  getCategory() { return NoteSubGroup.CATEGORY; }\n\n  preFormat() {\n    if (this.preFormatted) return;\n\n    this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n    this.setWidth(this.formatter.getMinTotalWidth());\n    this.preFormatted = true;\n  }\n\n  setNote(note) {\n    this.note = note;\n  }\n  setWidth(width) {\n    this.width = width;\n  }\n  getWidth() {\n    return this.width;\n  }\n\n  draw() {\n    this.checkContext();\n\n    const note = this.getNote();\n\n    if (!(note && (this.index !== null))) {\n      throw new Vex.RuntimeError('NoAttachedNote',\n        \"Can't draw notes without a parent note and parent note index.\");\n    }\n\n    this.setRendered();\n    this.alignSubNotesWithNote(this.subNotes, note); // Modifier function\n\n    // Draw notes\n    this.subNotes.forEach(subNote => subNote.setContext(this.context).drawWithStyle());\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\nexport class StaveTie extends Element {\n  constructor(notes, text) {\n    /**\n     * Notes is a struct that has:\n     *\n     *  {\n     *    first_note: Note,\n     *    last_note: Note,\n     *    first_indices: [n1, n2, n3],\n     *    last_indices: [n1, n2, n3]\n     *  }\n     *\n     **/\n    super();\n    this.setAttribute('type', 'StaveTie');\n    this.notes = notes;\n    this.context = null;\n    this.text = text;\n    this.direction = null;\n\n    this.render_options = {\n      cp1: 8,      // Curve control point 1\n      cp2: 12,      // Curve control point 2\n      text_shift_x: 0,\n      first_x_shift: 0,\n      last_x_shift: 0,\n      y_shift: 7,\n      tie_spacing: 0,\n      font: { family: 'Arial', size: 10, style: '' },\n    };\n\n    this.font = this.render_options.font;\n    this.setNotes(notes);\n  }\n\n  setFont(font) { this.font = font; return this; }\n  setDirection(direction) { this.direction = direction; return this; }\n\n  /**\n   * Set the notes to attach this tie to.\n   *\n   * @param {!Object} notes The notes to tie up.\n   */\n  setNotes(notes) {\n    if (!notes.first_note && !notes.last_note) {\n      throw new Vex.RuntimeError(\n        'BadArguments', 'Tie needs to have either first_note or last_note set.'\n      );\n    }\n\n    if (!notes.first_indices) notes.first_indices = [0];\n    if (!notes.last_indices) notes.last_indices = [0];\n\n    if (notes.first_indices.length !== notes.last_indices.length) {\n      throw new Vex.RuntimeError('BadArguments', 'Tied notes must have similar index sizes');\n    }\n\n    // Success. Lets grab 'em notes.\n    this.first_note = notes.first_note;\n    this.first_indices = notes.first_indices;\n    this.last_note = notes.last_note;\n    this.last_indices = notes.last_indices;\n    return this;\n  }\n\n  /**\n   * @return {boolean} Returns true if this is a partial bar.\n   */\n  isPartial() {\n    return (!this.first_note || !this.last_note);\n  }\n\n  renderTie(params) {\n    if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n      throw new Vex.RERR('BadArguments', 'No Y-values to render');\n    }\n\n    const ctx = this.context;\n    let cp1 = this.render_options.cp1;\n    let cp2 = this.render_options.cp2;\n\n    if (Math.abs(params.last_x_px - params.first_x_px) < 10) {\n      cp1 = 2; cp2 = 8;\n    }\n\n    const first_x_shift = this.render_options.first_x_shift;\n    const last_x_shift = this.render_options.last_x_shift;\n    const y_shift = this.render_options.y_shift * params.direction;\n\n    for (let i = 0; i < this.first_indices.length; ++i) {\n      const cp_x = ((params.last_x_px + last_x_shift) +\n          (params.first_x_px + first_x_shift)) / 2;\n      const first_y_px = params.first_ys[this.first_indices[i]] + y_shift;\n      const last_y_px = params.last_ys[this.last_indices[i]] + y_shift;\n\n      if (isNaN(first_y_px) || isNaN(last_y_px)) {\n        throw new Vex.RERR('BadArguments', 'Bad indices for tie rendering.');\n      }\n\n      const top_cp_y = ((first_y_px + last_y_px) / 2) + (cp1 * params.direction);\n      const bottom_cp_y = ((first_y_px + last_y_px) / 2) + (cp2 * params.direction);\n\n      ctx.beginPath();\n      ctx.moveTo(params.first_x_px + first_x_shift, first_y_px);\n      ctx.quadraticCurveTo(cp_x, top_cp_y, params.last_x_px + last_x_shift, last_y_px);\n      ctx.quadraticCurveTo(cp_x, bottom_cp_y, params.first_x_px + first_x_shift, first_y_px);\n      ctx.closePath();\n      ctx.fill();\n    }\n  }\n\n  renderText(first_x_px, last_x_px) {\n    if (!this.text) return;\n    let center_x = (first_x_px + last_x_px) / 2;\n    center_x -= this.context.measureText(this.text).width / 2;\n\n    this.context.save();\n    this.context.setFont(this.font.family, this.font.size, this.font.style);\n    this.context.fillText(\n      this.text,\n      center_x + this.render_options.text_shift_x,\n      (this.first_note || this.last_note).getStave().getYForTopText() - 1\n    );\n    this.context.restore();\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const first_note = this.first_note;\n    const last_note = this.last_note;\n\n    let first_x_px;\n    let last_x_px;\n    let first_ys;\n    let last_ys;\n    let stem_direction;\n    if (first_note) {\n      first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n      stem_direction = first_note.getStemDirection();\n      first_ys = first_note.getYs();\n    } else {\n      first_x_px = last_note.getStave().getTieStartX();\n      first_ys = last_note.getYs();\n      this.first_indices = this.last_indices;\n    }\n\n    if (last_note) {\n      last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n      stem_direction = last_note.getStemDirection();\n      last_ys = last_note.getYs();\n    } else {\n      last_x_px = first_note.getStave().getTieEndX();\n      last_ys = first_note.getYs();\n      this.last_indices = this.first_indices;\n    }\n\n    if (this.direction) {\n      stem_direction = this.direction;\n    }\n\n    this.renderTie({\n      first_x_px,\n      last_x_px,\n      first_ys,\n      last_ys,\n      direction: stem_direction,\n    });\n\n    this.renderText(first_x_px, last_x_px);\n    return true;\n  }\n}\n","// / [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { StaveTie } from './stavetie';\n\nexport class TabTie extends StaveTie {\n  static createHammeron(notes) {\n    return new TabTie(notes, 'H');\n  }\n\n  static createPulloff(notes) {\n    return new TabTie(notes, 'P');\n  }\n\n  constructor(notes, text) {\n    /**\n     * Notes is a struct that has:\n     *\n     *  {\n     *    first_note: Note,\n     *    last_note: Note,\n     *    first_indices: [n1, n2, n3],\n     *    last_indices: [n1, n2, n3]\n     *  }\n     *\n     **/\n    super(notes, text);\n    this.setAttribute('type', 'TabTie');\n\n    this.render_options.cp1 = 9;\n    this.render_options.cp2 = 11;\n    this.render_options.y_shift = 3;\n\n    this.setNotes(notes);\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const first_note = this.first_note;\n    const last_note = this.last_note;\n    let first_x_px;\n    let last_x_px;\n    let first_ys;\n    let last_ys;\n\n    if (first_note) {\n      first_x_px = first_note.getTieRightX() + this.render_options.tie_spacing;\n      first_ys = first_note.getYs();\n    } else {\n      first_x_px = last_note.getStave().getTieStartX();\n      first_ys = last_note.getYs();\n      this.first_indices = this.last_indices;\n    }\n\n    if (last_note) {\n      last_x_px = last_note.getTieLeftX() + this.render_options.tie_spacing;\n      last_ys = last_note.getYs();\n    } else {\n      last_x_px = first_note.getStave().getTieEndX();\n      last_ys = first_note.getYs();\n      this.last_indices = this.first_indices;\n    }\n\n    this.renderTie({\n      first_x_px,\n      last_x_px,\n      first_ys,\n      last_ys,\n      direction: -1, // Tab tie's are always face up.\n    });\n\n    this.renderText(first_x_px, last_x_px);\n    return true;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `GraceNoteGroup` which is used to format and\n// render grace notes.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Formatter } from './formatter';\nimport { Voice } from './voice';\nimport { Beam } from './beam';\nimport { StaveTie } from './stavetie';\nimport { TabTie } from './tabtie';\nimport { StaveNote } from './stavenote';\n\n// To enable logging for this class. Set `Vex.Flow.GraceNoteGroup.DEBUG` to `true`.\nfunction L(...args) { if (GraceNoteGroup.DEBUG) Vex.L('Vex.Flow.GraceNoteGroup', args); }\n\nexport class GraceNoteGroup extends Modifier {\n  static get CATEGORY() { return 'gracenotegroups'; }\n\n  // Arrange groups inside a `ModifierContext`\n  static format(gracenote_groups, state) {\n    const group_spacing_stave = 4;\n    const group_spacing_tab = 0;\n\n    if (!gracenote_groups || gracenote_groups.length === 0) return false;\n\n    const group_list = [];\n    let prev_note = null;\n    let shiftL = 0;\n\n    for (let i = 0; i < gracenote_groups.length; ++i) {\n      const gracenote_group = gracenote_groups[i];\n      const note = gracenote_group.getNote();\n      const is_stavenote = (note.getCategory() === StaveNote.CATEGORY);\n      const spacing = (is_stavenote ? group_spacing_stave : group_spacing_tab);\n\n      if (is_stavenote && note !== prev_note) {\n        // Iterate through all notes to get the displaced pixels\n        for (let n = 0; n < note.keys.length; ++n) {\n          const props_tmp = note.getKeyProps()[n];\n          shiftL = (props_tmp.displaced ? note.getExtraLeftPx() : shiftL);\n        }\n        prev_note = note;\n      }\n\n      group_list.push({ shift: shiftL, gracenote_group, spacing });\n    }\n\n    // If first note left shift in case it is displaced\n    let group_shift = group_list[0].shift;\n    let formatWidth;\n    for (let i = 0; i < group_list.length; ++i) {\n      const gracenote_group = group_list[i].gracenote_group;\n      gracenote_group.preFormat();\n      formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n      group_shift = Math.max(formatWidth, group_shift);\n    }\n\n    for (let i = 0; i < group_list.length; ++i) {\n      const gracenote_group = group_list[i].gracenote_group;\n      formatWidth = gracenote_group.getWidth() + group_list[i].spacing;\n      gracenote_group.setSpacingFromNextModifier(group_shift - Math.min(formatWidth, group_shift));\n    }\n\n    state.left_shift += group_shift;\n    return true;\n  }\n\n  // ## Prototype Methods\n  //\n  // `GraceNoteGroup` inherits from `Modifier` and is placed inside a\n  // `ModifierContext`.\n  constructor(grace_notes, show_slur) {\n    super();\n    this.setAttribute('type', 'GraceNoteGroup');\n\n    this.note = null;\n    this.index = null;\n    this.position = Modifier.Position.LEFT;\n    this.grace_notes = grace_notes;\n    this.width = 0;\n\n    this.preFormatted = false;\n\n    this.show_slur = show_slur;\n    this.slur = null;\n\n    this.formatter = new Formatter();\n    this.voice = new Voice({\n      num_beats: 4,\n      beat_value: 4,\n      resolution: Flow.RESOLUTION,\n    }).setStrict(false);\n\n    this.render_options = {\n      slur_y_shift: 0,\n    };\n\n    this.beams = [];\n\n    this.voice.addTickables(this.grace_notes);\n\n    return this;\n  }\n\n  getCategory() { return GraceNoteGroup.CATEGORY; }\n\n  preFormat() {\n    if (this.preFormatted) return;\n\n    this.formatter.joinVoices([this.voice]).format([this.voice], 0);\n    this.setWidth(this.formatter.getMinTotalWidth());\n    this.preFormatted = true;\n  }\n\n  beamNotes(grace_notes) {\n    grace_notes = grace_notes || this.grace_notes;\n    if (grace_notes.length > 1) {\n      const beam = new Beam(grace_notes);\n\n      beam.render_options.beam_width = 3;\n      beam.render_options.partial_beam_length = 4;\n\n      this.beams.push(beam);\n    }\n\n    return this;\n  }\n\n  setNote(note) {\n    this.note = note;\n  }\n  setWidth(width) {\n    this.width = width;\n  }\n  getWidth() {\n    return this.width;\n  }\n  getGraceNotes() {\n    return this.grace_notes;\n  }\n  draw() {\n    this.checkContext();\n\n    const note = this.getNote();\n\n    L('Drawing grace note group for:', note);\n\n    if (!(note && (this.index !== null))) {\n      throw new Vex.RuntimeError('NoAttachedNote',\n        \"Can't draw grace note without a parent note and parent note index.\");\n    }\n\n    this.setRendered();\n    this.alignSubNotesWithNote(this.getGraceNotes(), note); // Modifier function\n\n    // Draw notes\n    this.grace_notes.forEach(graceNote => {\n      graceNote.setContext(this.context).draw();\n    });\n\n    // Draw beam\n    this.beams.forEach(beam => {\n      beam.setContext(this.context).draw();\n    });\n\n    if (this.show_slur) {\n      // Create and draw slur\n      const is_stavenote = (this.getNote().getCategory() === StaveNote.CATEGORY);\n      const TieClass = (is_stavenote ? StaveTie : TabTie);\n\n      this.slur = new TieClass({\n        last_note: this.grace_notes[0],\n        first_note: note,\n        first_indices: [0],\n        last_indices: [0],\n      });\n\n      this.slur.render_options.cp2 = 12;\n      this.slur.render_options.y_shift = (is_stavenote ? 7 : 5) + this.render_options.slur_y_shift;\n      this.slur.setContext(this.context).draw();\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// ## Description\n// This file implements the `Stroke` class which renders chord strokes\n// that can be arpeggiated, brushed, rasquedo, etc.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\nexport class Stroke extends Modifier {\n  static get CATEGORY() { return 'strokes'; }\n  static get Type() {\n    return {\n      BRUSH_DOWN: 1,\n      BRUSH_UP: 2,\n      ROLL_DOWN: 3, // Arpeggiated chord\n      ROLL_UP: 4,   // Arpeggiated chord\n      RASQUEDO_DOWN: 5,\n      RASQUEDO_UP: 6,\n      ARPEGGIO_DIRECTIONLESS: 7, // Arpeggiated chord without upwards or downwards arrow\n    };\n  }\n\n  // Arrange strokes inside `ModifierContext`\n  static format(strokes, state) {\n    const left_shift = state.left_shift;\n    const stroke_spacing = 0;\n\n    if (!strokes || strokes.length === 0) return this;\n\n    const strokeList = strokes.map((stroke) => {\n      const note = stroke.getNote();\n      if (note instanceof StaveNote) {\n        const { line, displaced } = note.getKeyProps()[stroke.getIndex()];\n        const shift = displaced ? note.getExtraLeftPx() : 0;\n        return { line, shift, stroke };\n      } else {\n        const { str: string } = note.getPositions()[stroke.getIndex()];\n        return { line: string, shift: 0, stroke };\n      }\n    });\n\n    const strokeShift = left_shift;\n\n    // There can only be one stroke .. if more than one, they overlay each other\n    const xShift = strokeList.reduce((xShift, { stroke, shift }) => {\n      stroke.setXShift(strokeShift + shift);\n      return Math.max(stroke.getWidth() + stroke_spacing, xShift);\n    }, 0);\n\n    state.left_shift += xShift;\n    return true;\n  }\n\n  constructor(type, options) {\n    super();\n    this.setAttribute('type', 'Stroke');\n\n    this.note = null;\n    this.options = Vex.Merge({}, options);\n\n    // multi voice - span stroke across all voices if true\n    this.all_voices = 'all_voices' in this.options ? this.options.all_voices : true;\n\n    // multi voice - end note of stroke, set in draw()\n    this.note_end = null;\n    this.index = null;\n    this.type = type;\n    this.position = Modifier.Position.LEFT;\n\n    this.render_options = {\n      font_scale: 38,\n      stroke_px: 3,\n      stroke_spacing: 10,\n    };\n\n    this.font = {\n      family: 'serif',\n      size: 10,\n      weight: 'bold italic',\n    };\n\n    this.setXShift(0);\n    this.setWidth(10);\n  }\n\n  getCategory() { return Stroke.CATEGORY; }\n  getPosition() { return this.position; }\n  addEndNote(note) { this.note_end = note; return this; }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    if (!(this.note && (this.index != null))) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw stroke without a note and index.\");\n    }\n\n    const start = this.note.getModifierStartXY(this.position, this.index);\n    let ys = this.note.getYs();\n    let topY = start.y;\n    let botY = start.y;\n    const x = start.x - 5;\n    const line_space = this.note.stave.options.spacing_between_lines_px;\n\n    const notes = this.getModifierContext().getModifiers(this.note.getCategory());\n    for (let i = 0; i < notes.length; i++) {\n      ys = notes[i].getYs();\n      for (let n = 0; n < ys.length; n++) {\n        if (this.note === notes[i] || this.all_voices) {\n          topY = Vex.Min(topY, ys[n]);\n          botY = Vex.Max(botY, ys[n]);\n        }\n      }\n    }\n\n    let arrow;\n    let arrow_shift_x;\n    let arrow_y;\n    let text_shift_x;\n    let text_y;\n    switch (this.type) {\n      case Stroke.Type.BRUSH_DOWN:\n        arrow = 'vc3';\n        arrow_shift_x = -3;\n        arrow_y = topY - (line_space / 2) + 10;\n        botY += (line_space / 2);\n        break;\n      case Stroke.Type.BRUSH_UP:\n        arrow = 'v11';\n        arrow_shift_x = 0.5;\n        arrow_y = botY + (line_space / 2);\n        topY -= (line_space / 2);\n        break;\n      case Stroke.Type.ROLL_DOWN:\n      case Stroke.Type.RASQUEDO_DOWN:\n        arrow = 'vc3';\n        arrow_shift_x = -3;\n        text_shift_x = this.x_shift + arrow_shift_x - 2;\n        if (this.note instanceof StaveNote) {\n          topY += 1.5 * line_space;\n          if ((botY - topY) % 2 !== 0) {\n            botY += 0.5 * line_space;\n          } else {\n            botY += line_space;\n          }\n          arrow_y = topY - line_space;\n          text_y = botY + line_space + 2;\n        } else {\n          topY += 1.5 * line_space;\n          botY += line_space;\n          arrow_y = topY - 0.75 * line_space;\n          text_y = botY + 0.25 * line_space;\n        }\n        break;\n      case Stroke.Type.ROLL_UP:\n      case Stroke.Type.RASQUEDO_UP:\n        arrow = 'v52';\n        arrow_shift_x = -4;\n        text_shift_x = this.x_shift + arrow_shift_x - 1;\n        if (this.note instanceof StaveNote) {\n          arrow_y = line_space / 2;\n          topY += 0.5 * line_space;\n          if ((botY - topY) % 2 === 0) {\n            botY += line_space / 2;\n          }\n          arrow_y = botY + 0.5 * line_space;\n          text_y = topY - 1.25 * line_space;\n        } else {\n          topY += 0.25 * line_space;\n          botY += 0.5 * line_space;\n          arrow_y = botY + 0.25 * line_space;\n          text_y = topY - line_space;\n        }\n        break;\n      case Stroke.Type.ARPEGGIO_DIRECTIONLESS:\n        topY += 0.5 * line_space;\n        botY += line_space; // * 0.5 can lead to slight underlap instead of overlap sometimes\n        break;\n      default:\n        throw new Vex.RERR('InvalidType', `The stroke type ${this.type} does not exist`);\n    }\n\n    // Draw the stroke\n    if (this.type === Stroke.Type.BRUSH_DOWN || this.type === Stroke.Type.BRUSH_UP) {\n      this.context.fillRect(x + this.x_shift, topY, 1, botY - topY);\n    } else {\n      if (this.note instanceof StaveNote) {\n        for (let i = topY; i <= botY; i += line_space) {\n          Glyph.renderGlyph(\n            this.context,\n            x + this.x_shift - 4,\n            i,\n            this.render_options.font_scale,\n            'va3'\n          );\n        }\n      } else {\n        let i;\n        for (i = topY; i <= botY; i += 10) {\n          Glyph.renderGlyph(\n            this.context,\n            x + this.x_shift - 4,\n            i,\n            this.render_options.font_scale,\n            'va3'\n          );\n        }\n        if (this.type === Stroke.Type.RASQUEDO_DOWN) {\n          text_y = i + 0.25 * line_space;\n        }\n      }\n    }\n\n    if (this.type === Stroke.Type.ARPEGGIO_DIRECTIONLESS) {\n      return; // skip drawing arrow heads or text\n    }\n\n    // Draw the arrow head\n    Glyph.renderGlyph(\n      this.context,\n      x + this.x_shift + arrow_shift_x,\n      arrow_y,\n      this.render_options.font_scale,\n      arrow\n    );\n\n    // Draw the rasquedo \"R\"\n    if (this.type === Stroke.Type.RASQUEDO_DOWN || this.type === Stroke.Type.RASQUEDO_UP) {\n      this.context.save();\n      this.context.setFont(this.font.family, this.font.size, this.font.weight);\n      this.context.fillText('R', x + text_shift_x, text_y);\n      this.context.restore();\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns\n//\n// ## Description\n// This file implements the `StringNumber` class which renders string\n// number annotations beside notes.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Renderer } from './renderer';\nimport { StaveNote } from './stavenote';\n\nexport class StringNumber extends Modifier {\n  static get CATEGORY() { return 'stringnumber'; }\n\n  // ## Static Methods\n  // Arrange string numbers inside a `ModifierContext`\n  static format(nums, state) {\n    const left_shift = state.left_shift;\n    const right_shift = state.right_shift;\n    const num_spacing = 1;\n\n    if (!nums || nums.length === 0) return this;\n\n    const nums_list = [];\n    let prev_note = null;\n    let shift_left = 0;\n    let shift_right = 0;\n\n    let i;\n    let num;\n    let note;\n    let pos;\n    let props_tmp;\n    for (i = 0; i < nums.length; ++i) {\n      num = nums[i];\n      note = num.getNote();\n\n      for (i = 0; i < nums.length; ++i) {\n        num = nums[i];\n        note = num.getNote();\n        pos = num.getPosition();\n        const props = note.getKeyProps()[num.getIndex()];\n\n        if (note !== prev_note) {\n          for (let n = 0; n < note.keys.length; ++n) {\n            props_tmp = note.getKeyProps()[n];\n            if (left_shift === 0) {\n              shift_left = props_tmp.displaced ? note.getExtraLeftPx() : shift_left;\n            }\n            if (right_shift === 0) {\n              shift_right = props_tmp.displaced ? note.getExtraRightPx() : shift_right;\n            }\n          }\n          prev_note = note;\n        }\n\n        nums_list.push({\n          pos,\n          note,\n          num,\n          line: props.line,\n          shiftL: shift_left,\n          shiftR: shift_right,\n        });\n      }\n    }\n\n    // Sort string numbers by line number.\n    nums_list.sort((a, b) => b.line - a.line);\n\n    // TODO: This variable never gets assigned to anything. Is that a bug or can this be removed?\n    let num_shiftL = 0; // eslint-disable-line\n    let num_shiftR = 0;\n    let x_widthL = 0;\n    let x_widthR = 0;\n    let last_line = null;\n    let last_note = null;\n    for (i = 0; i < nums_list.length; ++i) {\n      let num_shift = 0;\n      note = nums_list[i].note;\n      pos = nums_list[i].pos;\n      num = nums_list[i].num;\n      const line = nums_list[i].line;\n      const shiftL = nums_list[i].shiftL;\n      const shiftR = nums_list[i].shiftR;\n\n      // Reset the position of the string number every line.\n      if (line !== last_line || note !== last_note) {\n        num_shiftL = left_shift + shiftL;\n        num_shiftR = right_shift + shiftR;\n      }\n\n      const num_width = num.getWidth() + num_spacing;\n      if (pos === Modifier.Position.LEFT) {\n        num.setXShift(left_shift);\n        num_shift = shift_left + num_width; // spacing\n        x_widthL = (num_shift > x_widthL) ? num_shift : x_widthL;\n      } else if (pos === Modifier.Position.RIGHT) {\n        num.setXShift(num_shiftR);\n        num_shift += num_width; // spacing\n        x_widthR = (num_shift > x_widthR) ? num_shift : x_widthR;\n      }\n      last_line = line;\n      last_note = note;\n    }\n\n    state.left_shift += x_widthL;\n    state.right_shift += x_widthR;\n    return true;\n  }\n\n  constructor(number) {\n    super();\n    this.setAttribute('type', 'StringNumber');\n\n    this.note = null;\n    this.last_note = null;\n    this.index = null;\n    this.string_number = number;\n    this.setWidth(20); // ???\n    this.position = Modifier.Position.ABOVE; // Default position above stem or note head\n    this.x_shift = 0;\n    this.y_shift = 0;\n    this.x_offset = 0; // Horizontal offset from default\n    this.y_offset = 0; // Vertical offset from default\n    this.dashed = true; // true - draw dashed extension  false - no extension\n    this.leg = Renderer.LineEndType.NONE;   // draw upward/downward leg at the of extension line\n    this.radius = 8;\n    this.font = {\n      family: 'sans-serif',\n      size: 10,\n      weight: 'bold',\n    };\n  }\n  getCategory() { return StringNumber.CATEGORY; }\n  getNote() { return this.note; }\n  setNote(note) { this.note = note; return this; }\n  getIndex() { return this.index; }\n  setIndex(index) { this.index = index; return this; }\n\n  setLineEndType(leg) {\n    if (leg >= Renderer.LineEndType.NONE && leg <= Renderer.LineEndType.DOWN) {\n      this.leg = leg;\n    }\n    return this;\n  }\n\n  setStringNumber(number) { this.string_number = number; return this; }\n  setOffsetX(x) { this.x_offset = x; return this; }\n  setOffsetY(y) { this.y_offset = y; return this; }\n  setLastNote(note) { this.last_note = note; return this; }\n  setDashed(dashed) { this.dashed = dashed; return this; }\n\n  draw() {\n    const ctx = this.checkContext();\n    if (!(this.note && (this.index != null))) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw string number without a note and index.\");\n    }\n    this.setRendered();\n\n    const line_space = this.note.stave.options.spacing_between_lines_px;\n\n    const start = this.note.getModifierStartXY(this.position, this.index);\n    let dot_x = (start.x + this.x_shift + this.x_offset);\n    let dot_y = start.y + this.y_shift + this.y_offset;\n\n    switch (this.position) {\n      case Modifier.Position.ABOVE:\n      case Modifier.Position.BELOW: {\n        const stem_ext = this.note.getStemExtents();\n        let top = stem_ext.topY;\n        let bottom = stem_ext.baseY + 2;\n\n        if (this.note.stem_direction === StaveNote.STEM_DOWN) {\n          top = stem_ext.baseY;\n          bottom = stem_ext.topY - 2;\n        }\n\n        if (this.position === Modifier.Position.ABOVE) {\n          dot_y = this.note.hasStem()\n            ? top - (line_space * 1.75)\n            : start.y - (line_space * 1.75);\n        } else {\n          dot_y = this.note.hasStem()\n            ? bottom + (line_space * 1.5)\n            : start.y + (line_space * 1.75);\n        }\n\n        dot_y += this.y_shift + this.y_offset;\n\n        break;\n      } case Modifier.Position.LEFT:\n        dot_x -= (this.radius / 2) + 5;\n        break;\n      case Modifier.Position.RIGHT:\n        dot_x += (this.radius / 2) + 6;\n        break;\n      default:\n        throw new Vex.RERR(\n          'InvalidPosition', `The position ${this.position} is invalid`\n        );\n    }\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.arc(dot_x, dot_y, this.radius, 0, Math.PI * 2, false);\n    ctx.lineWidth = 1.5;\n    ctx.stroke();\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    const x = dot_x - ctx.measureText(this.string_number).width / 2;\n    ctx.fillText('' + this.string_number, x, dot_y + 4.5);\n\n    if (this.last_note != null) {\n      const end = this.last_note.getStemX() - this.note.getX() + 5;\n      ctx.strokeStyle = '#000000';\n      ctx.lineCap = 'round';\n      ctx.lineWidth = 0.6;\n      if (this.dashed) {\n        Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 3]);\n      } else {\n        Renderer.drawDashedLine(ctx, dot_x + 10, dot_y, dot_x + end, dot_y, [3, 0]);\n      }\n\n      let len;\n      let pattern;\n      switch (this.leg) {\n        case Renderer.LineEndType.UP:\n          len = -10;\n          pattern = this.dashed ? [3, 3] : [3, 0];\n          Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n          break;\n        case Renderer.LineEndType.DOWN:\n          len = 10;\n          pattern = this.dashed ? [3, 3] : [3, 0];\n          Renderer.drawDashedLine(ctx, dot_x + end, dot_y, dot_x + end, dot_y + len, pattern);\n          break;\n        default:\n          break;\n      }\n    }\n\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Larry Kuhns.\n//\n// ## Description\n//\n// This file implements articulations and accents as modifiers that can be\n// attached to notes. The complete list of articulations is available in\n// `tables.js` under `Vex.Flow.articulationCodes`.\n//\n// See `tests/articulation_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\nimport { Stem } from './stem';\n\n// To enable logging for this class. Set `Vex.Flow.Articulation.DEBUG` to `true`.\nfunction L(...args) { if (Articulation.DEBUG) Vex.L('Vex.Flow.Articulation', args); }\n\nconst { ABOVE, BELOW } = Modifier.Position;\n\nconst roundToNearestHalf = (mathFn, value) => mathFn(value / 0.5) * 0.5;\n\n// This includes both staff and ledger lines\nconst isWithinLines = (line, position) => position === ABOVE ? line <= 5 : line >= 1;\n\nconst getRoundingFunction = (line, position) => {\n  if (isWithinLines(line, position)) {\n    if (position === ABOVE) {\n      return Math.ceil;\n    } else {\n      return Math.floor;\n    }\n  } else {\n    return Math.round;\n  }\n};\n\nconst snapLineToStaff = (canSitBetweenLines, line, position, offsetDirection) => {\n  // Initially, snap to nearest staff line or space\n  const snappedLine = roundToNearestHalf(getRoundingFunction(line, position), line);\n  const canSnapToStaffSpace = canSitBetweenLines && isWithinLines(snappedLine, position);\n  const onStaffLine = snappedLine % 1 === 0;\n\n  if (canSnapToStaffSpace && onStaffLine) {\n    const HALF_STAFF_SPACE = 0.5;\n    return snappedLine + (HALF_STAFF_SPACE * -offsetDirection);\n  } else {\n    return snappedLine;\n  }\n};\n\nconst isStaveNote = (note) => {\n  const noteCategory = note.getCategory();\n  return noteCategory === 'stavenotes' || noteCategory === 'gracenotes';\n};\n\nconst getTopY = (note, textLine) => {\n  const stave = note.getStave();\n  const stemDirection = note.getStemDirection();\n  const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n\n  if (isStaveNote(note)) {\n    if (note.hasStem()) {\n      if (stemDirection === Stem.UP) {\n        return stemTipY;\n      } else {\n        return stemBaseY;\n      }\n    } else {\n      return Math.min(...note.getYs());\n    }\n  } else if (note.getCategory() === 'tabnotes') {\n    if (note.hasStem()) {\n      if (stemDirection === Stem.UP) {\n        return stemTipY;\n      } else {\n        return stave.getYForTopText(textLine);\n      }\n    } else {\n      return stave.getYForTopText(textLine);\n    }\n  } else {\n    throw new Vex.RERR(\n      'UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'\n    );\n  }\n};\n\nconst getBottomY = (note, textLine) => {\n  const stave = note.getStave();\n  const stemDirection = note.getStemDirection();\n  const { topY: stemTipY, baseY: stemBaseY } = note.getStemExtents();\n\n  if (isStaveNote(note)) {\n    if (note.hasStem()) {\n      if (stemDirection === Stem.UP) {\n        return stemBaseY;\n      } else {\n        return stemTipY;\n      }\n    } else {\n      return Math.max(...note.getYs());\n    }\n  } else if (note.getCategory() === 'tabnotes') {\n    if (note.hasStem()) {\n      if (stemDirection === Stem.UP) {\n        return stave.getYForBottomText(textLine);\n      } else {\n        return stemTipY;\n      }\n    } else {\n      return stave.getYForBottomText(textLine);\n    }\n  } else {\n    throw new Vex.RERR(\n      'UnknownCategory', 'Only can get the top and bottom ys of stavenotes and tabnotes'\n    );\n  }\n};\n\n// Gets the initial offset of the articulation from the y value of the starting position.\n// This is required because the top/bottom text positions already have spacing applied to\n// provide a \"visually pleasent\" default position. However the y values provided from\n// the stavenote's top/bottom do *not* have any pre-applied spacing. This function\n// normalizes this asymmetry.\nconst getInitialOffset = (note, position) => {\n  const isOnStemTip = (\n    (position === ABOVE && note.getStemDirection() === Stem.UP) ||\n    (position === BELOW && note.getStemDirection() === Stem.DOWN)\n  );\n\n  if (isStaveNote(note)) {\n    if (note.hasStem() && isOnStemTip) {\n      return 0.5;\n    } else {\n      // this amount is larger than the stem-tip offset because we start from\n      // the center of the notehead\n      return 1;\n    }\n  } else {\n    if (note.hasStem() && isOnStemTip) {\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n};\n\nexport class Articulation extends Modifier {\n  static get CATEGORY() { return 'articulations'; }\n  static get INITIAL_OFFSET() { return -0.5; }\n\n  // FIXME:\n  // Most of the complex formatting logic (ie: snapping to space) is\n  // actually done in .render(). But that logic belongs in this method.\n  //\n  // Unfortunately, this isn't possible because, by this point, stem lengths\n  // have not yet been finalized. Finalized stem lengths are required to determine the\n  // initial position of any stem-side articulation.\n  //\n  // This indicates that all objects should have their stave set before being\n  // formatted. It can't be an optional if you want accurate vertical positioning.\n  // Consistently positioned articulations that play nice with other modifiers\n  // won't be possible until we stop relying on render-time formatting.\n  //\n  // Ideally, when this function has completed, the vertical articulation positions\n  // should be ready to render without further adjustment. But the current state\n  // is far from this ideal.\n  static format(articulations, state) {\n    if (!articulations || articulations.length === 0) return false;\n\n    const isAbove = artic => artic.getPosition() === ABOVE;\n    const isBelow = artic => artic.getPosition() === BELOW;\n    const margin = 0.5;\n    const getIncrement = (articulation, line, position) =>\n      roundToNearestHalf(\n        getRoundingFunction(line, position),\n        (articulation.glyph.getMetrics().height / 10) + margin\n      );\n\n    articulations\n      .filter(isAbove)\n      .forEach(articulation => {\n        articulation.setTextLine(state.top_text_line);\n        state.top_text_line += getIncrement(articulation, state.top_text_line, ABOVE);\n      });\n\n    articulations\n      .filter(isBelow)\n      .forEach(articulation => {\n        articulation.setTextLine(state.text_line);\n        state.text_line += getIncrement(articulation, state.text_line, BELOW);\n      });\n\n    const width = articulations\n      .map(articulation => articulation.getWidth())\n      .reduce((maxWidth, articWidth) => Math.max(articWidth, maxWidth));\n\n    state.left_shift += width / 2;\n    state.right_shift += width / 2;\n    return true;\n  }\n\n  static easyScoreHook({ articulations }, note, builder) {\n    if (!articulations) return;\n\n    const articNameToCode = {\n      staccato: 'a.',\n      tenuto: 'a-',\n    };\n\n    articulations\n      .split(',')\n      .map(articString => articString.trim().split('.'))\n      .map(([name, position]) => {\n        const artic = { type: articNameToCode[name] };\n        if (position) artic.position = Modifier.PositionString[position];\n        return builder.getFactory().Articulation(artic);\n      })\n      .map(artic => note.addModifier(0, artic));\n  }\n\n  // Create a new articulation of type `type`, which is an entry in\n  // `Vex.Flow.articulationCodes` in `tables.js`.\n  constructor(type) {\n    super();\n    this.setAttribute('type', 'Articulation');\n\n    this.note = null;\n    this.index = null;\n    this.type = type;\n    this.position = BELOW;\n    this.render_options = {\n      font_scale: 38,\n    };\n\n    this.articulation = Flow.articulationCodes(this.type);\n    if (!this.articulation) {\n      throw new Vex.RERR('ArgumentError', `Articulation not found: ${this.type}`);\n    }\n\n    this.glyph = new Glyph(this.articulation.code, this.render_options.font_scale);\n\n    this.setWidth(this.glyph.getMetrics().width);\n  }\n\n  getCategory() { return Articulation.CATEGORY; }\n\n  // Render articulation in position next to note.\n  draw() {\n    const {\n      note, index, position, glyph,\n      articulation: { between_lines: canSitBetweenLines },\n      text_line: textLine,\n      context: ctx,\n    } = this;\n\n    this.checkContext();\n\n    if (!note || index == null) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw Articulation without a note and index.\");\n    }\n\n    this.setRendered();\n\n    const stave = note.getStave();\n    const staffSpace = stave.getSpacingBetweenLines();\n    const isTab = note.getCategory() === 'tabnotes';\n\n    // Articulations are centered over/under the note head.\n    const { x } = note.getModifierStartXY(position, index);\n    const shouldSitOutsideStaff = !canSitBetweenLines || isTab;\n\n    const initialOffset = getInitialOffset(note, position);\n\n    let y = {\n      [ABOVE]: () => {\n        glyph.setOrigin(0.5, 1);\n        const y = getTopY(note, textLine) - ((textLine + initialOffset) * staffSpace);\n        return shouldSitOutsideStaff\n          ? Math.min(stave.getYForTopText(Articulation.INITIAL_OFFSET), y)\n          : y;\n      },\n      [BELOW]: () => {\n        glyph.setOrigin(0.5, 0);\n        const y = getBottomY(note, textLine) + ((textLine + initialOffset) * staffSpace);\n        return shouldSitOutsideStaff\n          ? Math.max(stave.getYForBottomText(Articulation.INITIAL_OFFSET), y)\n          : y;\n      },\n    }[position]();\n\n    if (!isTab) {\n      const offsetDirection = position === ABOVE ? -1 : +1;\n      const noteLine = isTab ? note.positions[index].str : note.getKeyProps()[index].line;\n      const distanceFromNote = (note.getYs()[index] - y) / staffSpace;\n      const articLine = distanceFromNote + noteLine;\n      const snappedLine = snapLineToStaff(canSitBetweenLines, articLine, position, offsetDirection);\n\n      if (isWithinLines(snappedLine, position)) glyph.setOrigin(0.5, 0.5);\n\n      y += Math.abs(snappedLine - articLine) * staffSpace * offsetDirection;\n    }\n\n    L(`Rendering articulation at (x: ${x}, y: ${y})`);\n\n    glyph.render(ctx, x, y);\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A formatter for abstract tickable objects, such as notes, chords,\n// tabs, etc.\n\nimport { Vex } from './vex';\nimport { Tickable } from './tickable';\nimport { Fraction } from './fraction';\n\nexport class TickContext extends Tickable {\n  static getNextContext(tContext) {\n    const contexts = tContext.tContexts;\n    const index = contexts.indexOf(tContext);\n\n    return contexts[index + 1];\n  }\n\n  constructor() {\n    super();\n    this.setAttribute('type', 'TickContext');\n    this.currentTick = new Fraction(0, 1);\n    this.maxTicks = new Fraction(0, 1);\n    this.minTicks = null;\n    this.padding = 3;     // padding on each side (width += padding * 2)\n    this.x = 0;\n    this.xBase = 0;        // base x position without xOffset\n    this.xOffset = 0;      // xBase and xOffset are an alternative way to describe x (x = xB + xO)\n    this.tickables = [];   // Notes, tabs, chords, lyrics.\n    this.notePx = 0;       // width of widest note in this context\n    this.extraLeftPx = 0;  // Extra left pixels for modifers & displace notes\n    this.extraRightPx = 0; // Extra right pixels for modifers & displace notes\n    this.tContexts = [];   // Parent array of tick contexts\n  }\n\n  getX() { return this.x; }\n  setX(x) { this.x = x; this.xBase = x; this.xOffset = 0; return this; }\n  getXBase() { return this.xBase; } // use of xBase and xOffset is optional, avoids offset creep\n  setXBase(xBase) { this.xBase = xBase; this.x = xBase + this.xOffset; }\n  getXOffset() { return this.xOffset; }\n  setXOffset(xOffset) { this.xOffset = xOffset; this.x = this.xBase + xOffset; }\n  getWidth() { return this.width + (this.padding * 2); }\n  setPadding(padding) { this.padding = padding; return this; }\n  getMaxTicks() { return this.maxTicks; }\n  getMinTicks() { return this.minTicks; }\n  getTickables() { return this.tickables; }\n\n  getCenterAlignedTickables() {\n    return this.tickables.filter(tickable => tickable.isCenterAligned());\n  }\n\n  // Get widths context, note and left/right modifiers for formatting\n  getMetrics() {\n    const { width, notePx, extraLeftPx, extraRightPx } = this;\n    return { width, notePx, extraLeftPx, extraRightPx };\n  }\n\n  getCurrentTick() { return this.currentTick; }\n  setCurrentTick(tick) {\n    this.currentTick = tick;\n    this.preFormatted = false;\n  }\n\n  // ### DEPRECATED ###\n  // Get left & right pixels used for modifiers. THIS METHOD IS DEPRECATED. Use\n  // the getMetrics() method instead!\n  getExtraPx() {\n    let left_shift = 0;\n    let right_shift = 0;\n    let extraLeftPx = 0;\n    let extraRightPx = 0;\n    for (let i = 0; i < this.tickables.length; i++) {\n      extraLeftPx = Math.max(this.tickables[i].extraLeftPx || 0, extraLeftPx);\n      extraRightPx = Math.max(this.tickables[i].extraRightPx || 0, extraRightPx);\n      const mContext = this.tickables[i].modifierContext;\n      if (mContext && mContext != null) {\n        left_shift = Math.max(left_shift, mContext.state.left_shift);\n        right_shift = Math.max(right_shift, mContext.state.right_shift);\n      }\n    }\n    return {\n      left: left_shift,\n      right: right_shift,\n      extraLeft: extraLeftPx,\n      extraRight: extraRightPx,\n    };\n  }\n\n  addTickable(tickable) {\n    if (!tickable) {\n      throw new Vex.RERR('BadArgument', 'Invalid tickable added.');\n    }\n\n    if (!tickable.shouldIgnoreTicks()) {\n      this.ignore_ticks = false;\n\n      const ticks = tickable.getTicks();\n\n      if (ticks.greaterThan(this.maxTicks)) {\n        this.maxTicks = ticks.clone();\n      }\n\n      if (this.minTicks == null) {\n        this.minTicks = ticks.clone();\n      } else if (ticks.lessThan(this.minTicks)) {\n        this.minTicks = ticks.clone();\n      }\n    }\n\n    tickable.setTickContext(this);\n    this.tickables.push(tickable);\n    this.preFormatted = false;\n    return this;\n  }\n\n  preFormat() {\n    if (this.preFormatted) return this;\n\n    for (let i = 0; i < this.tickables.length; ++i) {\n      const tickable = this.tickables[i];\n      tickable.preFormat();\n      const metrics = tickable.getMetrics();\n\n      // Maintain max extra pixels from all tickables in the context\n      this.extraLeftPx = Math.max(this.extraLeftPx, metrics.extraLeftPx + metrics.modLeftPx);\n      this.extraRightPx = Math.max(this.extraRightPx, metrics.extraRightPx + metrics.modRightPx);\n\n      // Maintain the widest note for all tickables in the context\n      this.notePx = Math.max(this.notePx, metrics.noteWidth);\n\n      // Recalculate the tick context total width\n      this.width = this.notePx + this.extraLeftPx + this.extraRightPx;\n    }\n\n    return this;\n  }\n\n  postFormat() {\n    if (this.postFormatted) return this;\n    this.postFormatted = true;\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements ornaments as modifiers that can be\n// attached to notes. The complete list of ornaments is available in\n// `tables.js` under `Vex.Flow.ornamentCodes`.\n//\n// See `tests/ornament_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { TickContext } from './tickcontext';\nimport { StaveNote } from './stavenote';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.Ornament.DEBUG` to `true`.\nfunction L(...args) { if (Ornament.DEBUG) Vex.L('Vex.Flow.Ornament', args); }\n\nexport class Ornament extends Modifier {\n  static get CATEGORY() { return 'ornaments'; }\n\n  // ## Static Methods\n  // Arrange ornaments inside `ModifierContext`\n  static format(ornaments, state) {\n    if (!ornaments || ornaments.length === 0) return false;\n\n    let width = 0;\n    for (let i = 0; i < ornaments.length; ++i) {\n      const ornament = ornaments[i];\n      const increment = 2;\n\n      width = Math.max(ornament.getWidth(), width);\n\n      if (ornament.getPosition() === Modifier.Position.ABOVE) {\n        ornament.setTextLine(state.top_text_line);\n        state.top_text_line += increment;\n      } else {\n        ornament.setTextLine(state.text_line);\n        state.text_line += increment;\n      }\n    }\n\n    state.left_shift += width / 2;\n    state.right_shift += width / 2;\n    return true;\n  }\n\n  // Create a new ornament of type `type`, which is an entry in\n  // `Vex.Flow.ornamentCodes` in `tables.js`.\n  constructor(type) {\n    super();\n    this.setAttribute('type', 'Ornament');\n\n    this.note = null;\n    this.index = null;\n    this.type = type;\n    this.position = Modifier.Position.ABOVE;\n    this.delayed = false;\n\n    this.accidentalUpper = null;\n    this.accidentalLower = null;\n\n    this.render_options = {\n      font_scale: 38,\n      accidentalLowerPadding: 3,\n      accidentalUpperPadding: 3,\n    };\n\n    this.ornament = Flow.ornamentCodes(this.type);\n    if (!this.ornament) {\n      throw new Vex.RERR('ArgumentError', `Ornament not found: '${this.type}'`);\n    }\n\n    this.glyph = new Glyph(this.ornament.code, this.render_options.font_scale);\n    this.glyph.setOrigin(0.5, 1.0); // FIXME: SMuFL won't require a vertical origin shift\n  }\n\n  getCategory() { return Ornament.CATEGORY; }\n\n  // Set whether the ornament is to be delayed\n  setDelayed(delayed) { this.delayed = delayed; return this; }\n\n  // Set the upper accidental for the ornament\n  setUpperAccidental(accid) {\n    const scale = this.render_options.font_scale / 1.3;\n    this.accidentalUpper = new Glyph(Flow.accidentalCodes(accid).code, scale);\n    this.accidentalUpper.setOrigin(0.5, 1.0);\n    return this;\n  }\n\n  // Set the lower accidental for the ornament\n  setLowerAccidental(accid) {\n    const scale = this.render_options.font_scale / 1.3;\n    this.accidentalLower = new Glyph(Flow.accidentalCodes(accid).code, scale);\n    this.accidentalLower.setOrigin(0.5, 1.0);\n    return this;\n  }\n\n  // Render ornament in position next to note.\n  draw() {\n    this.checkContext();\n\n    if (!this.note || this.index == null) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw Ornament without a note and index.\");\n    }\n\n    this.setRendered();\n\n    const ctx = this.context;\n    const stemDir = this.note.getStemDirection();\n    const stave = this.note.getStave();\n\n    // Get stem extents\n    const stemExtents = this.note.getStem().getExtents();\n    let y = stemDir === StaveNote.STEM_DOWN ? stemExtents.baseY : stemExtents.topY;\n\n    // TabNotes don't have stems attached to them. Tab stems are rendered\n    // outside the stave.\n    if (this.note.getCategory() === 'tabnotes') {\n      if (this.note.hasStem()) {\n        if (stemDir === StaveNote.STEM_DOWN) {\n          y = stave.getYForTopText(this.text_line);\n        }\n      } else { // Without a stem\n        y = stave.getYForTopText(this.text_line);\n      }\n    }\n\n    const isPlacedOnNoteheadSide = stemDir === StaveNote.STEM_DOWN;\n    const spacing = stave.getSpacingBetweenLines();\n    let lineSpacing = 1;\n\n    // Beamed stems are longer than quarter note stems, adjust accordingly\n    if (!isPlacedOnNoteheadSide && this.note.beam) {\n      lineSpacing += 0.5;\n    }\n\n    const totalSpacing = spacing * (this.text_line + lineSpacing);\n    const glyphYBetweenLines = y - totalSpacing;\n\n    // Get initial coordinates for the modifier position\n    const start = this.note.getModifierStartXY(this.position, this.index);\n    let glyphX = start.x;\n    let glyphY = Math.min(stave.getYForTopText(this.text_line), glyphYBetweenLines);\n    glyphY += this.y_shift;\n\n    // Ajdust x position if ornament is delayed\n    if (this.delayed) {\n      let delayXShift = 0;\n      if (this.delayXShift !== undefined) {\n        delayXShift = this.delayXShift;\n      } else {\n        delayXShift += this.glyph.getMetrics().width / 2;\n        const nextContext = TickContext.getNextContext(this.note.getTickContext());\n        if (nextContext) {\n          delayXShift += (nextContext.getX() - glyphX) * 0.5;\n        } else {\n          delayXShift += (stave.x + stave.width - glyphX) * 0.5;\n        }\n        this.delayXShift = delayXShift;\n      }\n      glyphX += delayXShift;\n    }\n\n    L('Rendering ornament: ', this.ornament, glyphX, glyphY);\n\n    if (this.accidentalLower) {\n      this.accidentalLower.render(ctx, glyphX, glyphY);\n      glyphY -= this.accidentalLower.getMetrics().height;\n      glyphY -= this.render_options.accidentalLowerPadding;\n    }\n\n    this.glyph.render(ctx, glyphX, glyphY);\n    glyphY -= this.glyph.getMetrics().height;\n\n    if (this.accidentalUpper) {\n      glyphY -= this.render_options.accidentalUpperPadding;\n      this.accidentalUpper.render(ctx, glyphX, glyphY);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements text annotations as modifiers that can be attached to\n// notes.\n//\n// See `tests/annotation_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\n\n// To enable logging for this class. Set `Vex.Flow.Annotation.DEBUG` to `true`.\nfunction L(...args) { if (Annotation.DEBUG) Vex.L('Vex.Flow.Annotation', args); }\n\nexport class Annotation extends Modifier {\n  static get CATEGORY() { return 'annotations'; }\n\n  // Text annotations can be positioned and justified relative to the note.\n  static get Justify() {\n    return {\n      LEFT: 1,\n      CENTER: 2,\n      RIGHT: 3,\n      CENTER_STEM: 4,\n    };\n  }\n\n  static get JustifyString() {\n    return {\n      left: Annotation.Justify.LEFT,\n      right: Annotation.Justify.RIGHT,\n      center: Annotation.Justify.CENTER,\n      centerStem: Annotation.Justify.CENTER_STEM,\n    };\n  }\n\n  static get VerticalJustify() {\n    return {\n      TOP: 1,\n      CENTER: 2,\n      BOTTOM: 3,\n      CENTER_STEM: 4,\n    };\n  }\n\n  static get VerticalJustifyString() {\n    return {\n      above: Annotation.VerticalJustify.TOP,\n      top: Annotation.VerticalJustify.TOP,\n      below: Annotation.VerticalJustify.BOTTOM,\n      bottom: Annotation.VerticalJustify.BOTTOM,\n      center: Annotation.VerticalJustify.CENTER,\n      centerStem: Annotation.VerticalJustify.CENTER_STEM,\n    };\n  }\n\n  // Arrange annotations within a `ModifierContext`\n  static format(annotations, state) {\n    if (!annotations || annotations.length === 0) return false;\n\n    let width = 0;\n    for (let i = 0; i < annotations.length; ++i) {\n      const annotation = annotations[i];\n      width = Math.max(annotation.getWidth(), width);\n      if (annotation.getPosition() === Modifier.Position.ABOVE) {\n        annotation.setTextLine(state.top_text_line);\n        state.top_text_line++;\n      } else {\n        annotation.setTextLine(state.text_line);\n        state.text_line++;\n      }\n    }\n\n    state.left_shift += width / 2;\n    state.right_shift += width / 2;\n    return true;\n  }\n\n  // ## Prototype Methods\n  //\n  // Annotations inherit from `Modifier` and is positioned correctly when\n  // in a `ModifierContext`.\n  // Create a new `Annotation` with the string `text`.\n  constructor(text) {\n    super();\n    this.setAttribute('type', 'Annotation');\n\n    this.note = null;\n    this.index = null;\n    this.text = text;\n    this.justification = Annotation.Justify.CENTER;\n    this.vert_justification = Annotation.VerticalJustify.TOP;\n    this.font = {\n      family: 'Arial',\n      size: 10,\n      weight: '',\n    };\n\n    // The default width is calculated from the text.\n    this.setWidth(Flow.textWidth(text));\n  }\n\n  getCategory() { return Annotation.CATEGORY; }\n\n  // Set font family, size, and weight. E.g., `Arial`, `10pt`, `Bold`.\n  setFont(family, size, weight) {\n    this.font = { family, size, weight };\n    return this;\n  }\n\n  // Set vertical position of text (above or below stave). `just` must be\n  // a value in `Annotation.VerticalJustify`.\n  setVerticalJustification(just) {\n    this.vert_justification = typeof (just) === 'string'\n      ? Annotation.VerticalJustifyString[just]\n      : just;\n    return this;\n  }\n\n  // Get and set horizontal justification. `justification` is a value in\n  // `Annotation.Justify`.\n  getJustification() { return this.justification; }\n  setJustification(just) {\n    this.justification = typeof (just) === 'string'\n      ? Annotation.JustifyString[just]\n      : just;\n    return this;\n  }\n\n  // Render text beside the note.\n  draw() {\n    this.checkContext();\n\n    if (!this.note) {\n      throw new Vex.RERR(\n        'NoNoteForAnnotation', \"Can't draw text annotation without an attached note.\"\n      );\n    }\n\n    this.setRendered();\n    const start = this.note.getModifierStartXY(Modifier.Position.ABOVE,\n      this.index);\n\n    // We're changing context parameters. Save current state.\n    this.context.save();\n    this.context.setFont(this.font.family, this.font.size, this.font.weight);\n    const text_width = this.context.measureText(this.text).width;\n\n    // Estimate text height to be the same as the width of an 'm'.\n    //\n    // This is a hack to work around the inability to measure text height\n    // in HTML5 Canvas (and SVG).\n    const text_height = this.context.measureText('m').width;\n    let x;\n    let y;\n\n    if (this.justification === Annotation.Justify.LEFT) {\n      x = start.x;\n    } else if (this.justification === Annotation.Justify.RIGHT) {\n      x = start.x - text_width;\n    } else if (this.justification === Annotation.Justify.CENTER) {\n      x = start.x - text_width / 2;\n    } else /* CENTER_STEM */ {\n      x = this.note.getStemX() - text_width / 2;\n    }\n\n    let stem_ext;\n    let spacing;\n    const has_stem = this.note.hasStem();\n    const stave = this.note.getStave();\n\n    // The position of the text varies based on whether or not the note\n    // has a stem.\n    if (has_stem) {\n      stem_ext = this.note.getStem().getExtents();\n      spacing = stave.getSpacingBetweenLines();\n    }\n\n    if (this.vert_justification === Annotation.VerticalJustify.BOTTOM) {\n      // HACK: We need to compensate for the text's height since its origin\n      // is bottom-right.\n      y = stave.getYForBottomText(this.text_line + Flow.TEXT_HEIGHT_OFFSET_HACK);\n      if (has_stem) {\n        const stem_base = (this.note.getStemDirection() === 1 ? stem_ext.baseY : stem_ext.topY);\n        y = Math.max(y, stem_base + (spacing * (this.text_line + 2)));\n      }\n    } else if (this.vert_justification === Annotation.VerticalJustify.CENTER) {\n      const yt = this.note.getYForTopText(this.text_line) - 1;\n      const yb = stave.getYForBottomText(this.text_line);\n      y = yt + (yb - yt) / 2 + text_height / 2;\n    } else if (this.vert_justification === Annotation.VerticalJustify.TOP) {\n      y = Math.min(stave.getYForTopText(this.text_line), this.note.getYs()[0] - 10);\n      if (has_stem) {\n        y = Math.min(y, (stem_ext.topY - 5) - (spacing * this.text_line));\n      }\n    } else /* CENTER_STEM */ {\n      const extents = this.note.getStemExtents();\n      y = extents.topY + (extents.baseY - extents.topY) / 2 +\n        text_height / 2;\n    }\n\n    L('Rendering annotation: ', this.text, x, y);\n    this.context.fillText(this.text, x, y);\n    this.context.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements tablature bends.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\n/**\n   @param text Text for bend (\"Full\", \"Half\", etc.) (DEPRECATED)\n   @param release If true, render a release. (DEPRECATED)\n   @param phrase If set, ignore \"text\" and \"release\", and use the more\n                 sophisticated phrase specified.\n\n   Example of a phrase:\n\n     [{\n       type: UP,\n       text: \"whole\"\n       width: 8;\n     },\n     {\n       type: DOWN,\n       text: \"whole\"\n       width: 8;\n     },\n     {\n       type: UP,\n       text: \"half\"\n       width: 8;\n     },\n     {\n       type: UP,\n       text: \"whole\"\n       width: 8;\n     },\n     {\n       type: DOWN,\n       text: \"1 1/2\"\n       width: 8;\n     }]\n */\nexport class Bend extends Modifier {\n  static get CATEGORY() { return 'bends'; }\n\n  static get UP() {\n    return 0;\n  }\n  static get DOWN() {\n    return 1;\n  }\n\n  // ## Static Methods\n  // Arrange bends in `ModifierContext`\n  static format(bends, state) {\n    if (!bends || bends.length === 0) return false;\n\n    let last_width = 0;\n    // Bends are always on top.\n    const text_line = state.top_text_line;\n\n    // Format Bends\n    for (let i = 0; i < bends.length; ++i) {\n      const bend = bends[i];\n      bend.setXShift(last_width);\n      last_width = bend.getWidth();\n      bend.setTextLine(text_line);\n    }\n\n    state.right_shift += last_width;\n    state.top_text_line += 1;\n    return true;\n  }\n\n  // ## Prototype Methods\n  constructor(text, release, phrase) {\n    super();\n    this.setAttribute('type', 'Bend');\n\n    this.text = text;\n    this.x_shift = 0;\n    this.release = release || false;\n    this.font = '10pt Arial';\n    this.render_options = {\n      line_width: 1.5,\n      line_style: '#777777',\n      bend_width: 8,\n      release_width: 8,\n    };\n\n    if (phrase) {\n      this.phrase = phrase;\n    } else {\n      // Backward compatibility\n      this.phrase = [{ type: Bend.UP, text: this.text }];\n      if (this.release) this.phrase.push({ type: Bend.DOWN, text: '' });\n    }\n\n    this.updateWidth();\n  }\n\n  getCategory() { return Bend.CATEGORY; }\n\n  setXShift(value) {\n    this.x_shift = value;\n    this.updateWidth();\n  }\n  setFont(font) { this.font = font; return this; }\n  getText() { return this.text; }\n  updateWidth() {\n    const that = this;\n\n    function measure_text(text) {\n      let text_width;\n      if (that.context) {\n        text_width = that.context.measureText(text).width;\n      } else {\n        text_width = Flow.textWidth(text);\n      }\n\n      return text_width;\n    }\n\n    let total_width = 0;\n    for (let i = 0; i < this.phrase.length; ++i) {\n      const bend = this.phrase[i];\n      if ('width' in bend) {\n        total_width += bend.width;\n      } else {\n        const additional_width = (bend.type === Bend.UP) ?\n          this.render_options.bend_width : this.render_options.release_width;\n\n        bend.width = Vex.Max(additional_width, measure_text(bend.text)) + 3;\n        bend.draw_width = bend.width / 2;\n        total_width += bend.width;\n      }\n    }\n\n    this.setWidth(total_width + this.x_shift);\n    return this;\n  }\n  draw() {\n    this.checkContext();\n    if (!(this.note && (this.index != null))) {\n      throw new Vex.RERR('NoNoteForBend', \"Can't draw bend without a note or index.\");\n    }\n\n    this.setRendered();\n\n    const start = this.note.getModifierStartXY(Modifier.Position.RIGHT,\n      this.index);\n    start.x += 3;\n    start.y += 0.5;\n    const x_shift = this.x_shift;\n\n    const ctx = this.context;\n    const bend_height = this.note.getStave().getYForTopText(this.text_line) + 3;\n    const annotation_y = this.note.getStave().getYForTopText(this.text_line) - 1;\n    const that = this;\n\n    function renderBend(x, y, width, height) {\n      const cp_x = x + width;\n      const cp_y = y;\n\n      ctx.save();\n      ctx.beginPath();\n      ctx.setLineWidth(that.render_options.line_width);\n      ctx.setStrokeStyle(that.render_options.line_style);\n      ctx.setFillStyle(that.render_options.line_style);\n      ctx.moveTo(x, y);\n      ctx.quadraticCurveTo(cp_x, cp_y, x + width, height);\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    function renderRelease(x, y, width, height) {\n      ctx.save();\n      ctx.beginPath();\n      ctx.setLineWidth(that.render_options.line_width);\n      ctx.setStrokeStyle(that.render_options.line_style);\n      ctx.setFillStyle(that.render_options.line_style);\n      ctx.moveTo(x, height);\n      ctx.quadraticCurveTo(\n        x + width, height,\n        x + width, y);\n      ctx.stroke();\n      ctx.restore();\n    }\n\n    function renderArrowHead(x, y, direction) {\n      const width = 4;\n      const dir = direction || 1;\n\n      ctx.beginPath();\n      ctx.moveTo(x, y);\n      ctx.lineTo(x - width, y + width * dir);\n      ctx.lineTo(x + width, y + width * dir);\n      ctx.closePath();\n      ctx.fill();\n    }\n\n    function renderText(x, text) {\n      ctx.save();\n      ctx.setRawFont(that.font);\n      const render_x = x - (ctx.measureText(text).width / 2);\n      ctx.fillText(text, render_x, annotation_y);\n      ctx.restore();\n    }\n\n    let last_bend = null;\n    let last_drawn_width = 0;\n    for (let i = 0; i < this.phrase.length; ++i) {\n      const bend = this.phrase[i];\n      if (i === 0) bend.draw_width += x_shift;\n\n      last_drawn_width = bend.draw_width +\n        (last_bend ? last_bend.draw_width : 0) -\n        (i === 1 ? x_shift : 0);\n      if (bend.type === Bend.UP) {\n        if (last_bend && last_bend.type === Bend.UP) {\n          renderArrowHead(start.x, bend_height);\n        }\n\n        renderBend(start.x, start.y, last_drawn_width, bend_height);\n      }\n\n      if (bend.type === Bend.DOWN) {\n        if (last_bend && last_bend.type === Bend.UP) {\n          renderRelease(start.x, start.y, last_drawn_width, bend_height);\n        }\n\n        if (last_bend && last_bend.type === Bend.DOWN) {\n          renderArrowHead(start.x, start.y, -1);\n          renderRelease(start.x, start.y, last_drawn_width, bend_height);\n        }\n\n        if (last_bend === null) {\n          last_drawn_width = bend.draw_width;\n          renderRelease(start.x, start.y, last_drawn_width, bend_height);\n        }\n      }\n\n      renderText(start.x + last_drawn_width, bend.text);\n      last_bend = bend;\n      last_bend.x = start.x;\n\n      start.x += last_drawn_width;\n    }\n\n    // Final arrowhead and text\n    if (last_bend.type === Bend.UP) {\n      renderArrowHead(last_bend.x + last_drawn_width, bend_height);\n    } else if (last_bend.type === Bend.DOWN) {\n      renderArrowHead(last_bend.x + last_drawn_width, start.y, -1);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements vibratos.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Bend } from './bend';\n\nexport class Vibrato extends Modifier {\n  static get CATEGORY() { return 'vibratos'; }\n\n  // ## Static Methods\n  // Arrange vibratos inside a `ModifierContext`.\n  static format(vibratos, state, context) {\n    if (!vibratos || vibratos.length === 0) return false;\n\n    // Vibratos are always on top.\n    let text_line = state.top_text_line;\n    let width = 0;\n    let shift = state.right_shift - 7;\n\n    // If there's a bend, drop the text line\n    const bends = context.getModifiers(Bend.CATEGORY);\n    if (bends && bends.length > 0) {\n      text_line--;\n    }\n\n    // Format Vibratos\n    for (let i = 0; i < vibratos.length; ++i) {\n      const vibrato = vibratos[i];\n      vibrato.setXShift(shift);\n      vibrato.setTextLine(text_line);\n      width += vibrato.getWidth();\n      shift += width;\n    }\n\n    state.right_shift += width;\n    state.top_text_line += 1;\n    return true;\n  }\n\n  // ## Prototype Methods\n  constructor() {\n    super();\n    this.setAttribute('type', 'Vibrato');\n\n    this.position = Modifier.Position.RIGHT;\n    this.render_options = {\n      harsh: false,\n      vibrato_width: 20,\n      wave_height: 6,\n      wave_width: 4,\n      wave_girth: 2,\n    };\n\n    this.setVibratoWidth(this.render_options.vibrato_width);\n  }\n  getCategory() { return Vibrato.CATEGORY; }\n  setHarsh(harsh) { this.render_options.harsh = harsh; return this; }\n  setVibratoWidth(width) {\n    this.render_options.vibrato_width = width;\n    this.setWidth(width);\n    return this;\n  }\n\n  draw() {\n    const ctx = this.checkContext();\n\n    if (!this.note) {\n      throw new Vex.RERR('NoNoteForVibrato', \"Can't draw vibrato without an attached note.\");\n    }\n\n    this.setRendered();\n    const start = this.note.getModifierStartXY(Modifier.Position.RIGHT, this.index);\n\n    const vx = start.x + this.x_shift;\n    const vy = this.note.getYForTopText(this.text_line) + 2;\n\n    Vibrato.renderVibrato(ctx, vx, vy, this.render_options);\n  }\n\n  // Static rendering method that can be called from\n  // other classes (e.g. VibratoBracket)\n  static renderVibrato(ctx, x, y, opts) {\n    const { harsh, vibrato_width, wave_width, wave_girth, wave_height } = opts;\n    const num_waves = vibrato_width / wave_width;\n\n    ctx.beginPath();\n\n    let i;\n    if (harsh) {\n      ctx.moveTo(x, y + wave_girth + 1);\n      for (i = 0; i < num_waves / 2; ++i) {\n        ctx.lineTo(x + wave_width, y - (wave_height / 2));\n        x += wave_width;\n        ctx.lineTo(x + wave_width, y + (wave_height / 2));\n        x += wave_width;\n      }\n      for (i = 0; i < num_waves / 2; ++i) {\n        ctx.lineTo(x - wave_width, (y - (wave_height / 2)) + wave_girth + 1);\n        x -= wave_width;\n        ctx.lineTo(x - wave_width, (y + (wave_height / 2)) + wave_girth + 1);\n        x -= wave_width;\n      }\n      ctx.fill();\n    } else {\n      ctx.moveTo(x, y + wave_girth);\n      for (i = 0; i < num_waves / 2; ++i) {\n        ctx.quadraticCurveTo(x + (wave_width / 2), y - (wave_height / 2), x + wave_width, y);\n        x += wave_width;\n        ctx.quadraticCurveTo(x + (wave_width / 2), y + (wave_height / 2), x + wave_width, y);\n        x += wave_width;\n      }\n\n      for (i = 0; i < num_waves / 2; ++i) {\n        ctx.quadraticCurveTo(\n          x - (wave_width / 2),\n          (y + (wave_height / 2)) + wave_girth,\n          x - wave_width, y + wave_girth);\n        x -= wave_width;\n        ctx.quadraticCurveTo(\n          x - (wave_width / 2),\n          (y - (wave_height / 2)) + wave_girth,\n          x - wave_width, y + wave_girth);\n        x -= wave_width;\n      }\n      ctx.fill();\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements various types of modifiers to notes (e.g. bends,\n// fingering positions etc.)\n\nimport { Vex } from './vex';\nimport { StaveNote } from './stavenote';\nimport { Dot } from './dot';\nimport { FretHandFinger } from './frethandfinger';\nimport { Accidental } from './accidental';\nimport { NoteSubGroup } from './notesubgroup';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { Stroke } from './strokes';\nimport { StringNumber } from './stringnumber';\nimport { Articulation } from './articulation';\nimport { Ornament } from './ornament';\nimport { Annotation } from './annotation';\nimport { Bend } from './bend';\nimport { Vibrato } from './vibrato';\n\n// To enable logging for this class. Set `Vex.Flow.ModifierContext.DEBUG` to `true`.\nfunction L(...args) { if (ModifierContext.DEBUG) Vex.L('Vex.Flow.ModifierContext', args); }\n\nexport class ModifierContext {\n  constructor() {\n    // Current modifiers\n    this.modifiers = {};\n\n    // Formatting data.\n    this.preFormatted = false;\n    this.postFormatted = false;\n    this.width = 0;\n    this.spacing = 0;\n    this.state = {\n      left_shift: 0,\n      right_shift: 0,\n      text_line: 0,\n      top_text_line: 0,\n    };\n\n    // Add new modifiers to this array. The ordering is significant -- lower\n    // modifiers are formatted and rendered before higher ones.\n    this.PREFORMAT = [\n      StaveNote,\n      Dot,\n      FretHandFinger,\n      Accidental,\n      Stroke,\n      GraceNoteGroup,\n      NoteSubGroup,\n      StringNumber,\n      Articulation,\n      Ornament,\n      Annotation,\n      Bend,\n      Vibrato,\n    ];\n\n    // If post-formatting is required for an element, add it to this array.\n    this.POSTFORMAT = [StaveNote];\n  }\n\n  addModifier(modifier) {\n    const type = modifier.getCategory();\n    if (!this.modifiers[type]) this.modifiers[type] = [];\n    this.modifiers[type].push(modifier);\n    modifier.setModifierContext(this);\n    this.preFormatted = false;\n    return this;\n  }\n\n  getModifiers(type) { return this.modifiers[type]; }\n  getWidth() { return this.width; }\n  getExtraLeftPx() { return this.state.left_shift; }\n  getExtraRightPx() { return this.state.right_shift; }\n  getState() { return this.state; }\n\n  getMetrics() {\n    if (!this.formatted) {\n      throw new Vex.RERR('UnformattedModifier', 'Unformatted modifier has no metrics.');\n    }\n\n    return {\n      width: this.state.left_shift + this.state.right_shift + this.spacing,\n      spacing: this.spacing,\n      extra_left_px: this.state.left_shift,\n      extra_right_px: this.state.right_shift,\n    };\n  }\n\n  preFormat() {\n    if (this.preFormatted) return;\n    this.PREFORMAT.forEach((modifier) => {\n      L('Preformatting ModifierContext: ', modifier.CATEGORY);\n      modifier.format(this.getModifiers(modifier.CATEGORY), this.state, this);\n    });\n\n    // Update width of this modifier context\n    this.width = this.state.left_shift + this.state.right_shift;\n    this.preFormatted = true;\n  }\n\n  postFormat() {\n    if (this.postFormatted) return;\n    this.POSTFORMAT.forEach((modifier) => {\n      L('Postformatting ModifierContext: ', modifier.CATEGORY);\n      modifier.postFormat(this.getModifiers(modifier.CATEGORY), this);\n    });\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the formatting and layout algorithms that are used\n// to position notes in a voice. The algorithm can align multiple voices both\n// within a stave, and across multiple staves.\n//\n// To do this, the formatter breaks up voices into a grid of rational-valued\n// `ticks`, to which each note is assigned. Then, minimum widths are assigned\n// to each tick based on the widths of the notes and modifiers in that tick. This\n// establishes the smallest amount of space required for each tick.\n//\n// Finally, the formatter distributes the left over space proportionally to\n// all the ticks, setting the `x` values of the notes in each tick.\n//\n// See `tests/formatter_tests.js` for usage examples. The helper functions included\n// here (`FormatAndDraw`, `FormatAndDrawTab`) also serve as useful usage examples.\n\nimport { Vex } from './vex';\nimport { Beam } from './beam';\nimport { Flow } from './tables';\nimport { Fraction } from './fraction';\nimport { Voice } from './voice';\nimport { StaveConnector } from './staveconnector';\nimport { StaveNote } from './stavenote';\nimport { Note } from './note';\nimport { ModifierContext } from './modifiercontext';\nimport { TickContext } from './tickcontext';\n\n// To enable logging for this class. Set `Vex.Flow.Formatter.DEBUG` to `true`.\nfunction L(...args) { if (Formatter.DEBUG) Vex.L('Vex.Flow.Formatter', args); }\n\n// Helper function to locate the next non-rest note(s).\nfunction lookAhead(notes, restLine, i, compare) {\n  // If no valid next note group, nextRestLine is same as current.\n  let nextRestLine = restLine;\n\n  // Get the rest line for next valid non-rest note group.\n  for (i += 1; i < notes.length; i += 1) {\n    const note = notes[i];\n    if (!note.isRest() && !note.shouldIgnoreTicks()) {\n      nextRestLine = note.getLineForRest();\n      break;\n    }\n  }\n\n  // Locate the mid point between two lines.\n  if (compare && restLine !== nextRestLine) {\n    const top = Math.max(restLine, nextRestLine);\n    const bot = Math.min(restLine, nextRestLine);\n    nextRestLine = Vex.MidLine(top, bot);\n  }\n  return nextRestLine;\n}\n\n// Take an array of `voices` and place aligned tickables in the same context. Returns\n// a mapping from `tick` to `ContextType`, a list of `tick`s, and the resolution\n// multiplier.\n//\n// Params:\n// * `voices`: Array of `Voice` instances.\n// * `ContextType`: A context class (e.g., `ModifierContext`, `TickContext`)\n// * `addToContext`: Function to add tickable to context.\nfunction createContexts(voices, ContextType, addToContext) {\n  if (!voices || !voices.length) {\n    throw new Vex.RERR('BadArgument', 'No voices to format');\n  }\n\n  // Find out highest common multiple of resolution multipliers.\n  // The purpose of this is to find out a common denominator\n  // for all fractional tick values in all tickables of all voices,\n  // so that the values can be expanded and the numerator used\n  // as an integer tick value.\n  const totalTicks = voices[0].getTotalTicks();\n  const resolutionMultiplier = voices.reduce((resolutionMultiplier, voice) => {\n    if (!voice.getTotalTicks().equals(totalTicks)) {\n      throw new Vex.RERR(\n        'TickMismatch', 'Voices should have same total note duration in ticks.'\n      );\n    }\n\n    if (voice.getMode() === Voice.Mode.STRICT && !voice.isComplete()) {\n      throw new Vex.RERR(\n        'IncompleteVoice', 'Voice does not have enough notes.'\n      );\n    }\n\n    return Math.max(\n      resolutionMultiplier,\n      Fraction.LCM(resolutionMultiplier, voice.getResolutionMultiplier())\n    );\n  }, 1);\n\n  // Initialize tick maps.\n  const tickToContextMap = {};\n  const tickList = [];\n  const contexts = [];\n\n  // For each voice, extract notes and create a context for every\n  // new tick that hasn't been seen before.\n  voices.forEach(voice => {\n    // Use resolution multiplier as denominator to expand ticks\n    // to suitable integer values, so that no additional expansion\n    // of fractional tick values is needed.\n    const ticksUsed = new Fraction(0, resolutionMultiplier);\n\n    voice.getTickables().forEach(tickable => {\n      const integerTicks = ticksUsed.numerator;\n\n      // If we have no tick context for this tick, create one.\n      if (!tickToContextMap[integerTicks]) {\n        const newContext = new ContextType();\n        contexts.push(newContext);\n        tickToContextMap[integerTicks] = newContext;\n      }\n\n      // Add this tickable to the TickContext.\n      addToContext(tickable, tickToContextMap[integerTicks]);\n\n      // Maintain a sorted list of tick contexts.\n      tickList.push(integerTicks);\n      ticksUsed.add(tickable.getTicks());\n    });\n  });\n\n  return {\n    map: tickToContextMap,\n    array: contexts,\n    list: Vex.SortAndUnique(tickList, (a, b) => a - b, (a, b) => a === b),\n    resolutionMultiplier,\n  };\n}\n\nexport class Formatter {\n  // Helper function to layout \"notes\" one after the other without\n  // regard for proportions. Useful for tests and debugging.\n  static SimpleFormat(notes, x = 0, { paddingBetween = 10 } = {}) {\n    notes.reduce((x, note) => {\n      note.addToModifierContext(new ModifierContext());\n      const tick = new TickContext().addTickable(note).preFormat();\n      const extra = tick.getExtraPx();\n      tick.setX(x + extra.left);\n\n      return x + tick.getWidth() + extra.right + paddingBetween;\n    }, x);\n  }\n\n  // Helper function to plot formatter debug info.\n  static plotDebugging(ctx, formatter, xPos, y1, y2) {\n    const x = xPos + Note.STAVEPADDING;\n    const contextGaps = formatter.contextGaps;\n    function stroke(x1, x2, color) {\n      ctx.beginPath();\n      ctx.setStrokeStyle(color);\n      ctx.setFillStyle(color);\n      ctx.setLineWidth(1);\n      ctx.fillRect(x1, y1, x2 - x1, y2 - y1);\n    }\n\n    ctx.save();\n    ctx.setFont('Arial', 8, '');\n\n    contextGaps.gaps.forEach(gap => {\n      stroke(x + gap.x1, x + gap.x2, '#aaa');\n      // Vex.drawDot(ctx, xPos + gap.x1, yPos, 'blue');\n      ctx.fillText(Math.round(gap.x2 - gap.x1), x + gap.x1, y2 + 12);\n    });\n\n    ctx.fillText(Math.round(contextGaps.total) + 'px', x - 20, y2 + 12);\n    ctx.setFillStyle('red');\n\n    ctx.fillText('Loss: ' +\n      formatter.lossHistory.map(loss => Math.round(loss)), x - 20, y2 + 22);\n    ctx.restore();\n  }\n\n  // Helper function to format and draw a single voice. Returns a bounding\n  // box for the notation.\n  //\n  // Parameters:\n  // * `ctx` - The rendering context\n  // * `stave` - The stave to which to draw (`Stave` or `TabStave`)\n  // * `notes` - Array of `Note` instances (`StaveNote`, `TextNote`, `TabNote`, etc.)\n  // * `params` - One of below:\n  //    * Setting `autobeam` only `(context, stave, notes, true)` or\n  //      `(ctx, stave, notes, {autobeam: true})`\n  //    * Setting `align_rests` a struct is needed `(context, stave, notes, {align_rests: true})`\n  //    * Setting both a struct is needed `(context, stave, notes, {\n  //      autobeam: true, align_rests: true})`\n  //\n  // `autobeam` automatically generates beams for the notes.\n  // `align_rests` aligns rests with nearby notes.\n  static FormatAndDraw(ctx, stave, notes, params) {\n    const options = {\n      auto_beam: false,\n      align_rests: false,\n    };\n\n    if (typeof params === 'object') {\n      Vex.Merge(options, params);\n    } else if (typeof params === 'boolean') {\n      options.auto_beam = params;\n    }\n\n    // Start by creating a voice and adding all the notes to it.\n    const voice = new Voice(Flow.TIME4_4)\n      .setMode(Voice.Mode.SOFT)\n      .addTickables(notes);\n\n    // Then create beams, if requested.\n    const beams = options.auto_beam ? Beam.applyAndGetBeams(voice) : [];\n\n    // Instantiate a `Formatter` and format the notes.\n    new Formatter()\n      .joinVoices([voice], { align_rests: options.align_rests })\n      .formatToStave([voice], stave, { align_rests: options.align_rests, stave });\n\n    // Render the voice and beams to the stave.\n    voice.setStave(stave).draw(ctx, stave);\n    beams.forEach(beam => beam.setContext(ctx).draw());\n\n    // Return the bounding box of the voice.\n    return voice.getBoundingBox();\n  }\n\n  // Helper function to format and draw aligned tab and stave notes in two\n  // separate staves.\n  //\n  // Parameters:\n  // * `ctx` - The rendering context\n  // * `tabstave` - A `TabStave` instance on which to render `TabNote`s.\n  // * `stave` - A `Stave` instance on which to render `Note`s.\n  // * `notes` - Array of `Note` instances for the stave (`StaveNote`, `BarNote`, etc.)\n  // * `tabnotes` - Array of `Note` instances for the tab stave (`TabNote`, `BarNote`, etc.)\n  // * `autobeam` - Automatically generate beams.\n  // * `params` - A configuration object:\n  //    * `autobeam` automatically generates beams for the notes.\n  //    * `align_rests` aligns rests with nearby notes.\n  static FormatAndDrawTab(ctx, tabstave, stave, tabnotes, notes, autobeam, params) {\n    const opts = {\n      auto_beam: autobeam,\n      align_rests: false,\n    };\n\n    if (typeof params === 'object') {\n      Vex.Merge(opts, params);\n    } else if (typeof params === 'boolean') {\n      opts.auto_beam = params;\n    }\n\n    // Create a `4/4` voice for `notes`.\n    const notevoice = new Voice(Flow.TIME4_4)\n      .setMode(Voice.Mode.SOFT)\n      .addTickables(notes);\n\n    // Create a `4/4` voice for `tabnotes`.\n    const tabvoice = new Voice(Flow.TIME4_4)\n      .setMode(Voice.Mode.SOFT)\n      .addTickables(tabnotes);\n\n    // Then create beams, if requested.\n    const beams = opts.auto_beam ? Beam.applyAndGetBeams(notevoice) : [];\n\n    // Instantiate a `Formatter` and align tab and stave notes.\n    new Formatter()\n      .joinVoices([notevoice], { align_rests: opts.align_rests })\n      .joinVoices([tabvoice])\n      .formatToStave([notevoice, tabvoice], stave, { align_rests: opts.align_rests });\n\n    // Render voices and beams to staves.\n    notevoice.draw(ctx, stave);\n    tabvoice.draw(ctx, tabstave);\n    beams.forEach(beam => beam.setContext(ctx).draw());\n\n    // Draw a connector between tab and note staves.\n    new StaveConnector(stave, tabstave).setContext(ctx).draw();\n  }\n\n  // Auto position rests based on previous/next note positions.\n  //\n  // Params:\n  // * `notes`: An array of notes.\n  // * `alignAllNotes`: If set to false, only aligns non-beamed notes.\n  // * `alignTuplets`: If set to false, ignores tuplets.\n  static AlignRestsToNotes(notes, alignAllNotes, alignTuplets) {\n    notes.forEach((note, index) => {\n      if (note instanceof StaveNote && note.isRest()) {\n        if (note.tuplet && !alignTuplets) return;\n\n        // If activated rests not on default can be rendered as specified.\n        const position = note.getGlyph().position.toUpperCase();\n        if (position !== 'R/4' && position !== 'B/4') return;\n\n        if (alignAllNotes || note.beam != null) {\n          // Align rests with previous/next notes.\n          const props = note.getKeyProps()[0];\n          if (index === 0) {\n            props.line = lookAhead(notes, props.line, index, false);\n            note.setKeyLine(0, props.line);\n          } else if (index > 0 && index < notes.length) {\n            // If previous note is a rest, use its line number.\n            let restLine;\n            if (notes[index - 1].isRest()) {\n              restLine = notes[index - 1].getKeyProps()[0].line;\n              props.line = restLine;\n            } else {\n              restLine = notes[index - 1].getLineForRest();\n              // Get the rest line for next valid non-rest note group.\n              props.line = lookAhead(notes, restLine, index, true);\n            }\n            note.setKeyLine(0, props.line);\n          }\n        }\n      }\n    });\n\n    return this;\n  }\n\n  constructor() {\n    // Minimum width required to render all the notes in the voices.\n    this.minTotalWidth = 0;\n\n    // This is set to `true` after `minTotalWidth` is calculated.\n    this.hasMinTotalWidth = false;\n\n    // Total number of ticks in the voice.\n    this.totalTicks = new Fraction(0, 1);\n\n    // Arrays of tick and modifier contexts.\n    this.tickContexts = null;\n    this.modiferContexts = null;\n\n    // Gaps between contexts, for free movement of notes post\n    // formatting.\n    this.contextGaps = {\n      total: 0,\n      gaps: [],\n    };\n\n    this.voices = [];\n  }\n\n  // Find all the rests in each of the `voices` and align them\n  // to neighboring notes. If `alignAllNotes` is `false`, then only\n  // align non-beamed notes.\n  alignRests(voices, alignAllNotes) {\n    if (!voices || !voices.length) {\n      throw new Vex.RERR('BadArgument', 'No voices to format rests');\n    }\n\n    voices.forEach(voice =>\n      Formatter.AlignRestsToNotes(voice.getTickables(), alignAllNotes));\n  }\n\n  // Calculate the minimum width required to align and format `voices`.\n  preCalculateMinTotalWidth(voices) {\n    // Cache results.\n    if (this.hasMinTotalWidth) return this.minTotalWidth;\n\n    // Create tick contexts if not already created.\n    if (!this.tickContexts) {\n      if (!voices) {\n        throw new Vex.RERR(\n          'BadArgument', \"'voices' required to run preCalculateMinTotalWidth\"\n        );\n      }\n\n      this.createTickContexts(voices);\n    }\n\n    const { list: contextList, map: contextMap } = this.tickContexts;\n\n    // Go through each tick context and calculate total width.\n    this.minTotalWidth = contextList\n      .map(tick => {\n        const context = contextMap[tick];\n        context.preFormat();\n        return context.getWidth();\n      })\n      .reduce((a, b) => a + b, 0);\n\n    this.hasMinTotalWidth = true;\n\n    return this.minTotalWidth;\n  }\n\n  // Get minimum width required to render all voices. Either `format` or\n  // `preCalculateMinTotalWidth` must be called before this method.\n  getMinTotalWidth() {\n    if (!this.hasMinTotalWidth) {\n      throw new Vex.RERR(\n        'NoMinTotalWidth',\n        \"Call 'preCalculateMinTotalWidth' or 'preFormat' before calling 'getMinTotalWidth'\"\n      );\n    }\n\n    return this.minTotalWidth;\n  }\n\n  // Create `ModifierContext`s for each tick in `voices`.\n  createModifierContexts(voices) {\n    const contexts = createContexts(\n      voices,\n      ModifierContext,\n      (tickable, context) => tickable.addToModifierContext(context)\n    );\n\n    this.modiferContexts = contexts;\n    return contexts;\n  }\n\n  // Create `TickContext`s for each tick in `voices`. Also calculate the\n  // total number of ticks in voices.\n  createTickContexts(voices) {\n    const contexts = createContexts(\n      voices,\n      TickContext,\n      (tickable, context) => context.addTickable(tickable)\n    );\n\n    contexts.array.forEach(context => {\n      context.tContexts = contexts.array;\n    });\n\n    this.totalTicks = voices[0].getTicksUsed().clone();\n    this.tickContexts = contexts;\n    return contexts;\n  }\n\n  // This is the core formatter logic. Format voices and justify them\n  // to `justifyWidth` pixels. `renderingContext` is required to justify elements\n  // that can't retreive widths without a canvas. This method sets the `x` positions\n  // of all the tickables/notes in the formatter.\n  preFormat(justifyWidth = 0, renderingContext, voices, stave) {\n    // Initialize context maps.\n    const contexts = this.tickContexts;\n    const { list: contextList, map: contextMap, resolutionMultiplier } = contexts;\n\n    // If voices and a stave were provided, set the Stave for each voice\n    // and preFormat to apply Y values to the notes;\n    if (voices && stave) {\n      voices.forEach(voice => voice.setStave(stave).preFormat());\n    }\n\n    // Now distribute the ticks to each tick context, and assign them their\n    // own X positions.\n    let x = 0;\n    let shift = 0;\n    const centerX = justifyWidth / 2;\n    this.minTotalWidth = 0;\n\n    // Pass 1: Give each note maximum width requested by context.\n    contextList.forEach((tick) => {\n      const context = contextMap[tick];\n      if (renderingContext) context.setContext(renderingContext);\n\n      // Make sure that all tickables in this context have calculated their\n      // space requirements.\n      context.preFormat();\n\n      const width = context.getWidth();\n      this.minTotalWidth += width;\n\n      const metrics = context.getMetrics();\n      x = x + shift + metrics.extraLeftPx;\n      context.setX(x);\n\n      // Calculate shift for the next tick.\n      shift = width - metrics.extraLeftPx;\n    });\n\n    this.minTotalWidth = x + shift;\n    this.hasMinTotalWidth = true;\n\n    // No justification needed. End formatting.\n    if (justifyWidth <= 0) return;\n\n    // Pass 2: Take leftover width, and distribute it to proportionately to\n    // all notes.\n    const remainingX = justifyWidth - this.minTotalWidth;\n    const leftoverPxPerTick = remainingX / (this.totalTicks.value() * resolutionMultiplier);\n    let spaceAccum = 0;\n\n    contextList.forEach((tick, index) => {\n      const prevTick = contextList[index - 1] || 0;\n      const context = contextMap[tick];\n      const tickSpace = (tick - prevTick) * leftoverPxPerTick;\n\n      spaceAccum += tickSpace;\n      context.setX(context.getX() + spaceAccum);\n\n      // Move center aligned tickables to middle\n      context\n        .getCenterAlignedTickables()\n        .forEach(tickable => { // eslint-disable-line\n          tickable.center_x_shift = centerX - context.getX();\n        });\n    });\n\n    // Just one context. Done formatting.\n    if (contextList.length === 1) return;\n\n    this.justifyWidth = justifyWidth;\n    this.lossHistory = [];\n    this.evaluate();\n  }\n\n  // Calculate the total cost of this formatting decision.\n  evaluate() {\n    const justifyWidth = this.justifyWidth;\n    // Calculate available slack per tick context. This works out how much freedom\n    // to move a context has in either direction, without affecting other notes.\n    this.contextGaps = { total: 0, gaps: [] };\n    this.tickContexts.list.forEach((tick, index) => {\n      if (index === 0) return;\n      const prevTick = this.tickContexts.list[index - 1];\n      const prevContext = this.tickContexts.map[prevTick];\n      const context = this.tickContexts.map[tick];\n      const prevMetrics = prevContext.getMetrics();\n\n      const insideRightEdge = prevContext.getX() + prevMetrics.width;\n      const insideLeftEdge = context.getX();\n      const gap = insideLeftEdge - insideRightEdge;\n      this.contextGaps.total += gap;\n      this.contextGaps.gaps.push({ x1: insideRightEdge, x2: insideLeftEdge });\n\n      // Tell the tick contexts how much they can reposition themselves.\n      context.getFormatterMetrics().freedom.left = gap;\n      prevContext.getFormatterMetrics().freedom.right = gap;\n    });\n\n    // Calculate mean distance in each voice for each duration type, then calculate\n    // how far each note is from the mean.\n    const durationStats = this.durationStats = {};\n\n    function updateStats(duration, space) {\n      const stats = durationStats[duration];\n      if (stats === undefined) {\n        durationStats[duration] = { mean: space, count: 1 };\n      } else {\n        stats.count += 1;\n        stats.mean = (stats.mean + space) / 2;\n      }\n    }\n\n    this.voices.forEach(voice => {\n      voice.getTickables().forEach((note, i, notes) => {\n        const duration = note.getTicks().clone().simplify().toString();\n        const metrics = note.getMetrics();\n        const formatterMetrics = note.getFormatterMetrics();\n        const leftNoteEdge = note.getX() + metrics.noteWidth +\n          metrics.modRightPx + metrics.extraRightPx;\n        let space = 0;\n\n        if (i < (notes.length - 1)) {\n          const rightNote = notes[i + 1];\n          const rightMetrics = rightNote.getMetrics();\n          const rightNoteEdge = rightNote.getX() -\n            rightMetrics.modLeftPx - rightMetrics.extraLeftPx;\n\n          space = rightNoteEdge - leftNoteEdge;\n          formatterMetrics.space.used = rightNote.getX() - note.getX();\n          rightNote.getFormatterMetrics().freedom.left = space;\n        } else {\n          space = justifyWidth - leftNoteEdge;\n          formatterMetrics.space.used = justifyWidth - note.getX();\n        }\n\n        formatterMetrics.freedom.right = space;\n        updateStats(duration, formatterMetrics.space.used);\n      });\n    });\n\n    // Calculate how much each note deviates from the mean. Loss function is square\n    // root of the sum of squared deviations.\n    let totalDeviation = 0;\n    this.voices.forEach(voice => {\n      voice.getTickables().forEach((note) => {\n        const duration = note.getTicks().clone().simplify().toString();\n        const metrics = note.getFormatterMetrics();\n        metrics.iterations += 1;\n        metrics.space.deviation = metrics.space.used - durationStats[duration].mean;\n        metrics.duration = duration;\n        metrics.space.mean = durationStats[duration].mean;\n\n        totalDeviation += Math.pow(durationStats[duration].mean, 2);\n      });\n    });\n\n    this.totalCost = Math.sqrt(totalDeviation);\n    this.lossHistory.push(this.totalCost);\n    return this;\n  }\n\n  // Run a single iteration of rejustification. At a high level, this method calculates\n  // the overall \"loss\" (or cost) of this layout, and repositions tickcontexts in an\n  // attempt to reduce the cost. You can call this method multiple times until it finds\n  // and oscillates around a global minimum.\n  tune() {\n    const sum = (means) => means.reduce((a, b) => a + b);\n\n    // Move `current` tickcontext by `shift` pixels, and adjust the freedom\n    // on adjacent tickcontexts.\n    function move(current, prev, next, shift) {\n      current.setX(current.getX() + shift);\n      current.getFormatterMetrics().freedom.left += shift;\n      current.getFormatterMetrics().freedom.right -= shift;\n\n      if (prev) prev.getFormatterMetrics().freedom.right += shift;\n      if (next) next.getFormatterMetrics().freedom.left -= shift;\n    }\n\n    let shift = 0;\n    this.tickContexts.list.forEach((tick, index, list) => {\n      const context = this.tickContexts.map[tick];\n      const prevContext = (index > 0) ? this.tickContexts.map[list[index - 1]] : null;\n      const nextContext = (index < list.length - 1) ? this.tickContexts.map[list[index + 1]] : null;\n\n      move(context, prevContext, nextContext, shift);\n\n      const cost = -sum(\n        context.getTickables().map(t => t.getFormatterMetrics().space.deviation));\n\n      if (cost > 0) {\n        shift = -Math.min(context.getFormatterMetrics().freedom.right, Math.abs(cost));\n      } else if (cost < 0) {\n        if (nextContext) {\n          shift = Math.min(nextContext.getFormatterMetrics().freedom.right, Math.abs(cost));\n        } else {\n          shift = 0;\n        }\n      }\n\n      const minShift = Math.min(5, Math.abs(shift));\n      shift = shift > 0 ? minShift : -minShift;\n    });\n\n    return this.evaluate();\n  }\n\n  // This is the top-level call for all formatting logic completed\n  // after `x` *and* `y` values have been computed for the notes\n  // in the voices.\n  postFormat() {\n    const postFormatContexts = (contexts) =>\n      contexts.list.forEach(tick => contexts.map[tick].postFormat());\n\n    postFormatContexts(this.modiferContexts);\n    postFormatContexts(this.tickContexts);\n\n    return this;\n  }\n\n  // Take all `voices` and create `ModifierContext`s out of them. This tells\n  // the formatters that the voices belong on a single stave.\n  joinVoices(voices) {\n    this.createModifierContexts(voices);\n    this.hasMinTotalWidth = false;\n    return this;\n  }\n\n  // Align rests in voices, justify the contexts, and position the notes\n  // so voices are aligned and ready to render onto the stave. This method\n  // mutates the `x` positions of all tickables in `voices`.\n  //\n  // Voices are full justified to fit in `justifyWidth` pixels.\n  //\n  // Set `options.context` to the rendering context. Set `options.align_rests`\n  // to true to enable rest alignment.\n  format(voices, justifyWidth, options) {\n    const opts = {\n      align_rests: false,\n      context: null,\n      stave: null,\n    };\n\n    Vex.Merge(opts, options);\n    this.voices = voices;\n    this.alignRests(voices, opts.align_rests);\n    this.createTickContexts(voices);\n    this.preFormat(justifyWidth, opts.context, voices, opts.stave);\n\n    // Only postFormat if a stave was supplied for y value formatting\n    if (opts.stave) this.postFormat();\n\n    return this;\n  }\n\n  // This method is just like `format` except that the `justifyWidth` is inferred\n  // from the `stave`.\n  formatToStave(voices, stave, options) {\n    const justifyWidth = stave.getNoteEndX() - stave.getNoteStartX() - 10;\n    L('Formatting voices to width: ', justifyWidth);\n    const opts = { context: stave.getContext() };\n    Vex.Merge(opts, options);\n    return this.format(voices, justifyWidth, opts);\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// A base class for stave modifiers (e.g. clefs, key signatures)\n\nimport { Element } from './element';\n\nexport class StaveModifier extends Element {\n  static get Position() {\n    return {\n      LEFT: 1,\n      RIGHT: 2,\n      ABOVE: 3,\n      BELOW: 4,\n      BEGIN: 5,\n      END: 6,\n    };\n  }\n\n  constructor() {\n    super();\n    this.setAttribute('type', 'StaveModifier');\n\n    this.padding = 10;\n    this.position = StaveModifier.Position.ABOVE;\n    this.layoutMetrics = null;\n  }\n\n  getPosition() { return this.position; }\n  setPosition(position) { this.position = position; return this; }\n  getStave() { return this.stave; }\n  setStave(stave) { this.stave = stave; return this; }\n  getWidth() { return this.width; }\n  setWidth(width) { this.width = width; return this; }\n  getX() { return this.x; }\n  setX(x) { this.x = x; return this; }\n  getCategory() { return ''; }\n  makeSpacer(padding) {\n    // TODO(0xfe): Return an instance of type `Spacer` based on `GhostNote`\n    // instead of this hack.\n\n    return {\n      getContext() { return true; },\n      setStave() {},\n      renderToStave() {},\n      getMetrics() {\n        return { width: padding };\n      },\n    };\n  }\n  placeGlyphOnLine(glyph, stave, line) {\n    glyph.setYShift(stave.getYForLine(line) - stave.getYForGlyphs());\n  }\n  getPadding(index) {\n    return (index !== undefined && index < 2 ? 0 : this.padding);\n  }\n  setPadding(padding) { this.padding = padding; return this; }\n  setLayoutMetrics(layoutMetrics) {\n    this.layoutMetrics = layoutMetrics;\n    return this;\n  }\n  getLayoutMetrics() {\n    return this.layoutMetrics;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// Author Larry Kuhns 2011\n\nimport { Flow } from './tables';\nimport { StaveModifier } from './stavemodifier';\n\nexport class Barline extends StaveModifier {\n  static get CATEGORY() { return 'barlines'; }\n  static get type() {\n    return {\n      SINGLE: 1,\n      DOUBLE: 2,\n      END: 3,\n      REPEAT_BEGIN: 4,\n      REPEAT_END: 5,\n      REPEAT_BOTH: 6,\n      NONE: 7,\n    };\n  }\n\n  static get typeString() {\n    return {\n      single: Barline.type.SINGLE,\n      double: Barline.type.DOUBLE,\n      end: Barline.type.END,\n      repeatBegin: Barline.type.REPEAT_BEGIN,\n      repeatEnd: Barline.type.REPEAT_END,\n      repeatBoth: Barline.type.REPEAT_BOTH,\n      none: Barline.type.NONE,\n    };\n  }\n\n  /**\n   * @constructor\n   */\n  constructor(type) {\n    super();\n    this.setAttribute('type', 'Barline');\n    this.thickness = Flow.STAVE_LINE_THICKNESS;\n\n    const TYPE = Barline.type;\n    this.widths = {};\n    this.widths[TYPE.SINGLE] = 5;\n    this.widths[TYPE.DOUBLE] = 5;\n    this.widths[TYPE.END] = 5;\n    this.widths[TYPE.REPEAT_BEGIN] = 5;\n    this.widths[TYPE.REPEAT_END] = 5;\n    this.widths[TYPE.REPEAT_BOTH] = 5;\n    this.widths[TYPE.NONE] = 5;\n\n    this.paddings = {};\n    this.paddings[TYPE.SINGLE] = 0;\n    this.paddings[TYPE.DOUBLE] = 0;\n    this.paddings[TYPE.END] = 0;\n    this.paddings[TYPE.REPEAT_BEGIN] = 15;\n    this.paddings[TYPE.REPEAT_END] = 15;\n    this.paddings[TYPE.REPEAT_BOTH] = 15;\n    this.paddings[TYPE.NONE] = 0;\n\n    this.layoutMetricsMap = {};\n    this.layoutMetricsMap[TYPE.SINGLE] = {\n      xMin: 0,\n      xMax: 1,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.DOUBLE] = {\n      xMin: -3,\n      xMax: 1,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.END] = {\n      xMin: -5,\n      xMax: 1,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.REPEAT_END] = {\n      xMin: -10,\n      xMax: 1,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.REPEAT_BEGIN] = {\n      xMin: -2,\n      xMax: 10,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.REPEAT_BOTH] = {\n      xMin: -10,\n      xMax: 10,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.layoutMetricsMap[TYPE.NONE] = {\n      xMin: 0,\n      xMax: 0,\n      paddingLeft: 5,\n      paddingRight: 5,\n    };\n    this.setPosition(StaveModifier.Position.BEGIN);\n    this.setType(type);\n  }\n  getCategory() { return Barline.CATEGORY; }\n  getType() { return this.type; }\n  setType(type) {\n    this.type = typeof(type) === 'string'\n      ? Barline.typeString[type]\n      : type;\n\n    this.setWidth(this.widths[this.type]);\n    this.setPadding(this.paddings[this.type]);\n    this.setLayoutMetrics(this.layoutMetricsMap[this.type]);\n    return this;\n  }\n\n  // Draw barlines\n  draw(stave) {\n    stave.checkContext();\n    this.setRendered();\n\n    switch (this.type) {\n      case Barline.type.SINGLE:\n        this.drawVerticalBar(stave, this.x, false);\n        break;\n      case Barline.type.DOUBLE:\n        this.drawVerticalBar(stave, this.x, true);\n        break;\n      case Barline.type.END:\n        this.drawVerticalEndBar(stave, this.x);\n        break;\n      case Barline.type.REPEAT_BEGIN:\n        // If the barline is shifted over (in front of clef/time/key)\n        // Draw vertical bar at the beginning.\n        this.drawRepeatBar(stave, this.x, true);\n        if (stave.getX() !== this.x) {\n          this.drawVerticalBar(stave, stave.getX());\n        }\n\n        break;\n      case Barline.type.REPEAT_END:\n        this.drawRepeatBar(stave, this.x, false);\n        break;\n      case Barline.type.REPEAT_BOTH:\n        this.drawRepeatBar(stave, this.x, false);\n        this.drawRepeatBar(stave, this.x, true);\n        break;\n      default:\n        // Default is NONE, so nothing to draw\n        break;\n    }\n  }\n\n  drawVerticalBar(stave, x, double_bar) {\n    stave.checkContext();\n    const topY = stave.getTopLineTopY();\n    const botY = stave.getBottomLineBottomY();\n    if (double_bar) {\n      stave.context.fillRect(x - 3, topY, 1, botY - topY);\n    }\n    stave.context.fillRect(x, topY, 1, botY - topY);\n  }\n\n  drawVerticalEndBar(stave, x) {\n    stave.checkContext();\n    const topY = stave.getTopLineTopY();\n    const botY = stave.getBottomLineBottomY();\n    stave.context.fillRect(x - 5, topY, 1, botY - topY);\n    stave.context.fillRect(x - 2, topY, 3, botY - topY);\n  }\n\n  drawRepeatBar(stave, x, begin) {\n    stave.checkContext();\n\n    const topY = stave.getTopLineTopY();\n    const botY = stave.getBottomLineBottomY();\n    let x_shift = 3;\n\n    if (!begin) {\n      x_shift = -5;\n    }\n\n    stave.context.fillRect(x + x_shift, topY, 1, botY - topY);\n    stave.context.fillRect(x - 2, topY, 3, botY - topY);\n\n    const dot_radius = 2;\n\n    // Shift dots left or right\n    if (begin) {\n      x_shift += 4;\n    } else {\n      x_shift -= 4;\n    }\n\n    const dot_x = (x + x_shift) + (dot_radius / 2);\n\n    // calculate the y offset based on number of stave lines\n    let y_offset = (stave.getNumLines() - 1) * stave.getSpacingBetweenLines();\n    y_offset = (y_offset / 2) - (stave.getSpacingBetweenLines() / 2);\n    let dot_y = topY + y_offset + (dot_radius / 2);\n\n    // draw the top repeat dot\n    stave.context.beginPath();\n    stave.context.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n    stave.context.fill();\n\n    // draw the bottom repeat dot\n    dot_y += stave.getSpacingBetweenLines();\n    stave.context.beginPath();\n    stave.context.arc(dot_x, dot_y, dot_radius, 0, Math.PI * 2, false);\n    stave.context.fill();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class Repetition extends StaveModifier {\n  static get CATEGORY() { return 'repetitions'; }\n  static get type() {\n    return {\n      NONE: 1,         // no coda or segno\n      CODA_LEFT: 2,    // coda at beginning of stave\n      CODA_RIGHT: 3,   // coda at end of stave\n      SEGNO_LEFT: 4,   // segno at beginning of stave\n      SEGNO_RIGHT: 5,  // segno at end of stave\n      DC: 6,           // D.C. at end of stave\n      DC_AL_CODA: 7,   // D.C. al coda at end of stave\n      DC_AL_FINE: 8,   // D.C. al Fine end of stave\n      DS: 9,           // D.S. at end of stave\n      DS_AL_CODA: 10,  // D.S. al coda at end of stave\n      DS_AL_FINE: 11,  // D.S. al Fine at end of stave\n      FINE: 12,        // Fine at end of stave\n    };\n  }\n\n  constructor(type, x, y_shift) {\n    super();\n    this.setAttribute('type', 'Repetition');\n\n    this.symbol_type = type;\n    this.x = x;\n    this.x_shift = 0;\n    this.y_shift = y_shift;\n    this.font = {\n      family: 'times',\n      size: 12,\n      weight: 'bold italic',\n    };\n  }\n\n  getCategory() { return Repetition.CATEGORY; }\n  setShiftX(x) { this.x_shift = x; return this; }\n  setShiftY(y) { this.y_shift = y; return this; }\n\n  draw(stave, x) {\n    this.setRendered();\n\n    switch (this.symbol_type) {\n      case Repetition.type.CODA_RIGHT:\n        this.drawCodaFixed(stave, x + stave.width);\n        break;\n      case Repetition.type.CODA_LEFT:\n        this.drawSymbolText(stave, x, 'Coda', true);\n        break;\n      case Repetition.type.SEGNO_LEFT:\n        this.drawSignoFixed(stave, x);\n        break;\n      case Repetition.type.SEGNO_RIGHT:\n        this.drawSignoFixed(stave, x + stave.width);\n        break;\n      case Repetition.type.DC:\n        this.drawSymbolText(stave, x, 'D.C.', false);\n        break;\n      case Repetition.type.DC_AL_CODA:\n        this.drawSymbolText(stave, x, 'D.C. al', true);\n        break;\n      case Repetition.type.DC_AL_FINE:\n        this.drawSymbolText(stave, x, 'D.C. al Fine', false);\n        break;\n      case Repetition.type.DS:\n        this.drawSymbolText(stave, x, 'D.S.', false);\n        break;\n      case Repetition.type.DS_AL_CODA:\n        this.drawSymbolText(stave, x, 'D.S. al', true);\n        break;\n      case Repetition.type.DS_AL_FINE:\n        this.drawSymbolText(stave, x, 'D.S. al Fine', false);\n        break;\n      case Repetition.type.FINE:\n        this.drawSymbolText(stave, x, 'Fine', false);\n        break;\n      default:\n        break;\n    }\n\n    return this;\n  }\n\n  drawCodaFixed(stave, x) {\n    const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n    Glyph.renderGlyph(stave.context, this.x + x + this.x_shift, y + 25, 40, 'v4d', true);\n    return this;\n  }\n\n  drawSignoFixed(stave, x) {\n    const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n    Glyph.renderGlyph(stave.context, this.x + x + this.x_shift, y + 25, 30, 'v8c', true);\n    return this;\n  }\n\n  drawSymbolText(stave, x, text, draw_coda) {\n    const ctx = stave.checkContext();\n\n    ctx.save();\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    // Default to right symbol\n    let text_x = 0 + this.x_shift;\n    let symbol_x = x + this.x_shift;\n    if (this.symbol_type === Repetition.type.CODA_LEFT) {\n      // Offset Coda text to right of stave beginning\n      text_x = this.x + stave.options.vertical_bar_width;\n      symbol_x = text_x + ctx.measureText(text).width + 12;\n    } else {\n      // Offset Signo text to left stave end\n      symbol_x = this.x + x + stave.width - 5 + this.x_shift;\n      text_x = symbol_x - + ctx.measureText(text).width - 12;\n    }\n\n    const y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n    if (draw_coda) {\n      Glyph.renderGlyph(ctx, symbol_x, y, 40, 'v4d', true);\n    }\n\n    ctx.fillText(text, text_x, y + 5);\n    ctx.restore();\n\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\n\nexport class StaveSection extends StaveModifier {\n  static get CATEGORY() { return 'stavesection'; }\n\n  constructor(section, x, shift_y) {\n    super();\n    this.setAttribute('type', 'StaveSection');\n\n    this.setWidth(16);\n    this.section = section;\n    this.x = x;\n    this.shift_x = 0;\n    this.shift_y = shift_y;\n    this.font = {\n      family: 'sans-serif',\n      size: 12,\n      weight: 'bold',\n    };\n  }\n\n  getCategory() { return StaveSection.CATEGORY; }\n  setStaveSection(section) { this.section = section; return this; }\n  setShiftX(x) { this.shift_x = x; return this; }\n  setShiftY(y) { this.shift_y = y; return this; }\n  draw(stave, shift_x) {\n    const ctx = stave.checkContext();\n    this.setRendered();\n\n    ctx.save();\n    ctx.lineWidth = 2;\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    const text_width = ctx.measureText('' + this.section).width;\n    let width = text_width + 6;  // add left & right padding\n    if (width < 18) width = 18;\n    const height = 20;\n    //  Seems to be a good default y\n    const y = stave.getYForTopText(3) + this.shift_y;\n    let x = this.x + shift_x;\n    ctx.beginPath();\n    ctx.lineWidth = 2;\n    ctx.rect(x, y, width, height);\n    ctx.stroke();\n    x += (width - text_width) / 2;\n    ctx.fillText('' + this.section, x, y + 16);\n    ctx.restore();\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Radosaw Eichler 2012\n\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class StaveTempo extends StaveModifier {\n  static get CATEGORY() { return 'stavetempo'; }\n\n  constructor(tempo, x, shift_y) {\n    super();\n    this.setAttribute('type', 'StaveTempo');\n\n    this.tempo = tempo;\n    this.position = Modifier.Position.ABOVE;\n    this.x = x;\n    this.shift_x = 10;\n    this.shift_y = shift_y;\n    this.font = {\n      family: 'times',\n      size: 14,\n      weight: 'bold',\n    };\n    this.render_options = {\n      glyph_font_scale: 30,  // font size for note\n    };\n  }\n  getCategory() { return StaveTempo.CATEGORY; }\n  setTempo(tempo) { this.tempo = tempo; return this; }\n  setShiftX(x) { this.shift_x = x; return this; }\n  setShiftY(y) { this.shift_y = y; return this; }\n\n  draw(stave, shift_x) {\n    const ctx = stave.checkContext();\n    this.setRendered();\n\n    const options = this.render_options;\n    // FIXME: What does the '38' mean? Why 38? Is that supposed to\n    // be the default font size for standard notation?\n    const scale = options.glyph_font_scale / 38;\n    const name = this.tempo.name;\n    const duration = this.tempo.duration;\n    const dots = this.tempo.dots;\n    const bpm = this.tempo.bpm;\n    const font = this.font;\n    let x = this.x + this.shift_x + shift_x;\n    const y = stave.getYForTopText(1) + this.shift_y;\n\n    ctx.save();\n\n    if (name) {\n      ctx.setFont(font.family, font.size, font.weight);\n      ctx.fillText(name, x, y);\n      x += ctx.measureText(name).width;\n    }\n\n    if (duration && bpm) {\n      ctx.setFont(font.family, font.size, 'normal');\n\n      if (name) {\n        x += ctx.measureText(' ').width;\n        ctx.fillText('(', x, y);\n        x += ctx.measureText('(').width;\n      }\n\n      const code = Flow.getGlyphProps(duration);\n\n      x += 3 * scale;\n      Glyph.renderGlyph(ctx, x, y, options.glyph_font_scale, code.code_head);\n      x += code.getWidth() * scale;\n\n      // Draw stem and flags\n      if (code.stem) {\n        let stem_height = 30;\n\n        if (code.beam_count) stem_height += 3 * (code.beam_count - 1);\n\n        stem_height *= scale;\n\n        const y_top = y - stem_height;\n        ctx.fillRect(x - scale, y_top, scale, stem_height);\n\n        if (code.flag) {\n          Glyph.renderGlyph(ctx, x, y_top, options.glyph_font_scale, code.code_flag_upstem);\n\n          if (!dots) x += 6 * scale;\n        }\n      }\n\n      // Draw dot\n      for (let i = 0; i < dots; i++) {\n        x += 6 * scale;\n        ctx.beginPath();\n        ctx.arc(x, y + 2 * scale, 2 * scale, 0, Math.PI * 2, false);\n        ctx.fill();\n      }\n\n      ctx.fillText(' = ' + bpm + (name ? ')' : ''), x + 3 * scale, y);\n    }\n\n    ctx.restore();\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// `TextNote` is a notation element that is positioned in time. Generally\n// meant for objects that sit above/below the staff and inline with each other.\n// Examples of this would be such as dynamics, lyrics, chord changes, etc.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Note } from './note';\nimport { Glyph } from './glyph';\n\nexport class TextNote extends Note {\n  static get Justification() {\n    return {\n      LEFT: 1,\n      CENTER: 2,\n      RIGHT: 3,\n    };\n  }\n\n  // Glyph data\n  static get GLYPHS() {\n    return {\n      'segno': {\n        code: 'v8c',\n        point: 40,\n        x_shift: 0,\n        y_shift: -10,\n        // width: 10 // optional\n      },\n      'tr': {\n        code: 'v1f',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'mordent_upper': {\n        code: 'v1e',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'mordent_lower': {\n        code: 'v45',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'f': {\n        code: 'vba',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'p': {\n        code: 'vbf',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'm': {\n        code: 'v62',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      's': {\n        code: 'v4a',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'z': {\n        code: 'v80',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n      'coda': {\n        code: 'v4d',\n        point: 40,\n        x_shift: 0,\n        y_shift: -8,\n        // width: 10 // optional\n      },\n      'pedal_open': {\n        code: 'v36',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n      },\n      'pedal_close': {\n        code: 'v5d',\n        point: 40,\n        x_shift: 0,\n        y_shift: 3,\n      },\n      'caesura_straight': {\n        code: 'v34',\n        point: 40,\n        x_shift: 0,\n        y_shift: 2,\n      },\n      'caesura_curved': {\n        code: 'v4b',\n        point: 40,\n        x_shift: 0,\n        y_shift: 2,\n      },\n      'breath': {\n        code: 'v6c',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n      },\n      'tick': {\n        code: 'v6f',\n        point: 50,\n        x_shift: 0,\n        y_shift: 0,\n      },\n      'turn': {\n        code: 'v72',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n      },\n      'turn_inverted': {\n        code: 'v33',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n      },\n\n      // DEPRECATED - please use \"mordent_upper\" or \"mordent_lower\"\n      'mordent': {\n        code: 'v1e',\n        point: 40,\n        x_shift: 0,\n        y_shift: 0,\n        // width: 10 // optional\n      },\n    };\n  }\n\n  constructor(text_struct) {\n    super(text_struct);\n    this.setAttribute('type', 'TextNote');\n\n    // Note properties\n    this.text = text_struct.text;\n    this.superscript = text_struct.superscript;\n    this.subscript = text_struct.subscript;\n    this.glyph_type = text_struct.glyph;\n    this.glyph = null;\n    this.font = {\n      family: 'Arial',\n      size: 12,\n      weight: '',\n    };\n\n    // Set font\n    if (text_struct.font) this.font = text_struct.font;\n\n    // Determine and set initial note width. Note that the text width is\n    // an approximation and isn't very accurate. The only way to accurately\n    // measure the length of text is with `canvasmeasureText()`\n    if (this.glyph_type) {\n      const struct = TextNote.GLYPHS[this.glyph_type];\n      if (!struct) throw new Vex.RERR('Invalid glyph type: ' + this.glyph_type);\n\n      this.glyph = new Glyph(struct.code, struct.point, { cache: false });\n\n      if (struct.width) {\n        this.setWidth(struct.width);\n      } else {\n        this.setWidth(this.glyph.getMetrics().width);\n      }\n\n      this.glyph_struct = struct;\n    } else {\n      this.setWidth(Flow.textWidth(this.text));\n    }\n    this.line = text_struct.line || 0;\n    this.smooth = text_struct.smooth || false;\n    this.ignore_ticks = text_struct.ignore_ticks || false;\n    this.justification = TextNote.Justification.LEFT;\n  }\n\n  // Set the horizontal justification of the TextNote\n  setJustification(just) {\n    this.justification = just;\n    return this;\n  }\n\n  // Set the Stave line on which the note should be placed\n  setLine(line) {\n    this.line = line;\n    return this;\n  }\n\n  // Pre-render formatting\n  preFormat() {\n    this.checkContext();\n\n    if (this.preFormatted) return;\n\n    if (this.smooth) {\n      this.setWidth(0);\n    } else {\n      if (this.glyph) {\n        // Width already set.\n      } else {\n        this.setWidth(this.context.measureText(this.text).width);\n      }\n    }\n\n    if (this.justification === TextNote.Justification.CENTER) {\n      this.extraLeftPx = this.width / 2;\n    } else if (this.justification === TextNote.Justification.RIGHT) {\n      this.extraLeftPx = this.width;\n    }\n\n    this.setPreFormatted(true);\n  }\n\n  // Renders the TextNote\n  draw() {\n    this.checkContext();\n\n    if (!this.stave) {\n      throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n    }\n\n    this.setRendered();\n    const ctx = this.context;\n    let x = this.getAbsoluteX();\n    if (this.justification === TextNote.Justification.CENTER) {\n      x -= this.getWidth() / 2;\n    } else if (this.justification === TextNote.Justification.RIGHT) {\n      x -= this.getWidth();\n    }\n\n    let y;\n    if (this.glyph) {\n      y = this.stave.getYForLine(this.line + -3);\n      this.glyph.render(\n        this.context,\n        x + this.glyph_struct.x_shift,\n        y + this.glyph_struct.y_shift\n      );\n    } else {\n      y = this.stave.getYForLine(this.line + -3);\n      this.applyStyle(ctx);\n      ctx.setFont(this.font.family, this.font.size, this.font.weight);\n      ctx.fillText(this.text, x, y);\n\n      // Width of the letter M gives us the approximate height of the text\n      const height = ctx.measureText('M').width;\n      // Get accurate width of text\n      const width = ctx.measureText(this.text).width;\n\n      // Write superscript\n      if (this.superscript) {\n        ctx.setFont(this.font.family, this.font.size / 1.3, this.font.weight);\n        ctx.fillText(this.superscript, x + width + 2, y - (height / 2.2));\n      }\n\n      // Write subscript\n      if (this.subscript) {\n        ctx.setFont(this.font.family, this.font.size / 1.3, this.font.weight);\n        ctx.fillText(this.subscript, x + width + 2, y + (height / 2.2) - 1);\n      }\n\n      this.restoreStyle(ctx);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n\nimport { Vex } from './vex';\nimport { StaveModifier } from './stavemodifier';\nimport { TextNote } from './textnote';\n\nexport class StaveText extends StaveModifier {\n  static get CATEGORY() { return 'stavetext'; }\n\n  constructor(text, position, options) {\n    super();\n    this.setAttribute('type', 'StaveText');\n\n    this.setWidth(16);\n    this.text = text;\n    this.position = position;\n    this.options = {\n      shift_x: 0,\n      shift_y: 0,\n      justification: TextNote.Justification.CENTER,\n    };\n    Vex.Merge(this.options, options);\n\n    this.font = {\n      family: 'times',\n      size: 16,\n      weight: 'normal',\n    };\n  }\n\n  getCategory() { return StaveText.CATEGORY; }\n  setStaveText(text) { this.text = text; return this; }\n  setShiftX(x) { this.shift_x = x; return this; }\n  setShiftY(y) { this.shift_y = y; return this; }\n\n  setFont(font) {\n    Vex.Merge(this.font, font);\n  }\n\n  setText(text) {\n    this.text = text;\n  }\n\n  draw(stave) {\n    const ctx = stave.checkContext();\n    this.setRendered();\n\n    ctx.save();\n    ctx.lineWidth = 2;\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    const text_width = ctx.measureText('' + this.text).width;\n\n    let x;\n    let y;\n    const Position = StaveModifier.Position;\n    const Justification = TextNote.Justification;\n    switch (this.position) {\n      case Position.LEFT:\n      case Position.RIGHT:\n        y = (stave.getYForLine(0) + stave.getBottomLineY()) / 2 + this.options.shift_y;\n        if (this.position === Position.LEFT) {\n          x = stave.getX() - text_width - 24 + this.options.shift_x;\n        } else {\n          x = stave.getX() + stave.getWidth() + 24 + this.options.shift_x;\n        }\n        break;\n      case Position.ABOVE:\n      case Position.BELOW:\n        x = stave.getX() + this.options.shift_x;\n        if (this.options.justification === Justification.CENTER) {\n          x += stave.getWidth() / 2 - text_width / 2;\n        } else if (this.options.justification === Justification.RIGHT) {\n          x += stave.getWidth() - text_width;\n        }\n\n        if (this.position === Position.ABOVE) {\n          y = stave.getYForTopText(2) + this.options.shift_y;\n        } else {\n          y = stave.getYForBottomText(2) + this.options.shift_y;\n        }\n        break;\n      default:\n        throw new Vex.RERR('InvalidPosition', 'Value Must be in Modifier.Position.');\n    }\n\n    ctx.fillText('' + this.text, x, y + 4);\n    ctx.restore();\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna Cheppudira 2013.\n// Co-author: Benjamin W. Bohl\n//\n// ## Description\n//\n// This file implements various types of clefs that can be rendered on a stave.\n//\n// See `tests/clef_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class, set `Vex.Flow.Clef.DEBUG` to `true`.\nfunction L(...args) { if (Clef.DEBUG) Vex.L('Vex.Flow.Clef', args); }\n\nexport class Clef extends StaveModifier {\n  static get CATEGORY() { return 'clefs'; }\n\n  // Every clef name is associated with a glyph code from the font file\n  // and a default stave line number.\n  static get types() {\n    return {\n      'treble': {\n        code: 'v83',\n        line: 3,\n      },\n      'bass': {\n        code: 'v79',\n        line: 1,\n      },\n      'alto': {\n        code: 'vad',\n        line: 2,\n      },\n      'tenor': {\n        code: 'vad',\n        line: 1,\n      },\n      'percussion': {\n        code: 'v59',\n        line: 2,\n      },\n      'soprano': {\n        code: 'vad',\n        line: 4,\n      },\n      'mezzo-soprano': {\n        code: 'vad',\n        line: 3,\n      },\n      'baritone-c': {\n        code: 'vad',\n        line: 0,\n      },\n      'baritone-f': {\n        code: 'v79',\n        line: 2,\n      },\n      'subbass': {\n        code: 'v79',\n        line: 0,\n      },\n      'french': {\n        code: 'v83',\n        line: 4,\n      },\n      'tab': {\n        code: 'v2f',\n      },\n    };\n  }\n\n  // Sizes affect the point-size of the clef.\n  static get sizes() {\n    return {\n      'default': {\n        point: 40,\n        width: 26\n      },\n      'small': {\n        point: 32,\n        width: 20,\n      },\n    };\n  }\n\n  // Annotations attach to clefs -- such as \"8\" for octave up or down.\n  static get annotations() {\n    return {\n      '8va': {\n        code: 'v8',\n        sizes: {\n          'default': {\n            point: 20,\n            attachments: {\n              'treble': {\n                line: -1.2,\n                x_shift: 11,\n              },\n            },\n          },\n          'small': {\n            point: 18,\n            attachments: {\n              'treble': {\n                line: -0.4,\n                x_shift: 8,\n              },\n            },\n          },\n        },\n      },\n      '8vb': {\n        code: 'v8',\n        sizes: {\n          'default': {\n            point: 20,\n            attachments: {\n              'treble': {\n                line: 6.3,\n                x_shift: 10,\n              },\n              'bass': {\n                line: 4,\n                x_shift: 1,\n              },\n            },\n          },\n          'small': {\n            point: 18,\n            attachments: {\n              'treble': {\n                line: 5.8,\n                x_shift: 6,\n              },\n              'bass': {\n                line: 3.5,\n                x_shift: 0.5,\n              },\n            },\n          },\n        },\n      },\n    };\n  }\n\n  // Create a new clef. The parameter `clef` must be a key from\n  // `Clef.types`.\n  constructor(type, size, annotation) {\n    super();\n    this.setAttribute('type', 'Clef');\n\n    this.setPosition(StaveModifier.Position.BEGIN);\n    this.setType(type, size, annotation);\n    this.setWidth(Clef.sizes[this.size].width);\n    L('Creating clef:', type);\n  }\n\n  getCategory() { return Clef.CATEGORY; }\n\n  setType(type, size, annotation) {\n    this.type = type;\n    this.clef = Clef.types[type];\n    if (size === undefined) {\n      this.size = 'default';\n    } else {\n      this.size = size;\n    }\n    this.clef.point = Clef.sizes[this.size].point;\n    this.glyph = new Glyph(this.clef.code, this.clef.point);\n\n    // If an annotation, such as 8va, is specified, add it to the Clef object.\n    if (annotation !== undefined) {\n      const anno_dict = Clef.annotations[annotation];\n      this.annotation = {\n        code: anno_dict.code,\n        point: anno_dict.sizes[this.size].point,\n        line: anno_dict.sizes[this.size].attachments[this.type].line,\n        x_shift: anno_dict.sizes[this.size].attachments[this.type].x_shift,\n      };\n\n      this.attachment = new Glyph(this.annotation.code, this.annotation.point);\n      this.attachment.metrics.x_max = 0;\n      this.attachment.setXShift(this.annotation.x_shift);\n    } else {\n      this.annotation = undefined;\n    }\n\n    return this;\n  }\n\n  getWidth() {\n    if (this.type === 'tab' && !this.stave) {\n      throw new Vex.RERR('ClefError', \"Can't get width without stave.\");\n    }\n\n    return this.width;\n  }\n\n  setStave(stave) {\n    this.stave = stave;\n\n    if (this.type !== 'tab') return this;\n\n    let glyphScale;\n    let glyphOffset;\n    const numLines = this.stave.getOptions().num_lines;\n    switch (numLines) {\n      case 8:\n        glyphScale = 55;\n        glyphOffset = 14;\n        break;\n      case 7:\n        glyphScale = 47;\n        glyphOffset = 8;\n        break;\n      case 6:\n        glyphScale = 40;\n        glyphOffset = 1;\n        break;\n      case 5:\n        glyphScale = 30;\n        glyphOffset = -6;\n        break;\n      case 4:\n        glyphScale = 23;\n        glyphOffset = -12;\n        break;\n      default:\n        throw new Vex.RERR('ClefError', `Invalid number of lines: ${numLines}`);\n    }\n\n    this.glyph.setPoint(glyphScale);\n    this.glyph.setYShift(glyphOffset);\n\n    return this;\n  }\n\n  draw() {\n    if (!this.x) throw new Vex.RERR('ClefError', \"Can't draw clef without x.\");\n    if (!this.stave) throw new Vex.RERR('ClefError', \"Can't draw clef without stave.\");\n    this.setRendered();\n\n    this.glyph.setStave(this.stave);\n    this.glyph.setContext(this.stave.context);\n    if (this.clef.line !== undefined) {\n      this.placeGlyphOnLine(this.glyph, this.stave, this.clef.line);\n    }\n\n    this.glyph.renderToStave(this.x);\n\n    if (this.annotation !== undefined) {\n      this.placeGlyphOnLine(this.attachment, this.stave, this.annotation.line);\n      this.attachment.setStave(this.stave);\n      this.attachment.setContext(this.stave.context);\n      this.attachment.renderToStave(this.x);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implements key signatures. A key signature sits on a stave\n// and indicates the notes with implicit accidentals.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { StaveModifier } from './stavemodifier';\nimport { Glyph } from './glyph';\n\nexport class KeySignature extends StaveModifier {\n  static get CATEGORY() { return 'keysignatures'; }\n\n  // Space between natural and following accidental depending\n  // on vertical position\n  static get accidentalSpacing() {\n    return {\n      '#': {\n        above: 6,\n        below: 4,\n      },\n      'b': {\n        above: 4,\n        below: 7,\n      },\n      'n': {\n        above: 4,\n        below: 1,\n      },\n      '##': {\n        above: 6,\n        below: 4,\n      },\n      'bb': {\n        above: 4,\n        below: 7,\n      },\n      'db': {\n        above: 4,\n        below: 7,\n      },\n      'd': {\n        above: 4,\n        below: 7,\n      },\n      'bbs': {\n        above: 4,\n        below: 7,\n      },\n      '++': {\n        above: 6,\n        below: 4,\n      },\n      '+': {\n        above: 6,\n        below: 4,\n      },\n      '+-': {\n        above: 6,\n        below: 4,\n      },\n      '++-': {\n        above: 6,\n        below: 4,\n      },\n      'bs': {\n        above: 4,\n        below: 10,\n      },\n      'bss': {\n        above: 4,\n        below: 10,\n      },\n    };\n  }\n\n  // Create a new Key Signature based on a `key_spec`\n  constructor(keySpec, cancelKeySpec, alterKeySpec) {\n    super();\n    this.setAttribute('type', 'KeySignature');\n\n    this.setKeySig(keySpec, cancelKeySpec, alterKeySpec);\n    this.setPosition(StaveModifier.Position.BEGIN);\n    this.glyphFontScale = 38; // TODO(0xFE): Should this match StaveNote?\n    this.glyphs = [];\n    this.xPositions = []; // relative to this.x\n    this.paddingForced = false;\n  }\n\n  getCategory() { return KeySignature.CATEGORY; }\n\n  // Add an accidental glyph to the `KeySignature` instance which represents\n  // the provided `acc`. If `nextAcc` is also provided, the appropriate\n  // spacing will be included in the glyph's position\n  convertToGlyph(acc, nextAcc) {\n    const accGlyphData = Flow.accidentalCodes(acc.type);\n    const glyph = new Glyph(accGlyphData.code, this.glyphFontScale);\n\n    // Determine spacing between current accidental and the next accidental\n    let extraWidth = 1;\n    if (acc.type === 'n' && nextAcc) {\n      const spacing = KeySignature.accidentalSpacing[nextAcc.type];\n      if (spacing) {\n        const isAbove = nextAcc.line >= acc.line;\n        extraWidth = isAbove ? spacing.above : spacing.below;\n      }\n    }\n\n    // Place the glyph on the stave\n    this.placeGlyphOnLine(glyph, this.stave, acc.line);\n    this.glyphs.push(glyph);\n\n    const xPosition = this.xPositions[this.xPositions.length - 1];\n    const glyphWidth = glyph.getMetrics().width + extraWidth;\n    // Store the next accidental's x position\n    this.xPositions.push(xPosition + glyphWidth);\n    // Expand size of key signature\n    this.width += glyphWidth;\n  }\n\n  // Cancel out a key signature provided in the `spec` parameter. This will\n  // place appropriate natural accidentals before the key signature.\n  cancelKey(spec) {\n    this.formatted = false;\n    this.cancelKeySpec = spec;\n\n    return this;\n  }\n\n  convertToCancelAccList(spec) {\n    // Get the accidental list for the cancelled key signature\n    const cancel_accList = Flow.keySignature(spec);\n\n    // If the cancelled key has a different accidental type, ie: # vs b\n    const different_types = this.accList.length > 0\n      && cancel_accList.length > 0\n      && cancel_accList[0].type !== this.accList[0].type;\n\n    // Determine how many naturals needed to add\n    const naturals = different_types\n      ? cancel_accList.length\n      : cancel_accList.length - this.accList.length;\n\n    // Return if no naturals needed\n    if (naturals < 1) return undefined;\n\n    // Get the line position for each natural\n    const cancelled = [];\n    for (let i = 0; i < naturals; i++) {\n      let index = i;\n      if (!different_types) {\n        index = cancel_accList.length - naturals + i;\n      }\n\n      const acc = cancel_accList[index];\n      cancelled.push({ type: 'n', line: acc.line });\n    }\n\n    // Combine naturals with main accidental list for the key signature\n    this.accList = cancelled.concat(this.accList);\n\n    return {\n      accList: cancelled,\n      type: cancel_accList[0].type\n    };\n  }\n\n  // Deprecated\n  addToStave(stave) {\n    this.paddingForced = true;\n    stave.addModifier(this);\n\n    return this;\n  }\n\n  // Apply the accidental staff line placement based on the `clef` and\n  // the  accidental `type` for the key signature ('# or 'b').\n  convertAccLines(clef, type, accList = this.accList) {\n    let offset = 0.0; // if clef === \"treble\"\n    let customLines; // when clef doesn't follow treble key sig shape\n\n    switch (clef) {\n      // Treble & Subbass both have offsets of 0, so are not included.\n      case 'soprano':\n        if (type === '#') customLines = [2.5, 0.5, 2, 0, 1.5, -0.5, 1];\n        else offset = -1;\n        break;\n      case 'mezzo-soprano':\n        if (type === 'b') customLines = [0, 2, 0.5, 2.5, 1, 3, 1.5];\n        else offset = 1.5;\n        break;\n      case 'alto':\n        offset = 0.5;\n        break;\n      case 'tenor':\n        if (type === '#') customLines = [3, 1, 2.5, 0.5, 2, 0, 1.5];\n        else offset = -0.5;\n        break;\n      case 'baritone-f':\n      case 'baritone-c':\n        if (type === 'b') customLines = [0.5, 2.5, 1, 3, 1.5, 3.5, 2];\n        else offset = 2;\n        break;\n      case 'bass':\n      case 'french':\n        offset = 1;\n        break;\n      default:\n        break;\n    }\n\n    // If there's a special case, assign those lines/spaces:\n    let i;\n    if (typeof customLines !== 'undefined') {\n      for (i = 0; i < accList.length; ++i) {\n        accList[i].line = customLines[i];\n      }\n    } else if (offset !== 0) {\n      for (i = 0; i < accList.length; ++i) {\n        accList[i].line += offset;\n      }\n    }\n  }\n\n  getPadding(index) {\n    if (!this.formatted) this.format();\n\n    return (\n      this.glyphs.length === 0 || (!this.paddingForced && index < 2) ?\n        0 : this.padding\n    );\n  }\n\n  getWidth() {\n    if (!this.formatted) this.format();\n\n    return this.width;\n  }\n\n  setKeySig(keySpec, cancelKeySpec, alterKeySpec) {\n    this.formatted = false;\n    this.keySpec = keySpec;\n    this.cancelKeySpec = cancelKeySpec;\n    this.alterKeySpec = alterKeySpec;\n\n    return this;\n  }\n\n  // Alter the accidentals of a key spec one by one.\n  // Each alteration is a new accidental that replaces the\n  // original accidental (or the canceled one).\n  alterKey(alterKeySpec) {\n    this.formatted = false;\n    this.alterKeySpec = alterKeySpec;\n\n    return this;\n  }\n\n  convertToAlterAccList(alterKeySpec) {\n    const max = Math.min(alterKeySpec.length, this.accList.length);\n    for (let i = 0; i < max; ++i) {\n      if (alterKeySpec[i]) {\n        this.accList[i].type = alterKeySpec[i];\n      }\n    }\n  }\n\n  format() {\n    if (!this.stave) {\n      throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without stave.\");\n    }\n\n    this.width = 0;\n    this.glyphs = [];\n    this.xPositions = [0]; // initialize with initial x position\n    this.accList = Flow.keySignature(this.keySpec);\n    const accList = this.accList;\n    const firstAccidentalType = accList.length > 0 ? accList[0].type : null;\n    let cancelAccList;\n    if (this.cancelKeySpec) {\n      cancelAccList = this.convertToCancelAccList(this.cancelKeySpec);\n    }\n    if (this.alterKeySpec) {\n      this.convertToAlterAccList(this.alterKeySpec);\n    }\n\n    if (this.accList.length > 0) {\n      const clef = ((this.position === StaveModifier.Position.END) ?\n        this.stave.endClef : this.stave.clef) || this.stave.clef;\n      if (cancelAccList) {\n        this.convertAccLines(clef, cancelAccList.type, cancelAccList.accList);\n      }\n      this.convertAccLines(clef, firstAccidentalType, accList);\n      for (let i = 0; i < this.accList.length; ++i) {\n        this.convertToGlyph(this.accList[i], this.accList[i + 1]);\n      }\n    }\n\n    this.formatted = true;\n  }\n\n  draw() {\n    if (!this.x) {\n      throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without x.\");\n    }\n\n    if (!this.stave) {\n      throw new Vex.RERR('KeySignatureError', \"Can't draw key signature without stave.\");\n    }\n\n    if (!this.formatted) this.format();\n    this.setRendered();\n\n    for (let i = 0; i < this.glyphs.length; i++) {\n      const glyph = this.glyphs[i];\n      const x = this.x + this.xPositions[i];\n      glyph.setStave(this.stave);\n      glyph.setContext(this.stave.context);\n      glyph.renderToStave(x);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// Implements time signatures glyphs for staffs\n// See tables.js for the internal time signatures\n// representation\n\nimport { Vex } from './vex';\nimport { Glyph } from './glyph';\nimport { StaveModifier } from './stavemodifier';\n\nconst assertIsValidFraction = (timeSpec) => {\n  const numbers = timeSpec.split('/').filter(number => number !== '');\n\n  if (numbers.length !== 2) {\n    throw new Vex.RERR(\n      'BadTimeSignature',\n      `Invalid time spec: ${timeSpec}. Must be in the form \"<numerator>/<denominator>\"`\n    );\n  }\n\n  numbers.forEach(number => {\n    if (isNaN(Number(number))) {\n      throw new Vex.RERR(\n        'BadTimeSignature', `Invalid time spec: ${timeSpec}. Must contain two valid numbers.`\n      );\n    }\n  });\n};\n\nexport class TimeSignature extends StaveModifier {\n  static get CATEGORY() { return 'timesignatures'; }\n\n  static get glyphs() {\n    return {\n      'C': {\n        code: 'v41',\n        point: 40,\n        line: 2,\n      },\n      'C|': {\n        code: 'vb6',\n        point: 40,\n        line: 2,\n      },\n    };\n  }\n\n  constructor(timeSpec = null, customPadding = 15, validate_args = true) {\n    super();\n    this.setAttribute('type', 'TimeSignature');\n    this.validate_args = validate_args;\n\n    if (timeSpec === null) return;\n\n    const padding = customPadding;\n\n    this.point = 40;\n    this.topLine = 2;\n    this.bottomLine = 4;\n    this.setPosition(StaveModifier.Position.BEGIN);\n    this.setTimeSig(timeSpec);\n    this.setWidth(this.timeSig.glyph.getMetrics().width);\n    this.setPadding(padding);\n  }\n\n  getCategory() { return TimeSignature.CATEGORY; }\n\n  parseTimeSpec(timeSpec) {\n    if (timeSpec === 'C' || timeSpec === 'C|') {\n      const { line, code, point } = TimeSignature.glyphs[timeSpec];\n      return {\n        line,\n        num: false,\n        glyph: new Glyph(code, point),\n      };\n    }\n\n    if (this.validate_args) {\n      assertIsValidFraction(timeSpec);\n    }\n\n    const [topDigits, botDigits] = timeSpec\n      .split('/')\n      .map(number => number.split(''));\n\n    return {\n      num: true,\n      glyph: this.makeTimeSignatureGlyph(topDigits, botDigits),\n    };\n  }\n\n  makeTimeSignatureGlyph(topDigits, botDigits) {\n    const glyph = new Glyph('v0', this.point);\n    glyph.topGlyphs = [];\n    glyph.botGlyphs = [];\n\n    let topWidth = 0;\n    for (let i = 0; i < topDigits.length; ++i) {\n      const num = topDigits[i];\n      const topGlyph = new Glyph('v' + num, this.point);\n\n      glyph.topGlyphs.push(topGlyph);\n      topWidth += topGlyph.getMetrics().width;\n    }\n\n    let botWidth = 0;\n    for (let i = 0; i < botDigits.length; ++i) {\n      const num = botDigits[i];\n      const botGlyph = new Glyph('v' + num, this.point);\n\n      glyph.botGlyphs.push(botGlyph);\n      botWidth += botGlyph.getMetrics().width;\n    }\n\n    const width = topWidth > botWidth ? topWidth : botWidth;\n    const xMin = glyph.getMetrics().x_min;\n\n    glyph.getMetrics = () => ({\n      x_min: xMin,\n      x_max: xMin + width,\n      width,\n    });\n\n    const topStartX = (width - topWidth) / 2.0;\n    const botStartX = (width - botWidth) / 2.0;\n\n    const that = this;\n    glyph.renderToStave = function renderToStave(x) {\n      let start_x = x + topStartX;\n      for (let i = 0; i < this.topGlyphs.length; ++i) {\n        const glyph = this.topGlyphs[i];\n        Glyph.renderOutline(\n          this.context,\n          glyph.metrics.outline,\n          glyph.scale,\n          start_x + glyph.x_shift,\n          this.stave.getYForLine(that.topLine)\n        );\n        start_x += glyph.getMetrics().width;\n      }\n\n      start_x = x + botStartX;\n      for (let i = 0; i < this.botGlyphs.length; ++i) {\n        const glyph = this.botGlyphs[i];\n        that.placeGlyphOnLine(glyph, this.stave, glyph.line);\n        Glyph.renderOutline(\n          this.context,\n          glyph.metrics.outline,\n          glyph.scale,\n          start_x + glyph.x_shift,\n          this.stave.getYForLine(that.bottomLine)\n        );\n        start_x += glyph.getMetrics().width;\n      }\n    };\n\n    return glyph;\n  }\n\n  getTimeSig() {\n    return this.timeSig;\n  }\n\n  setTimeSig(timeSpec) {\n    this.timeSig = this.parseTimeSpec(timeSpec);\n    return this;\n  }\n\n  draw() {\n    if (!this.x) {\n      throw new Vex.RERR('TimeSignatureError', \"Can't draw time signature without x.\");\n    }\n\n    if (!this.stave) {\n      throw new Vex.RERR('TimeSignatureError', \"Can't draw time signature without stave.\");\n    }\n\n    this.setRendered();\n    this.timeSig.glyph.setStave(this.stave);\n    this.timeSig.glyph.setContext(this.stave.context);\n    this.placeGlyphOnLine(this.timeSig.glyph, this.stave, this.timeSig.line);\n    this.timeSig.glyph.renderToStave(this.x);\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Larry Kuhns 2011\n\nimport { StaveModifier } from './stavemodifier';\n\nexport class Volta extends StaveModifier {\n  static get CATEGORY() { return 'voltas'; }\n  static get type() {\n    return {\n      NONE: 1,\n      BEGIN: 2,\n      MID: 3,\n      END: 4,\n      BEGIN_END: 5,\n    };\n  }\n\n  constructor(type, number, x, y_shift) {\n    super();\n    this.setAttribute('type', 'Volta');\n    this.volta = type;\n    this.x = x;\n    this.y_shift = y_shift;\n    this.number = number;\n    this.font = {\n      family: 'sans-serif',\n      size: 9,\n      weight: 'bold',\n    };\n  }\n\n  getCategory() { return Volta.CATEGORY; }\n  setShiftY(y) { this.y_shift = y; return this; }\n\n  draw(stave, x) {\n    const ctx = stave.checkContext();\n    this.setRendered();\n\n    let width = stave.width;\n    const top_y = stave.getYForTopText(stave.options.num_lines) + this.y_shift;\n    const vert_height = 1.5 * stave.options.spacing_between_lines_px;\n    switch (this.volta) {\n      case Volta.type.BEGIN:\n        ctx.fillRect(this.x + x, top_y, 1, vert_height);\n        break;\n      case Volta.type.END:\n        width -= 5;\n        ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n        break;\n      case Volta.type.BEGIN_END:\n        width -= 3;\n        ctx.fillRect(this.x + x, top_y, 1, vert_height);\n        ctx.fillRect(this.x + x + width, top_y, 1, vert_height);\n        break;\n      default:\n        break;\n    }\n    // If the beginning of a volta, draw measure number\n    if (this.volta === Volta.type.BEGIN || this.volta === Volta.type.BEGIN_END) {\n      ctx.save();\n      ctx.setFont(this.font.family, this.font.size, this.font.weight);\n      ctx.fillText(this.number, this.x + x + 5, top_y + 15);\n      ctx.restore();\n    }\n\n    ctx.fillRect(this.x + x, top_y, width, 1);\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\nimport { Barline } from './stavebarline';\nimport { StaveModifier } from './stavemodifier';\nimport { Repetition } from './staverepetition';\nimport { StaveSection } from './stavesection';\nimport { StaveTempo } from './stavetempo';\nimport { StaveText } from './stavetext';\nimport { BoundingBox } from './boundingbox';\nimport { Clef } from './clef';\nimport { KeySignature } from './keysignature';\nimport { TimeSignature } from './timesignature';\nimport { Volta } from './stavevolta';\n\nexport class Stave extends Element {\n  constructor(x, y, width, options) {\n    super();\n    this.setAttribute('type', 'Stave');\n\n    this.x = x;\n    this.y = y;\n    this.width = width;\n    this.formatted = false;\n    this.start_x = x + 5;\n    this.end_x = x + width;\n    this.modifiers = [];  // stave modifiers (clef, key, time, barlines, coda, segno, etc.)\n    this.measure = 0;\n    this.clef = 'treble';\n    this.endClef = undefined;\n    this.font = {\n      family: 'sans-serif',\n      size: 8,\n      weight: '',\n    };\n    this.options = {\n      vertical_bar_width: 10,       // Width around vertical bar end-marker\n      glyph_spacing_px: 10,\n      num_lines: 5,\n      fill_style: '#999999',\n      left_bar: true,               // draw vertical bar on left\n      right_bar: true,               // draw vertical bar on right\n      spacing_between_lines_px: 10, // in pixels\n      space_above_staff_ln: 4,      // in staff lines\n      space_below_staff_ln: 4,      // in staff lines\n      top_text_position: 1,          // in staff lines\n    };\n    this.bounds = { x: this.x, y: this.y, w: this.width, h: 0 };\n    Vex.Merge(this.options, options);\n\n    this.resetLines();\n\n    const BARTYPE = Barline.type;\n    // beg bar\n    this.addModifier(new Barline(this.options.left_bar ? BARTYPE.SINGLE : BARTYPE.NONE));\n    // end bar\n    this.addEndModifier(new Barline(this.options.right_bar ? BARTYPE.SINGLE : BARTYPE.NONE));\n  }\n\n  space(spacing) { return this.options.spacing_between_lines_px * spacing; }\n\n  resetLines() {\n    this.options.line_config = [];\n    for (let i = 0; i < this.options.num_lines; i++) {\n      this.options.line_config.push({ visible: true });\n    }\n    this.height = (this.options.num_lines + this.options.space_above_staff_ln) *\n      this.options.spacing_between_lines_px;\n    this.options.bottom_text_position = this.options.num_lines;\n  }\n\n  getOptions() { return this.options; }\n\n  setNoteStartX(x) {\n    if (!this.formatted) this.format();\n\n    this.start_x = x;\n    const begBarline = this.modifiers[0];\n    begBarline.setX(this.start_x - begBarline.getWidth());\n    return this;\n  }\n  getNoteStartX() {\n    if (!this.formatted) this.format();\n\n    return this.start_x;\n  }\n\n  getNoteEndX() {\n    if (!this.formatted) this.format();\n\n    return this.end_x;\n  }\n  getTieStartX() { return this.start_x; }\n  getTieEndX() { return this.x + this.width; }\n  getX() { return this.x; }\n  getNumLines() { return this.options.num_lines; }\n  setNumLines(lines) {\n    this.options.num_lines = parseInt(lines, 10);\n    this.resetLines();\n    return this;\n  }\n  setY(y) { this.y = y; return this; }\n\n  getTopLineTopY() {\n    return this.getYForLine(0) - (Flow.STAVE_LINE_THICKNESS / 2);\n  }\n  getBottomLineBottomY() {\n    return this.getYForLine(this.getNumLines() - 1) + (Flow.STAVE_LINE_THICKNESS / 2);\n  }\n\n  setX(x) {\n    const shift = x - this.x;\n    this.formatted = false;\n    this.x = x;\n    this.start_x += shift;\n    this.end_x += shift;\n    for (let i = 0; i < this.modifiers.length; i++) {\n      const mod = this.modifiers[i];\n      if (mod.x !== undefined) {\n        mod.x += shift;\n      }\n    }\n    return this;\n  }\n\n  setWidth(width) {\n    this.formatted = false;\n    this.width = width;\n    this.end_x = this.x + width;\n\n    // reset the x position of the end barline (TODO(0xfe): This makes no sense)\n    // this.modifiers[1].setX(this.end_x);\n    return this;\n  }\n\n  getWidth() {\n    return this.width;\n  }\n\n  getStyle() {\n    return {\n      fillStyle: this.options.fill_style,\n      strokeStyle: this.options.fill_style, // yes, this is correct for legacy compatibility\n      lineWidth: Flow.STAVE_LINE_THICKNESS, ...this.style || {}\n    };\n  }\n\n  setMeasure(measure) { this.measure = measure; return this; }\n\n  /**\n   * Gets the pixels to shift from the beginning of the stave\n   * following the modifier at the provided index\n   * @param  {Number} index The index from which to determine the shift\n   * @return {Number}       The amount of pixels shifted\n   */\n  getModifierXShift(index = 0) {\n    if (typeof index !== 'number') {\n      throw new Vex.RERR('InvalidIndex', 'Must be of number type');\n    }\n\n    if (!this.formatted) this.format();\n\n    if (this.getModifiers(StaveModifier.Position.BEGIN).length === 1) {\n      return 0;\n    }\n\n    let start_x = this.start_x - this.x;\n    const begBarline = this.modifiers[0];\n    if (begBarline.getType() === Barline.type.REPEAT_BEGIN && start_x > begBarline.getWidth()) {\n      start_x -= begBarline.getWidth();\n    }\n\n    return start_x;\n  }\n\n  // Coda & Segno Symbol functions\n  setRepetitionTypeLeft(type, y) {\n    this.modifiers.push(new Repetition(type, this.x, y));\n    return this;\n  }\n\n  setRepetitionTypeRight(type, y) {\n    this.modifiers.push(new Repetition(type, this.x, y));\n    return this;\n  }\n\n  // Volta functions\n  setVoltaType(type, number_t, y) {\n    this.modifiers.push(new Volta(type, number_t, this.x, y));\n    return this;\n  }\n\n  // Section functions\n  setSection(section, y) {\n    this.modifiers.push(new StaveSection(section, this.x, y));\n    return this;\n  }\n\n  // Tempo functions\n  setTempo(tempo, y) {\n    this.modifiers.push(new StaveTempo(tempo, this.x, y));\n    return this;\n  }\n\n  // Text functions\n  setText(text, position, options) {\n    this.modifiers.push(new StaveText(text, position, options));\n    return this;\n  }\n\n  getHeight() {\n    return this.height;\n  }\n\n  getSpacingBetweenLines() {\n    return this.options.spacing_between_lines_px;\n  }\n\n  getBoundingBox() {\n    return new BoundingBox(this.x, this.y, this.width, this.getBottomY() - this.y);\n  }\n\n  getBottomY() {\n    const options = this.options;\n    const spacing = options.spacing_between_lines_px;\n    const score_bottom = this.getYForLine(options.num_lines) +\n      (options.space_below_staff_ln * spacing);\n\n    return score_bottom;\n  }\n\n  getBottomLineY() {\n    return this.getYForLine(this.options.num_lines);\n  }\n\n  // This returns the y for the *center* of a staff line\n  getYForLine(line) {\n    const options = this.options;\n    const spacing = options.spacing_between_lines_px;\n    const headroom = options.space_above_staff_ln;\n\n    const y = this.y + (line * spacing) + (headroom * spacing);\n\n    return y;\n  }\n\n  getLineForY(y) {\n    // Does the reverse of getYForLine - somewhat dumb and just calls\n    // getYForLine until the right value is reaches\n\n    const options = this.options;\n    const spacing = options.spacing_between_lines_px;\n    const headroom = options.space_above_staff_ln;\n    return ((y - this.y) / spacing) - headroom;\n  }\n\n  getYForTopText(line) {\n    const l = line || 0;\n    return this.getYForLine(-l - this.options.top_text_position);\n  }\n\n  getYForBottomText(line) {\n    const l = line || 0;\n    return this.getYForLine(this.options.bottom_text_position + l);\n  }\n\n  getYForNote(line) {\n    const options = this.options;\n    const spacing = options.spacing_between_lines_px;\n    const headroom = options.space_above_staff_ln;\n    const y = this.y + (headroom * spacing) + (5 * spacing) - (line * spacing);\n\n    return y;\n  }\n\n  getYForGlyphs() {\n    return this.getYForLine(3);\n  }\n\n  // This method adds a stave modifier to the stave. Note that the first two\n  // modifiers (BarLines) are automatically added upon construction.\n  addModifier(modifier, position) {\n    if (position !== undefined) {\n      modifier.setPosition(position);\n    }\n\n    modifier.setStave(this);\n    this.formatted = false;\n    this.modifiers.push(modifier);\n    return this;\n  }\n\n  addEndModifier(modifier) {\n    this.addModifier(modifier, StaveModifier.Position.END);\n    return this;\n  }\n\n  // Bar Line functions\n  setBegBarType(type) {\n    // Only valid bar types at beginning of stave is none, single or begin repeat\n    const { SINGLE, REPEAT_BEGIN, NONE } = Barline.type;\n    if (type === SINGLE || type === REPEAT_BEGIN || type === NONE) {\n      this.modifiers[0].setType(type);\n      this.formatted = false;\n    }\n    return this;\n  }\n\n  setEndBarType(type) {\n    // Repeat end not valid at end of stave\n    if (type !== Barline.type.REPEAT_BEGIN) {\n      this.modifiers[1].setType(type);\n      this.formatted = false;\n    }\n    return this;\n  }\n\n  setClef(clefSpec, size, annotation, position) {\n    if (position === undefined) {\n      position = StaveModifier.Position.BEGIN;\n    }\n\n    if (position === StaveModifier.Position.END) {\n      this.endClef = clefSpec;\n    } else {\n      this.clef = clefSpec;\n    }\n\n    const clefs = this.getModifiers(position, Clef.CATEGORY);\n    if (clefs.length === 0) {\n      this.addClef(clefSpec, size, annotation, position);\n    } else {\n      clefs[0].setType(clefSpec, size, annotation);\n    }\n\n    return this;\n  }\n\n  setEndClef(clefSpec, size, annotation) {\n    this.setClef(clefSpec, size, annotation, StaveModifier.Position.END);\n    return this;\n  }\n\n  setKeySignature(keySpec, cancelKeySpec, position) {\n    if (position === undefined) {\n      position = StaveModifier.Position.BEGIN;\n    }\n\n    const keySignatures = this.getModifiers(position, KeySignature.CATEGORY);\n    if (keySignatures.length === 0) {\n      this.addKeySignature(keySpec, cancelKeySpec, position);\n    } else {\n      keySignatures[0].setKeySig(keySpec, cancelKeySpec);\n    }\n\n    return this;\n  }\n\n  setEndKeySignature(keySpec, cancelKeySpec) {\n    this.setKeySignature(keySpec, cancelKeySpec, StaveModifier.Position.END);\n    return this;\n  }\n\n  setTimeSignature(timeSpec, customPadding, position) {\n    if (position === undefined) {\n      position = StaveModifier.Position.BEGIN;\n    }\n\n    const timeSignatures = this.getModifiers(position, TimeSignature.CATEGORY);\n    if (timeSignatures.length === 0) {\n      this.addTimeSignature(timeSpec, customPadding, position);\n    } else {\n      timeSignatures[0].setTimeSig(timeSpec);\n    }\n\n    return this;\n  }\n\n  setEndTimeSignature(timeSpec, customPadding) {\n    this.setTimeSignature(timeSpec, customPadding, StaveModifier.Position.END);\n    return this;\n  }\n\n  addKeySignature(keySpec, cancelKeySpec, position) {\n    if (position === undefined) {\n      position = StaveModifier.Position.BEGIN;\n    }\n    this.addModifier(new KeySignature(keySpec, cancelKeySpec)\n      .setPosition(position), position);\n    return this;\n  }\n\n  addClef(clef, size, annotation, position) {\n    if (position === undefined || position === StaveModifier.Position.BEGIN) {\n      this.clef = clef;\n    } else if (position === StaveModifier.Position.END) {\n      this.endClef = clef;\n    }\n\n    this.addModifier(new Clef(clef, size, annotation), position);\n    return this;\n  }\n\n  addEndClef(clef, size, annotation) {\n    this.addClef(clef, size, annotation, StaveModifier.Position.END);\n    return this;\n  }\n\n  addTimeSignature(timeSpec, customPadding, position) {\n    this.addModifier(new TimeSignature(timeSpec, customPadding), position);\n    return this;\n  }\n\n  addEndTimeSignature(timeSpec, customPadding) {\n    this.addTimeSignature(timeSpec, customPadding, StaveModifier.Position.END);\n    return this;\n  }\n\n  // Deprecated\n  addTrebleGlyph() {\n    this.addClef('treble');\n    return this;\n  }\n\n  getModifiers(position, category) {\n    if (position === undefined && category === undefined) return this.modifiers;\n\n    return this.modifiers.filter(modifier =>\n      (position === undefined || position === modifier.getPosition()) &&\n      (category === undefined || category === modifier.getCategory())\n    );\n  }\n\n  sortByCategory(items, order) {\n    for (let i = items.length - 1; i >= 0; i--) {\n      for (let j = 0; j < i; j++) {\n        if (order[items[j].getCategory()] > order[items[j + 1].getCategory()]) {\n          const temp = items[j];\n          items[j] = items[j + 1];\n          items[j + 1] = temp;\n        }\n      }\n    }\n  }\n\n  format() {\n    const begBarline = this.modifiers[0];\n    const endBarline = this.modifiers[1];\n\n    const begModifiers = this.getModifiers(StaveModifier.Position.BEGIN);\n    const endModifiers = this.getModifiers(StaveModifier.Position.END);\n\n    this.sortByCategory(begModifiers, {\n      barlines: 0, clefs: 1, keysignatures: 2, timesignatures: 3,\n    });\n\n    this.sortByCategory(endModifiers, {\n      timesignatures: 0, keysignatures: 1, barlines: 2, clefs: 3,\n    });\n\n    if (begModifiers.length > 1 &&\n      begBarline.getType() === Barline.type.REPEAT_BEGIN) {\n      begModifiers.push(begModifiers.splice(0, 1)[0]);\n      begModifiers.splice(0, 0, new Barline(Barline.type.SINGLE));\n    }\n\n    if (endModifiers.indexOf(endBarline) > 0) {\n      endModifiers.splice(0, 0, new Barline(Barline.type.NONE));\n    }\n\n    let width;\n    let padding;\n    let modifier;\n    let offset = 0;\n    let x = this.x;\n    for (let i = 0; i < begModifiers.length; i++) {\n      modifier = begModifiers[i];\n      padding = modifier.getPadding(i + offset);\n      width = modifier.getWidth();\n\n      x += padding;\n      modifier.setX(x);\n      x += width;\n\n      if (padding + width === 0) offset--;\n    }\n\n    this.start_x = x;\n    x = this.x + this.width;\n\n    const widths = {\n      left: 0,\n      right: 0,\n      paddingRight: 0,\n      paddingLeft: 0,\n    };\n\n    let lastBarlineIdx = 0;\n\n    for (let i = 0; i < endModifiers.length; i++) {\n      modifier = endModifiers[i];\n      lastBarlineIdx = (modifier.getCategory() === 'barlines') ? i : lastBarlineIdx;\n\n      widths.right = 0;\n      widths.left = 0;\n      widths.paddingRight = 0;\n      widths.paddingLeft = 0;\n      const layoutMetrics = modifier.getLayoutMetrics();\n\n      if (layoutMetrics) {\n        if (i !== 0) {\n          widths.right = layoutMetrics.xMax || 0;\n          widths.paddingRight = layoutMetrics.paddingRight || 0;\n        }\n        widths.left = (-layoutMetrics.xMin) || 0;\n        widths.paddingLeft = layoutMetrics.paddingLeft || 0;\n\n        if (i === endModifiers.length - 1) {\n          widths.paddingLeft = 0;\n        }\n      } else {\n        widths.paddingRight = modifier.getPadding(i - lastBarlineIdx);\n        if (i !== 0) {\n          widths.right = modifier.getWidth();\n        }\n        if (i === 0) {\n          widths.left = modifier.getWidth();\n        }\n      }\n      x -= widths.paddingRight;\n      x -= widths.right;\n\n      modifier.setX(x);\n\n      x -= widths.left;\n      x -= widths.paddingLeft;\n    }\n\n    this.end_x = endModifiers.length === 1 ? this.x + this.width : x;\n    this.formatted = true;\n  }\n\n  /**\n   * All drawing functions below need the context to be set.\n   */\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    if (!this.formatted) this.format();\n\n    const num_lines = this.options.num_lines;\n    const width = this.width;\n    const x = this.x;\n    let y;\n\n    // Render lines\n    for (let line = 0; line < num_lines; line++) {\n      y = this.getYForLine(line);\n\n      this.applyStyle();\n      if (this.options.line_config[line].visible) {\n        this.context.beginPath();\n        this.context.moveTo(x, y);\n        this.context.lineTo(x + width, y);\n        this.context.stroke();\n      }\n      this.restoreStyle();\n    }\n\n    // Draw the modifiers (bar lines, coda, segno, repeat brackets, etc.)\n    for (let i = 0; i < this.modifiers.length; i++) {\n      // Only draw modifier if it has a draw function\n      if (typeof this.modifiers[i].draw === 'function') {\n        this.modifiers[i].applyStyle(this.context);\n        this.modifiers[i].draw(this, this.getModifierXShift(i));\n        this.modifiers[i].restoreStyle(this.context);\n      }\n    }\n\n    // Render measure numbers\n    if (this.measure > 0) {\n      this.context.save();\n      this.context.setFont(this.font.family, this.font.size, this.font.weight);\n      const text_width = this.context.measureText('' + this.measure).width;\n      y = this.getYForTopText(0) + 3;\n      this.context.fillText('' + this.measure, this.x - text_width / 2, y);\n      this.context.restore();\n    }\n\n    return this;\n  }\n\n  // Draw Simple barlines for backward compatability\n  // Do not delete - draws the beginning bar of the stave\n  drawVertical(x, isDouble) {\n    this.drawVerticalFixed(this.x + x, isDouble);\n  }\n\n  drawVerticalFixed(x, isDouble) {\n    this.checkContext();\n\n    const top_line = this.getYForLine(0);\n    const bottom_line = this.getYForLine(this.options.num_lines - 1);\n    if (isDouble) {\n      this.context.fillRect(x - 3, top_line, 1, bottom_line - top_line + 1);\n    }\n    this.context.fillRect(x, top_line, 1, bottom_line - top_line + 1);\n  }\n\n  drawVerticalBar(x) {\n    this.drawVerticalBarFixed(this.x + x, false);\n  }\n\n  drawVerticalBarFixed(x) {\n    this.checkContext();\n\n    const top_line = this.getYForLine(0);\n    const bottom_line = this.getYForLine(this.options.num_lines - 1);\n    this.context.fillRect(x, top_line, 1, bottom_line - top_line + 1);\n  }\n\n  /**\n   * Get the current configuration for the Stave.\n   * @return {Array} An array of configuration objects.\n   */\n  getConfigForLines() {\n    return this.options.line_config;\n  }\n\n  /**\n   * Configure properties of the lines in the Stave\n   * @param line_number The index of the line to configure.\n   * @param line_config An configuration object for the specified line.\n   * @throws Vex.RERR \"StaveConfigError\" When the specified line number is out of\n   *   range of the number of lines specified in the constructor.\n   */\n  setConfigForLine(line_number, line_config) {\n    if (line_number >= this.options.num_lines || line_number < 0) {\n      throw new Vex.RERR(\n        'StaveConfigError',\n        'The line number must be within the range of the number of lines in the Stave.'\n      );\n    }\n\n    if (line_config.visible === undefined) {\n      throw new Vex.RERR(\n        'StaveConfigError',\n        \"The line configuration object is missing the 'visible' property.\"\n      );\n    }\n\n    if (typeof (line_config.visible) !== 'boolean') {\n      throw new Vex.RERR(\n        'StaveConfigError',\n        \"The line configuration objects 'visible' property must be true or false.\"\n      );\n    }\n\n    this.options.line_config[line_number] = line_config;\n\n    return this;\n  }\n\n  /**\n   * Set the staff line configuration array for all of the lines at once.\n   * @param lines_configuration An array of line configuration objects.  These objects\n   *   are of the same format as the single one passed in to setLineConfiguration().\n   *   The caller can set null for any line config entry if it is desired that the default be used\n   * @throws Vex.RERR \"StaveConfigError\" When the lines_configuration array does not have\n   *   exactly the same number of elements as the num_lines configuration object set in\n   *   the constructor.\n   */\n  setConfigForLines(lines_configuration) {\n    if (lines_configuration.length !== this.options.num_lines) {\n      throw new Vex.RERR(\n        'StaveConfigError',\n        'The length of the lines configuration array must match the number of lines in the Stave'\n      );\n    }\n\n    // Make sure the defaults are present in case an incomplete set of\n    //  configuration options were supplied.\n    // eslint-disable-next-line\n    for (const line_config in lines_configuration) {\n      // Allow 'null' to be used if the caller just wants the default for a particular node.\n      if (!lines_configuration[line_config]) {\n        lines_configuration[line_config] = this.options.line_config[line_config];\n      }\n      Vex.Merge(this.options.line_config[line_config], lines_configuration[line_config]);\n    }\n\n    this.options.line_config = lines_configuration;\n\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Stave } from './stave';\n\nexport class TabStave extends Stave {\n  constructor(x, y, width, options) {\n    const tab_options = {\n      spacing_between_lines_px: 13,\n      num_lines: 6,\n      top_text_position: 1,\n    };\n\n    Vex.Merge(tab_options, options);\n    super(x, y, width, tab_options);\n    this.setAttribute('type', 'TabStave');\n  }\n\n  getYForGlyphs() {\n    return this.getYForLine(2.5);\n  }\n\n  // Deprecated\n  addTabGlyph() {\n    this.addClef('tab');\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// The file implements notes for Tablature notation. This consists of one or\n// more fret positions, and can either be drawn with or without stems.\n//\n// See `tests/tabnote_tests.js` for usage examples\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Modifier } from './modifier';\nimport { Stem } from './stem';\nimport { StemmableNote } from './stemmablenote';\nimport { Dot } from './dot';\nimport { Glyph } from './glyph';\n\n// Gets the unused strings grouped together if consecutive.\n//\n// Parameters:\n// * num_lines - The number of lines\n// * strings_used - An array of numbers representing which strings have fret positions\nfunction getUnusedStringGroups(num_lines, strings_used) {\n  const stem_through = [];\n  let group = [];\n  for (let string = 1; string <= num_lines; string++) {\n    const is_used = strings_used.indexOf(string) > -1;\n\n    if (!is_used) {\n      group.push(string);\n    } else {\n      stem_through.push(group);\n      group = [];\n    }\n  }\n  if (group.length > 0) stem_through.push(group);\n\n  return stem_through;\n}\n\n// Gets groups of points that outline the partial stem lines\n// between fret positions\n//\n// Parameters:\n// * stem_Y - The `y` coordinate the stem is located on\n// * unused_strings - An array of groups of unused strings\n// * stave - The stave to use for reference\n// * stem_direction - The direction of the stem\nfunction getPartialStemLines(stem_y, unused_strings, stave, stem_direction) {\n  const up_stem = stem_direction !== 1;\n  const down_stem = stem_direction !== -1;\n\n  const line_spacing = stave.getSpacingBetweenLines();\n  const total_lines = stave.getNumLines();\n\n  const stem_lines = [];\n\n  unused_strings.forEach(strings => {\n    const containsLastString = strings.indexOf(total_lines) > -1;\n    const containsFirstString =  strings.indexOf(1) > -1;\n\n    if ((up_stem && containsFirstString) ||\n       (down_stem && containsLastString)) {\n      return;\n    }\n\n    // If there's only one string in the group, push a duplicate value.\n    // We do this because we need 2 strings to convert into upper/lower y\n    // values.\n    if (strings.length === 1) {\n      strings.push(strings[0]);\n    }\n\n    const line_ys = [];\n    // Iterate through each group string and store it's y position\n    strings.forEach((string, index, strings) => {\n      const isTopBound = string === 1;\n      const isBottomBound = string === total_lines;\n\n      // Get the y value for the appropriate staff line,\n      // we adjust for a 0 index array, since string numbers are index 1\n      let y = stave.getYForLine(string - 1);\n\n      // Unless the string is the first or last, add padding to each side\n      // of the line\n      if (index === 0 && !isTopBound) {\n        y -= line_spacing / 2 - 1;\n      } else if (index === strings.length - 1 && !isBottomBound) {\n        y += line_spacing / 2 - 1;\n      }\n\n      // Store the y value\n      line_ys.push(y);\n\n      // Store a subsequent y value connecting this group to the main\n      // stem above/below the stave if it's the top/bottom string\n      if (stem_direction === 1 && isTopBound) {\n        line_ys.push(stem_y - 2);\n      } else if (stem_direction === -1 && isBottomBound) {\n        line_ys.push(stem_y + 2);\n      }\n    });\n\n    // Add the sorted y values to the\n    stem_lines.push(line_ys.sort((a, b) => a - b));\n  });\n\n  return stem_lines;\n}\n\nexport class TabNote extends StemmableNote {\n  static get CATEGORY() { return 'tabnotes'; }\n\n  // Initialize the TabNote with a `tab_struct` full of properties\n  // and whether to `draw_stem` when rendering the note\n  constructor(tab_struct, draw_stem) {\n    super(tab_struct);\n    this.setAttribute('type', 'TabNote');\n\n    this.ghost = false; // Renders parenthesis around notes\n    // Note properties\n    //\n    // The fret positions in the note. An array of `{ str: X, fret: X }`\n    this.positions = tab_struct.positions;\n\n    // Render Options\n    Vex.Merge(this.render_options, {\n      // font size for note heads and rests\n      glyph_font_scale: Flow.DEFAULT_TABLATURE_FONT_SCALE,\n      // Flag to draw a stem\n      draw_stem,\n      // Flag to draw dot modifiers\n      draw_dots: draw_stem,\n      // Flag to extend the main stem through the stave and fret positions\n      draw_stem_through_stave: false,\n      // vertical shift from stave line\n      y_shift: 0,\n      // normal glyph scale\n      scale: 1.0,\n      // default tablature font\n      font: '10pt Arial',\n    });\n\n    this.glyph = Flow.getGlyphProps(this.duration, this.noteType);\n\n    if (!this.glyph) {\n      throw new Vex.RuntimeError(\n        'BadArguments',\n        `Invalid note initialization data (No glyph found): ${JSON.stringify(tab_struct)}`\n      );\n    }\n\n    this.buildStem();\n\n    if (tab_struct.stem_direction) {\n      this.setStemDirection(tab_struct.stem_direction);\n    } else {\n      this.setStemDirection(Stem.UP);\n    }\n\n    // Renders parenthesis around notes\n    this.ghost = false;\n    this.updateWidth();\n  }\n\n  reset() {\n    if (this.stave) this.setStave(this.stave);\n  }\n\n  // The ModifierContext category\n  getCategory() { return TabNote.CATEGORY; }\n\n  // Set as ghost `TabNote`, surrounds the fret positions with parenthesis.\n  // Often used for indicating frets that are being bent to\n  setGhost(ghost) {\n    this.ghost = ghost;\n    this.updateWidth();\n    return this;\n  }\n\n  // Determine if the note has a stem\n  hasStem() { return this.render_options.draw_stem; }\n\n  // Get the default stem extension for the note\n  getStemExtension() {\n    const glyph = this.getGlyph();\n\n    if (this.stem_extension_override != null) {\n      return this.stem_extension_override;\n    }\n\n    if (glyph) {\n      return this.getStemDirection() === 1\n        ? glyph.tabnote_stem_up_extension\n        : glyph.tabnote_stem_down_extension;\n    }\n\n    return 0;\n  }\n\n  // Add a dot to the note\n  addDot() {\n    const dot = new Dot();\n    this.dots += 1;\n    return this.addModifier(dot, 0);\n  }\n\n  // Calculate and store the width of the note\n  updateWidth() {\n    this.glyphs = [];\n    this.width = 0;\n    for (let i = 0; i < this.positions.length; ++i) {\n      let fret = this.positions[i].fret;\n      if (this.ghost) fret = '(' + fret + ')';\n      const glyph = Flow.tabToGlyph(fret, this.render_options.scale);\n      this.glyphs.push(glyph);\n      this.width = Math.max(glyph.getWidth(), this.width);\n    }\n    // For some reason we associate a notehead glyph with a TabNote, and this\n    // glyph is used for certain width calculations. Of course, this is totally\n    // incorrect since a notehead is a poor approximation for the dimensions of\n    // a fret number which can have multiple digits. As a result, we must\n    // overwrite getWidth() to return the correct width\n    this.glyph.getWidth = () => this.width;\n  }\n\n  // Set the `stave` to the note\n  setStave(stave) {\n    super.setStave(stave);\n    this.context = stave.context;\n\n    // Calculate the fret number width based on font used\n    let i;\n    if (this.context) {\n      const ctx = this.context;\n      this.width = 0;\n      for (i = 0; i < this.glyphs.length; ++i) {\n        const glyph = this.glyphs[i];\n        const text = '' + glyph.text;\n        if (text.toUpperCase() !== 'X') {\n          ctx.save();\n          ctx.setRawFont(this.render_options.font);\n          glyph.width = ctx.measureText(text).width;\n          ctx.restore();\n          glyph.getWidth = () => glyph.width;\n        }\n        this.width = Math.max(glyph.getWidth(), this.width);\n      }\n      this.glyph.getWidth = () => this.width;\n    }\n\n    // we subtract 1 from `line` because getYForLine expects a 0-based index,\n    // while the position.str is a 1-based index\n    const ys = this.positions.map(({ str: line }) => stave.getYForLine(line - 1));\n\n    this.setYs(ys);\n\n    if (this.stem) {\n      this.stem.setYBounds(this.getStemY(), this.getStemY());\n    }\n\n    return this;\n  }\n\n  // Get the fret positions for the note\n  getPositions() { return this.positions; }\n\n  // Add self to the provided modifier context `mc`\n  addToModifierContext(mc) {\n    this.setModifierContext(mc);\n    for (let i = 0; i < this.modifiers.length; ++i) {\n      this.modifierContext.addModifier(this.modifiers[i]);\n    }\n    this.modifierContext.addModifier(this);\n    this.preFormatted = false;\n    return this;\n  }\n\n  // Get the `x` coordinate to the right of the note\n  getTieRightX() {\n    let tieStartX = this.getAbsoluteX();\n    const note_glyph_width = this.glyph.getWidth();\n    tieStartX += note_glyph_width / 2;\n    tieStartX += (-this.width / 2) + this.width + 2;\n\n    return tieStartX;\n  }\n\n  // Get the `x` coordinate to the left of the note\n  getTieLeftX() {\n    let tieEndX = this.getAbsoluteX();\n    const note_glyph_width = this.glyph.getWidth();\n    tieEndX += note_glyph_width / 2;\n    tieEndX -= (this.width / 2) + 2;\n\n    return tieEndX;\n  }\n\n  // Get the default `x` and `y` coordinates for a modifier at a specific\n  // `position` at a fret position `index`\n  getModifierStartXY(position, index) {\n    if (!this.preFormatted) {\n      throw new Vex.RERR('UnformattedNote', \"Can't call GetModifierStartXY on an unformatted note\");\n    }\n\n    if (this.ys.length === 0) {\n      throw new Vex.RERR('NoYValues', 'No Y-Values calculated for this note.');\n    }\n\n    let x = 0;\n    if (position === Modifier.Position.LEFT) {\n      x = -1 * 2;  // extra_left_px\n    } else if (position === Modifier.Position.RIGHT) {\n      x = this.width + 2; // extra_right_px\n    } else if (position === Modifier.Position.BELOW || position === Modifier.Position.ABOVE) {\n      const note_glyph_width = this.glyph.getWidth();\n      x = note_glyph_width / 2;\n    }\n\n    return {\n      x: this.getAbsoluteX() + x,\n      y: this.ys[index],\n    };\n  }\n\n  // Get the default line for rest\n  getLineForRest() { return this.positions[0].str; }\n\n  // Pre-render formatting\n  preFormat() {\n    if (this.preFormatted) return;\n    if (this.modifierContext) this.modifierContext.preFormat();\n    // width is already set during init()\n    this.setPreFormatted(true);\n  }\n\n  // Get the x position for the stem\n  getStemX() { return this.getCenterGlyphX(); }\n\n  // Get the y position for the stem\n  getStemY() {\n    const num_lines = this.stave.getNumLines();\n\n    // The decimal staff line amounts provide optimal spacing between the\n    // fret number and the stem\n    const stemUpLine = -0.5;\n    const stemDownLine = num_lines - 0.5;\n    const stemStartLine = Stem.UP === this.stem_direction ? stemUpLine : stemDownLine;\n\n    return this.stave.getYForLine(stemStartLine);\n  }\n\n  // Get the stem extents for the tabnote\n  getStemExtents() {\n    return this.stem.getExtents();\n  }\n\n  // Draw the fal onto the context\n  drawFlag() {\n    const {\n      beam, glyph, context, stem, stem_direction,\n      render_options: { draw_stem, glyph_font_scale },\n    } = this;\n\n    const shouldDrawFlag = beam == null && draw_stem;\n\n    // Now it's the flag's turn.\n    if (glyph.flag && shouldDrawFlag) {\n      const flag_x = this.getStemX() + 1;\n      const flag_y = this.getStemY() - stem.getHeight();\n\n      const flag_code = stem_direction === Stem.DOWN\n        ? glyph.code_flag_downstem // Down stems have flags on the left.\n        : glyph.code_flag_upstem;\n\n      // Draw the Flag\n      Glyph.renderGlyph(context, flag_x, flag_y, glyph_font_scale, flag_code);\n    }\n  }\n\n  // Render the modifiers onto the context\n  drawModifiers() {\n    // Draw the modifiers\n    this.modifiers.forEach((modifier) => {\n      // Only draw the dots if enabled\n      if (modifier.getCategory() === 'dots' && !this.render_options.draw_dots) return;\n\n      modifier.setContext(this.context);\n      modifier.drawWithStyle();\n    });\n  }\n\n  // Render the stem extension through the fret positions\n  drawStemThrough() {\n    const stem_x = this.getStemX();\n    const stem_y = this.getStemY();\n    const ctx = this.context;\n\n    const stem_through = this.render_options.draw_stem_through_stave;\n    const draw_stem = this.render_options.draw_stem;\n    if (draw_stem && stem_through) {\n      const total_lines = this.stave.getNumLines();\n      const strings_used = this.positions.map(position => position.str);\n\n      const unused_strings = getUnusedStringGroups(total_lines, strings_used);\n      const stem_lines = getPartialStemLines(\n        stem_y,\n        unused_strings,\n        this.getStave(),\n        this.getStemDirection()\n      );\n\n      ctx.save();\n      ctx.setLineWidth(Stem.WIDTH);\n      stem_lines.forEach(bounds => {\n        if (bounds.length === 0) return;\n\n        ctx.beginPath();\n        ctx.moveTo(stem_x, bounds[0]);\n        ctx.lineTo(stem_x, bounds[bounds.length - 1]);\n        ctx.stroke();\n        ctx.closePath();\n      });\n      ctx.restore();\n    }\n  }\n\n  // Render the fret positions onto the context\n  drawPositions() {\n    const ctx = this.context;\n    const x = this.getAbsoluteX();\n    const ys = this.ys;\n    for (let i = 0; i < this.positions.length; ++i) {\n      const y = ys[i] + this.render_options.y_shift;\n      const glyph = this.glyphs[i];\n\n      // Center the fret text beneath the notation note head\n      const note_glyph_width = this.glyph.getWidth();\n      const tab_x = x + (note_glyph_width / 2) - (glyph.getWidth() / 2);\n\n      // FIXME: Magic numbers.\n      ctx.clearRect(tab_x - 2, y - 3, glyph.getWidth() + 4, 6);\n\n      if (glyph.code) {\n        Glyph.renderGlyph(ctx, tab_x, y,\n          this.render_options.glyph_font_scale * this.render_options.scale,\n          glyph.code);\n      } else {\n        ctx.save();\n        ctx.setRawFont(this.render_options.font);\n        const text = glyph.text.toString();\n        ctx.fillText(text, tab_x, y + 5 * this.render_options.scale);\n        ctx.restore();\n      }\n    }\n  }\n\n  // The main rendering function for the entire note\n  draw() {\n    this.checkContext();\n\n    if (!this.stave) {\n      throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n    }\n\n    if (this.ys.length === 0) {\n      throw new Vex.RERR('NoYValues', \"Can't draw note without Y values.\");\n    }\n\n    this.setRendered();\n    const render_stem = this.beam == null && this.render_options.draw_stem;\n\n    this.drawPositions();\n    this.drawStemThrough();\n\n    const stem_x = this.getStemX();\n\n    this.stem.setNoteHeadXBounds(stem_x, stem_x);\n\n    if (render_stem) {\n      this.context.openGroup('stem', null, { pointerBBox: true });\n      this.stem.setContext(this.context).draw();\n      this.context.closeGroup();\n    }\n\n    this.drawFlag();\n    this.drawModifiers();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Balazs Forian-Szabo\n//\n// ## Description\n//\n// This file implements `VibratoBrackets`\n// that renders vibrato effect between two notes.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Vibrato } from './vibrato';\n\n// To enable logging for this class. Set `Vex.Flow.VibratoBracket.DEBUG` to `true`.\nfunction L(...args) { if (VibratoBracket.DEBUG) Vex.L('Vex.Flow.VibratoBracket', args); }\n\nexport class VibratoBracket extends Element {\n  // bracket_data = {\n  //   start: Vex.Flow.Note (optional)\n  //   stop: Vex.Flow.Note (optional)\n  // };\n  // Either the stop or start note must be set, or both of them.\n  // A null value for the start or stop note indicates that the vibrato\n  // is drawn from the beginning or until the end of the stave accordingly.\n  constructor(bracket_data) {\n    super();\n    this.setAttribute('type', 'VibratoBracket');\n\n    this.start = bracket_data.start;\n    this.stop = bracket_data.stop;\n\n    this.line = 1;\n\n    this.render_options = {\n      harsh: false,\n      wave_height: 6,\n      wave_width: 4,\n      wave_girth: 2,\n    };\n  }\n\n  // Set line position of the vibrato bracket\n  setLine(line) { this.line = line; return this; }\n  setHarsh(harsh) { this.render_options.harsh = harsh; return this; }\n\n  // Draw the vibrato bracket on the rendering context\n  draw() {\n    const ctx = this.context;\n    this.setRendered();\n\n    const y = (this.start)\n      ? this.start.getStave().getYForTopText(this.line)\n      : this.stop.getStave().getYForTopText(this.line);\n\n    // If start note is not set then vibrato will be drawn\n    // from the beginning of the stave\n    const start_x = (this.start)\n      ? this.start.getAbsoluteX()\n      : this.stop.getStave().getTieStartX();\n\n    // If stop note is not set then vibrato will be drawn\n    // until the end of the stave\n    const stop_x = (this.stop)\n      ? this.stop.getAbsoluteX() - this.stop.getWidth() - 5\n      : this.start.getStave().getTieEndX() - 10;\n\n    this.render_options.vibrato_width = stop_x - start_x;\n\n    L('Rendering VibratoBracket: start_x:', start_x, 'stop_x:', stop_x, 'y:', y);\n\n    Vibrato.renderVibrato(ctx, start_x, y, this.render_options);\n  }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements multiple measure rests\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Glyph } from './glyph';\nimport { NoteHead } from './notehead';\nimport { StaveModifier } from './stavemodifier';\nimport { TimeSignature } from './timesignature';\n\nlet semibrave_rest;\nfunction get_semibrave_rest() {\n  if (!semibrave_rest) {\n    const notehead = new NoteHead({ duration: 'w', note_type: 'r' });\n    semibrave_rest = {\n      glyph_font_scale: notehead.render_options.glyph_font_scale,\n      glyph_code: notehead.glyph_code,\n      width: notehead.getWidth(),\n    };\n  }\n  return semibrave_rest;\n}\n\nexport class MultiMeasureRest extends Element {\n  // Parameters:\n  // * `number_of_measures` - Number of measures.\n  // * `options` - The options object.\n  //   * `show_number` - Show number of measures string or not.\n  //   * `number_line` -  Staff line to render the number of measures string.\n  //   * `number_glyph_point` - Size of the number of measures string glyphs.\n  //   * `padding_left` - Left padding from stave x.\n  //   * `padding_right` - Right padding from stave end x.\n  //   * `line` - Staff line to render rest line or rest symbols.\n  //   * `spacing_between_lines_px` - Spacing between staff lines to\n  // resolve serif height or {2-bar and 4-bar}rest symbol height.\n  //   * `line_thickness` - Rest line thickness.\n  //   * `serif_thickness` - Rest serif line thickness.\n  //   * `use_symbols` - Use rest symbols or not.\n  //   * `symbol_spacing` - Spacing between each rest symbol glyphs.\n  //   * `semibrave_rest_glyph_scale` - Size of the semibrave(1-bar) rest symbol.\n  constructor(number_of_measures, options) {\n    super();\n    this.setAttribute('type', 'MultiMeasureRest');\n\n    this.render_options = {\n      show_number: true,\n      number_line: -0.5,\n      number_glyph_point: 40, // same as TimeSignature.\n\n      padding_left: undefined,\n      padding_right: undefined,\n\n      line: 2,\n\n      spacing_between_lines_px: 10, // same as Stave.\n\n      line_thickness: undefined,\n      serif_thickness: 2,\n\n      use_symbols: false,\n      symbol_spacing: undefined,\n\n      /* same as NoteHead. */\n      semibrave_rest_glyph_scale: Flow.DEFAULT_NOTATION_FONT_SCALE,\n    };\n    Vex.Merge(this.render_options, options);\n\n    this.number_of_measures = number_of_measures;\n    this.xs = {\n      left: NaN,\n      right: NaN,\n    };\n  }\n\n  getXs() {\n    return this.xs;\n  }\n\n  setStave(stave) {\n    this.stave = stave;\n    return this;\n  }\n\n  getStave() {\n    return this.stave;\n  }\n\n  drawLine(ctx, left, right, sbl) {\n    const y = this.stave.getYForLine(this.render_options.line);\n    const padding = (right - left) * 0.1;\n\n    left += padding;\n    right -= padding;\n\n    const serif = {\n      thickness: this.render_options.serif_thickness,\n      height: sbl,\n    };\n    let lineThicknessHalf = sbl * 0.25;\n    if (!isNaN(this.render_options.line_thickness)) {\n      lineThicknessHalf = this.render_options.line_thickness * 0.5;\n    }\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.moveTo(left, y - sbl);\n    ctx.lineTo(left + serif.thickness, y - sbl);\n    ctx.lineTo(left + serif.thickness, y - lineThicknessHalf);\n    ctx.lineTo(right - serif.thickness, y - lineThicknessHalf);\n    ctx.lineTo(right - serif.thickness, y - sbl);\n    ctx.lineTo(right, y - sbl);\n    ctx.lineTo(right, y + sbl);\n    ctx.lineTo(right - serif.thickness, y + sbl);\n    ctx.lineTo(right - serif.thickness, y + lineThicknessHalf);\n    ctx.lineTo(left + serif.thickness, y + lineThicknessHalf);\n    ctx.lineTo(left + serif.thickness, y + sbl);\n    ctx.lineTo(left, y + sbl);\n    ctx.closePath();\n    ctx.fill();\n  }\n\n  drawSymbols(ctx, left, right, sbl) {\n    const n4 = Math.floor(this.number_of_measures / 4);\n    const n = this.number_of_measures % 4;\n    const n2 = Math.floor(n / 2);\n    const n1 = n % 2;\n\n    const semibrave_rest = get_semibrave_rest();\n    const semibrave_rest_width = semibrave_rest.width *\n      (this.render_options.semibrave_rest_glyph_scale / semibrave_rest.glyph_font_scale);\n    const glyphs = {\n      2: {\n        width: semibrave_rest_width * 0.5,\n        height: sbl,\n      },\n      1: {\n        width: semibrave_rest_width,\n      },\n    };\n\n    let spacing = semibrave_rest_width * 1.35;\n    if (!isNaN(this.render_options.symbol_spacing)) {\n      spacing = this.render_options.symbol_spacing;\n    }\n\n    const width = (n4 * glyphs[2].width) + (n2 * glyphs[2].width)\n      + (n1 * glyphs[1].width) + ((n4 + n2 + n1 - 1) * spacing);\n    let x = left + ((right - left) * 0.5) - (width * 0.5);\n    const yTop = this.stave.getYForLine(this.render_options.line - 1);\n    const yMiddle = this.stave.getYForLine(this.render_options.line);\n    const yBottom = this.stave.getYForLine(this.render_options.line + 1);\n\n    ctx.save();\n    ctx.setStrokeStyle('none');\n    ctx.setLineWidth(0);\n\n    for (let i = 0; i < n4; ++i) {\n      ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n      ctx.fillRect(x, yBottom - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n      x += glyphs[2].width + spacing;\n    }\n    for (let i = 0; i < n2; ++i) {\n      ctx.fillRect(x, yMiddle - glyphs[2].height, glyphs[2].width, glyphs[2].height);\n      x += glyphs[2].width + spacing;\n    }\n    for (let i = 0; i < n1; ++i) {\n      Glyph.renderGlyph(ctx, x, yTop, this.render_options.semibrave_rest_glyph_scale,\n        semibrave_rest.glyph_code);\n      x += glyphs[1].width + spacing;\n    }\n\n    ctx.restore();\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const ctx = this.context;\n    const stave = this.stave;\n    const sbl = this.render_options.spacing_between_lines_px;\n\n    let left = stave.getNoteStartX();\n    let right = stave.getNoteEndX();\n\n    // FIXME: getNoteStartX() returns x+5(barline width) and\n    // getNoteEndX() returns x + width(no barline width) by default. how to fix?\n    const begModifiers = stave.getModifiers(StaveModifier.Position.BEGIN);\n    if (begModifiers.length === 1 && begModifiers[0].getCategory() === 'barlines') {\n      left -= begModifiers[0].getWidth();\n    }\n\n    if (!isNaN(this.render_options.padding_left)) {\n      left = stave.getX() + this.render_options.padding_left;\n    }\n\n    if (!isNaN(this.render_options.padding_right)) {\n      right = stave.getX() + stave.getWidth() - this.render_options.padding_right;\n    }\n\n    this.xs.left = left;\n    this.xs.right = right;\n\n    if (this.render_options.use_symbols) {\n      this.drawSymbols(ctx, left, right, sbl);\n    } else {\n      this.drawLine(ctx, left, right, sbl);\n    }\n\n    if (this.render_options.show_number) {\n      const timeSpec = '/' + this.number_of_measures;\n      const timeSig = new TimeSignature(null, undefined, false);\n      timeSig.point = this.render_options.number_glyph_point;\n      timeSig.setTimeSig(timeSpec);\n      timeSig.setStave(stave);\n      timeSig.x = left + ((right - left) * 0.5) - (timeSig.timeSig.glyph.getMetrics().width * 0.5);\n      timeSig.bottomLine = this.render_options.number_line;\n      timeSig.setContext(ctx).draw();\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Copyright Mohit Muthanna 2010\n//\n// Author Taehoon Moon 2014\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Clef } from './clef';\nimport { Glyph } from './glyph';\n\n/** @constructor */\nexport class ClefNote extends Note {\n  static get CATEGORY() { return 'clefnote'; }\n\n  constructor(type, size, annotation) {\n    super({ duration: 'b' });\n    this.setAttribute('type', 'ClefNote');\n\n    this.setType(type, size, annotation);\n\n    // Note properties\n    this.ignore_ticks = true;\n  }\n\n  setType(type, size, annotation) {\n    this.type = type;\n    this.clef_obj = new Clef(type, size, annotation);\n    this.clef = this.clef_obj.clef;\n    this.glyph = new Glyph(this.clef.code, this.clef.point);\n    this.setWidth(this.glyph.getMetrics().width);\n    return this;\n  }\n\n  getClef() {\n    return this.clef;\n  }\n\n  setContext(context) {\n    this.context = context;\n    this.glyph.setContext(this.context);\n    return this;\n  }\n\n  getBoundingBox() {\n    return super.getBoundingBox();\n  }\n\n  addToModifierContext() {\n    /* overridden to ignore */\n    return this;\n  }\n\n  getCategory() { return ClefNote.CATEGORY; }\n\n  preFormat() {\n    this.setPreFormatted(true);\n    return this;\n  }\n\n  draw() {\n    if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n\n    if (!this.glyph.getContext()) {\n      this.glyph.setContext(this.context);\n    }\n\n    this.setRendered();\n    const abs_x = this.getAbsoluteX();\n\n    this.glyph.setStave(this.stave);\n    this.glyph.setYShift(\n      this.stave.getYForLine(this.clef.line) - this.stave.getYForGlyphs());\n    this.glyph.renderToStave(abs_x);\n\n    // If the Vex.Flow.Clef has an annotation, such as 8va, draw it.\n    if (this.clef_obj.annotation !== undefined) {\n      const attachment = new Glyph(this.clef_obj.annotation.code, this.clef_obj.annotation.point);\n      if (!attachment.getContext()) {\n        attachment.setContext(this.context);\n      }\n      attachment.setStave(this.stave);\n      attachment.setYShift(\n        this.stave.getYForLine(this.clef_obj.annotation.line) - this.stave.getYForGlyphs());\n      attachment.setXShift(this.clef_obj.annotation.x_shift);\n      attachment.renderToStave(abs_x);\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Mark Meeus 2019\n\nimport { Note } from './note';\nimport { KeySignature } from './keysignature';\n\nexport class KeySigNote extends Note {\n  constructor(keySpec, cancelKeySpec, alterKeySpec) {\n    super({ duration: 'b' });\n    this.setAttribute('type', 'KeySigNote');\n\n    this.keySignature = new KeySignature(keySpec, cancelKeySpec, alterKeySpec);\n\n    // Note properties\n    this.ignore_ticks = true;\n  }\n\n  getBoundingBox() {\n    return super.getBoundingBox();\n  }\n\n  addToModifierContext() {\n    /* overridden to ignore */\n    return this;\n  }\n\n  preFormat() {\n    this.setPreFormatted(true);\n    this.keySignature.setStave(this.stave);\n    this.keySignature.format();\n    this.setWidth(this.keySignature.width);\n    return this;\n  }\n\n  draw() {\n    this.stave.checkContext();\n    this.setRendered();\n    this.keySignature.x = this.getAbsoluteX();\n    this.keySignature.setContext(this.context);\n    this.keySignature.draw();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author Taehoon Moon 2014\n\nimport { Note } from './note';\nimport { TimeSignature } from './timesignature';\n\nexport class TimeSigNote extends Note {\n  constructor(timeSpec, customPadding) {\n    super({ duration: 'b' });\n    this.setAttribute('type', 'TimeSigNote');\n\n    const timeSignature = new TimeSignature(timeSpec, customPadding);\n    this.timeSig = timeSignature.getTimeSig();\n    this.setWidth(this.timeSig.glyph.getMetrics().width);\n\n    // Note properties\n    this.ignore_ticks = true;\n  }\n\n  getBoundingBox() {\n    return super.getBoundingBox();\n  }\n\n  addToModifierContext() {\n    /* overridden to ignore */\n    return this;\n  }\n\n  preFormat() {\n    this.setPreFormatted(true);\n    return this;\n  }\n\n  draw() {\n    this.stave.checkContext();\n    this.setRendered();\n\n    if (!this.timeSig.glyph.getContext()) {\n      this.timeSig.glyph.setContext(this.context);\n    }\n\n    this.timeSig.glyph.setStave(this.stave);\n    this.timeSig.glyph.setYShift(\n      this.stave.getYForLine(this.timeSig.line) - this.stave.getYForGlyphs());\n    this.timeSig.glyph.renderToStave(this.getAbsoluteX());\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of ties between contiguous notes. The\n// ties include: regular ties, hammer ons, pull offs, and slides.\n\nimport { Vex } from './vex';\nimport { TabTie } from './tabtie';\n\nexport class TabSlide extends TabTie {\n  static get SLIDE_UP() {\n    return 1;\n  }\n  static get SLIDE_DOWN() {\n    return -1;\n  }\n\n  static createSlideUp(notes) {\n    return new TabSlide(notes, TabSlide.SLIDE_UP);\n  }\n\n  static createSlideDown(notes) {\n    return new TabSlide(notes, TabSlide.SLIDE_DOWN);\n  }\n\n  constructor(notes, direction) {\n    /**\n     * Notes is a struct that has:\n     *\n     *  {\n     *    first_note: Note,\n     *    last_note: Note,\n     *    first_indices: [n1, n2, n3],\n     *    last_indices: [n1, n2, n3]\n     *  }\n     *\n     **/\n    super(notes, 'sl.');\n    this.setAttribute('type', 'TabSlide');\n\n    if (!direction) {\n      const first_fret = notes.first_note.getPositions()[0].fret;\n      const last_fret = notes.last_note.getPositions()[0].fret;\n\n      direction = ((parseInt(first_fret, 10) > parseInt(last_fret, 10)) ?\n        TabSlide.SLIDE_DOWN : TabSlide.SLIDE_UP);\n    }\n\n    this.slide_direction = direction;\n    this.render_options.cp1 = 11;\n    this.render_options.cp2 = 14;\n    this.render_options.y_shift = 0.5;\n\n    this.setFont({ font: 'Times', size: 10, style: 'bold italic' });\n    this.setNotes(notes);\n  }\n\n  renderTie(params) {\n    if (params.first_ys.length === 0 || params.last_ys.length === 0) {\n      throw new Vex.RERR('BadArguments', 'No Y-values to render');\n    }\n\n    const ctx = this.context;\n    const first_x_px = params.first_x_px;\n    const first_ys = params.first_ys;\n    const last_x_px = params.last_x_px;\n\n    const direction = this.slide_direction;\n    if (direction !== TabSlide.SLIDE_UP && direction !== TabSlide.SLIDE_DOWN) {\n      throw new Vex.RERR('BadSlide', 'Invalid slide direction');\n    }\n\n    for (let i = 0; i < this.first_indices.length; ++i) {\n      const slide_y = first_ys[this.first_indices[i]] +\n        this.render_options.y_shift;\n\n      if (isNaN(slide_y)) {\n        throw new Vex.RERR('BadArguments', 'Bad indices for slide rendering.');\n      }\n\n      ctx.beginPath();\n      ctx.moveTo(first_x_px, slide_y + (3 * direction));\n      ctx.lineTo(last_x_px, slide_y - (3 * direction));\n      ctx.closePath();\n      ctx.stroke();\n    }\n\n    this.setRendered();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { StaveNote } from './stavenote';\nimport { Stem } from './stem';\nimport { Flow } from './tables';\n\nexport class GraceNote extends StaveNote {\n  static get CATEGORY() { return 'gracenotes'; }\n  static get LEDGER_LINE_OFFSET() { return 2; }\n  static get SCALE() { return 0.66; }\n\n  constructor(note_struct) {\n    super(Object.assign(note_struct, {\n      glyph_font_scale: Flow.DEFAULT_NOTATION_FONT_SCALE * GraceNote.SCALE,\n      stroke_px: GraceNote.LEDGER_LINE_OFFSET,\n    }));\n    this.setAttribute('type', 'GraceNote');\n\n    this.slash = note_struct.slash;\n    this.slur = true;\n\n    this.buildNoteHeads();\n\n    this.width = 3;\n  }\n\n  getStemExtension() {\n    if (this.stem_extension_override != null) {\n      return this.stem_extension_override;\n    }\n\n    const glyph = this.getGlyph();\n    if (glyph) {\n      let ret = super.getStemExtension();\n      if (glyph.stem) {\n        const staveNoteScale = this.getStaveNoteScale();\n        ret = ((Stem.HEIGHT + ret) * staveNoteScale) - Stem.HEIGHT;\n      }\n      return ret;\n    }\n\n    return 0;\n  }\n\n  getCategory() { return GraceNote.CATEGORY; }\n\n  // FIXME: move this to more basic class.\n  getStaveNoteScale() {\n    return this.render_options.glyph_font_scale / Flow.DEFAULT_NOTATION_FONT_SCALE;\n  }\n\n  draw() {\n    super.draw();\n    this.setRendered();\n    const stem = this.stem;\n    if (this.slash && stem) {\n      const staveNoteScale = this.getStaveNoteScale();\n\n      // some magic numbers are based on the staveNoteScale 0.66.\n      const offsetScale = staveNoteScale / 0.66;\n      let slashBBox = undefined;\n      const beam = this.beam;\n      if (beam) {\n        // FIXME: should render slash after beam?\n        if (!beam.postFormatted) {\n          beam.postFormat();\n        }\n\n        slashBBox = this.calcBeamedNotesSlashBBox(8 * offsetScale,\n          8 * offsetScale,\n          {\n            stem: 6 * offsetScale,\n            beam: 5 * offsetScale,\n          });\n      } else {\n        const stem_direction = this.getStemDirection();\n        const noteHeadBounds = this.getNoteHeadBounds();\n        const noteStemHeight = stem.getHeight();\n        let x = this.getAbsoluteX();\n        let y = stem_direction === Flow.Stem.DOWN ?\n          noteHeadBounds.y_top - noteStemHeight :\n          noteHeadBounds.y_bottom - noteStemHeight;\n\n        const defaultStemExtention = stem_direction === Flow.Stem.DOWN ?\n          this.glyph.stem_down_extension :\n          this.glyph.stem_up_extension;\n\n        let defaultOffsetY = Flow.STEM_HEIGHT;\n        defaultOffsetY -= (defaultOffsetY / 2.8);\n        defaultOffsetY += defaultStemExtention;\n        y += ((defaultOffsetY * staveNoteScale) * stem_direction);\n\n        const offsets = stem_direction === Flow.Stem.UP ? {\n          x1: 1,\n          y1: 0,\n          x2: 13,\n          y2: -9,\n        } : {\n          x1: -4,\n          y1: 1,\n          x2: 13,\n          y2: 9,\n        };\n\n        x += (offsets.x1 * offsetScale);\n        y += (offsets.y1 * offsetScale);\n        slashBBox = {\n          x1: x,\n          y1: y,\n          x2: x + (offsets.x2 * offsetScale),\n          y2: y + (offsets.y2 * offsetScale),\n        };\n      }\n\n      // FIXME: avoide staff lines, leadger lines or others.\n\n      const ctx = this.context;\n      ctx.save();\n      ctx.setLineWidth(1 * offsetScale); // FIXME: use more appropriate value.\n      ctx.beginPath();\n      ctx.moveTo(slashBBox.x1, slashBBox.y1);\n      ctx.lineTo(slashBBox.x2, slashBBox.y2);\n      ctx.closePath();\n      ctx.stroke();\n      ctx.restore();\n    }\n  }\n\n  calcBeamedNotesSlashBBox(slashStemOffset, slashBeamOffset, protrusions) {\n    const beam = this.beam;\n    const beam_slope = beam.slope;\n    const isBeamEndNote = (beam.notes[beam.notes.length - 1] === this);\n    const scaleX = isBeamEndNote ? -1 : 1;\n    const beam_angle = Math.atan(beam_slope * scaleX);\n\n    // slash line intersecting point on beam.\n    const iPointOnBeam = {\n      dx: Math.cos(beam_angle) * slashBeamOffset,\n      dy: Math.sin(beam_angle) * slashBeamOffset,\n    };\n\n    slashStemOffset *= this.getStemDirection();\n    const slash_angle = Math.atan((iPointOnBeam.dy - slashStemOffset) / iPointOnBeam.dx);\n    const protrusion_stem_dx = Math.cos(slash_angle) * protrusions.stem * scaleX;\n    const protrusion_stem_dy = Math.sin(slash_angle) * protrusions.stem;\n    const protrusion_beam_dx = Math.cos(slash_angle) * protrusions.beam * scaleX;\n    const protrusion_beam_dy = Math.sin(slash_angle) * protrusions.beam;\n\n    const stemX = this.getStemX();\n    const stem0X = beam.notes[0].getStemX();\n    const stemY = this.beam.getBeamYToDraw() + ((stemX - stem0X) * beam_slope);\n\n    const ret = {\n      x1: stemX - protrusion_stem_dx,\n      y1: (stemY + slashStemOffset - protrusion_stem_dy),\n      x2: stemX + (iPointOnBeam.dx * scaleX) + protrusion_beam_dx,\n      y2: stemY + iPointOnBeam.dy + protrusion_beam_dy,\n    };\n    return ret;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Balazs Forian-Szabo\n//\n// ## Description\n//\n// A basic implementation of grace notes\n// to be rendered on a tab stave.\n//\n// See `tests/gracetabnote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { TabNote } from './tabnote';\n\nexport class GraceTabNote extends TabNote {\n  static get CATEGORY() { return 'gracetabnotes'; }\n\n  constructor(note_struct) {\n    super(note_struct, false);\n    this.setAttribute('type', 'GraceTabNote');\n\n    Vex.Merge(this.render_options, {\n      // vertical shift from stave line\n      y_shift: 0.3,\n      // grace glyph scale\n      scale: 0.6,\n      // grace tablature font\n      font: '7.5pt Arial',\n    });\n\n    this.updateWidth();\n  }\n\n  getCategory() { return GraceTabNote.CATEGORY; }\n\n  draw() {\n    super.draw();\n    this.setRendered();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class implements varies types of tunings for tablature.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\n\nexport class Tuning {\n  static get names() {\n    return {\n      'standard': 'E/5,B/4,G/4,D/4,A/3,E/3',\n      'dagdad': 'D/5,A/4,G/4,D/4,A/3,D/3',\n      'dropd': 'E/5,B/4,G/4,D/4,A/3,D/3',\n      'eb': 'Eb/5,Bb/4,Gb/4,Db/4,Ab/3,Db/3',\n      'standardBanjo': 'D/5,B/4,G/4,D/4,G/5',\n    };\n  }\n\n  constructor(tuningString = 'E/5,B/4,G/4,D/4,A/3,E/3,B/2,E/2') {\n    // Default to standard tuning.\n    this.setTuning(tuningString);\n  }\n\n  noteToInteger(noteString) {\n    return Flow.keyProperties(noteString).int_value;\n  }\n\n  setTuning(noteString) {\n    if (Tuning.names[noteString]) {\n      noteString = Tuning.names[noteString];\n    }\n\n    this.tuningString = noteString;\n    this.tuningValues = [];\n    this.numStrings = 0;\n\n    const keys = noteString.split(/\\s*,\\s*/);\n    if (keys.length === 0) {\n      throw new Vex.RERR('BadArguments', 'Invalid tuning string: ' + noteString);\n    }\n\n    this.numStrings = keys.length;\n    for (let i = 0; i < this.numStrings; ++i) {\n      this.tuningValues[i] = this.noteToInteger(keys[i]);\n    }\n  }\n\n  getValueForString(stringNum) {\n    const s = parseInt(stringNum, 10);\n    if (s < 1 || s > this.numStrings) {\n      throw new Vex.RERR(\n        'BadArguments', `String number must be between 1 and ${this.numStrings}:${stringNum}`\n      );\n    }\n\n    return this.tuningValues[s - 1];\n  }\n\n  getValueForFret(fretNum, stringNum) {\n    const stringValue = this.getValueForString(stringNum);\n    const f = parseInt(fretNum, 10);\n\n    if (f < 0) {\n      throw new Vex.RERR('BadArguments', 'Fret number must be 0 or higher: ' +\n          fretNum);\n    }\n\n    return stringValue + f;\n  }\n\n  getNoteForFret(fretNum, stringNum) {\n    const noteValue = this.getValueForFret(fretNum, stringNum);\n\n    const octave = Math.floor(noteValue / 12);\n    const value = noteValue % 12;\n\n    return Flow.integerToNote(value) + '/' + octave;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This class by Raffaele Viglianti, 2012 http://itisnotsound.wordpress.com/\n//\n// This class implements hairpins between notes.\n// Hairpins can be either Crescendo or Descrescendo.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Modifier } from './modifier';\n\nexport class StaveHairpin extends Element {\n  static get type() {\n    return {\n      CRESC: 1,\n      DECRESC: 2,\n    };\n  }\n\n  /* Helper function to convert ticks into pixels.\n   * Requires a Formatter with voices joined and formatted (to\n   * get pixels per tick)\n   *\n   * options is struct that has:\n   *\n   *  {\n   *   height: px,\n   *   y_shift: px, //vertical offset\n   *   left_shift_ticks: 0, //left horizontal offset expressed in ticks\n   *   right_shift_ticks: 0 // right horizontal offset expressed in ticks\n   *  }\n   *\n   **/\n  static FormatByTicksAndDraw(ctx, formatter, notes, type, position, options) {\n    const ppt = formatter.pixelsPerTick;\n\n    if (ppt == null) {\n      throw new Vex.RuntimeError(\n        'BadArguments',\n        'A valid Formatter must be provide to draw offsets by ticks.'\n      );\n    }\n\n    const l_shift_px = ppt * options.left_shift_ticks;\n    const r_shift_px = ppt * options.right_shift_ticks;\n\n    const hairpin_options = {\n      height: options.height,\n      y_shift: options.y_shift,\n      left_shift_px: l_shift_px,\n      right_shift_px: r_shift_px };\n\n    new StaveHairpin({\n      first_note: notes.first_note,\n      last_note: notes.last_note,\n    }, type)\n      .setContext(ctx)\n      .setRenderOptions(hairpin_options)\n      .setPosition(position)\n      .draw();\n  }\n\n  /**\n   * Create a new hairpin from the specified notes.\n   *\n   * @constructor\n   * @param {!Object} notes The notes to tie up.\n   * @param {!Object} type The type of hairpin\n   */\n  constructor(notes, type) {\n    /**\n     * Notes is a struct that has:\n     *\n     *  {\n     *    first_note: Note,\n     *    last_note: Note,\n     *  }\n     *\n     **/\n    super();\n    this.setAttribute('type', 'StaveHairpin');\n    this.notes = notes;\n    this.hairpin = type;\n    this.position = Modifier.Position.BELOW;\n\n    this.render_options = {\n      height: 10,\n      y_shift: 0, // vertical offset\n      left_shift_px: 0, // left horizontal offset\n      right_shift_px: 0, // right horizontal offset\n    };\n\n    this.setNotes(notes);\n  }\n\n  setPosition(position) {\n    if (position === Modifier.Position.ABOVE || position === Modifier.Position.BELOW) {\n      this.position = position;\n    }\n    return this;\n  }\n\n  setRenderOptions(options) {\n    if (\n      options.height != null &&\n      options.y_shift != null &&\n      options.left_shift_px != null &&\n      options.right_shift_px != null\n    ) {\n      this.render_options = options;\n    }\n    return this;\n  }\n\n  /**\n   * Set the notes to attach this hairpin to.\n   *\n   * @param {!Object} notes The start and end notes.\n   */\n  setNotes(notes) {\n    if (!notes.first_note && !notes.last_note) {\n      throw new Vex.RuntimeError(\n        'BadArguments',\n        'Hairpin needs to have either first_note or last_note set.'\n      );\n    }\n\n    // Success. Lets grab 'em notes.\n    this.first_note = notes.first_note;\n    this.last_note = notes.last_note;\n    return this;\n  }\n\n  renderHairpin(params) {\n    const ctx = this.checkContext();\n    let dis = this.render_options.y_shift + 20;\n    let y_shift = params.first_y;\n\n    if (this.position === Modifier.Position.ABOVE) {\n      dis = -dis + 30;\n      y_shift = params.first_y - params.staff_height;\n    }\n\n    const l_shift = this.render_options.left_shift_px;\n    const r_shift = this.render_options.right_shift_px;\n\n    ctx.beginPath();\n\n    switch (this.hairpin) {\n      case StaveHairpin.type.CRESC:\n        ctx.moveTo(params.last_x + r_shift, y_shift + dis);\n        ctx.lineTo(params.first_x + l_shift, y_shift + (this.render_options.height / 2) + dis);\n        ctx.lineTo(params.last_x + r_shift, y_shift + this.render_options.height + dis);\n        break;\n      case StaveHairpin.type.DECRESC:\n        ctx.moveTo(params.first_x + l_shift, y_shift + dis);\n        ctx.lineTo(params.last_x + r_shift, y_shift + (this.render_options.height / 2) + dis);\n        ctx.lineTo(params.first_x + l_shift, y_shift + this.render_options.height + dis);\n        break;\n      default:\n        // Default is NONE, so nothing to draw\n        break;\n    }\n\n    ctx.stroke();\n    ctx.closePath();\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const firstNote = this.first_note;\n    const lastNote = this.last_note;\n\n    const start = firstNote.getModifierStartXY(this.position, 0);\n    const end = lastNote.getModifierStartXY(this.position, 0);\n\n    this.renderHairpin({\n      first_x: start.x,\n      last_x: end.x,\n      first_y: firstNote.getStave().y + firstNote.getStave().height,\n      last_y: lastNote.getStave().y + lastNote.getStave().height,\n      staff_height: firstNote.getStave().height,\n    });\n    return true;\n  }\n}\n","// VexFlow - Music Engraving for HTML5\n// Copyright Mohit Muthanna 2010\n//\n// This class implements curves (for slurs)\n\nimport { Vex } from './vex';\nimport { Element } from './element';\n\nexport class Curve extends Element {\n  static get Position() {\n    return {\n      NEAR_HEAD: 1,\n      NEAR_TOP: 2,\n    };\n  }\n\n  static get PositionString() {\n    return {\n      nearHead: Curve.Position.NEAR_HEAD,\n      nearTop: Curve.Position.NEAR_TOP,\n    };\n  }\n\n  // from: Start note\n  // to: End note\n  // options:\n  //    cps: List of control points\n  //    x_shift: pixels to shift\n  //    y_shift: pixels to shift\n  constructor(from, to, options) {\n    super();\n    this.setAttribute('type', 'Curve');\n\n    this.render_options = {\n      spacing: 2,\n      thickness: 2,\n      x_shift: 0,\n      y_shift: 10,\n      position: Curve.Position.NEAR_HEAD,\n      position_end: Curve.Position.NEAR_HEAD,\n      invert: false,\n      cps: [{ x: 0, y: 10 }, { x: 0, y: 10 }],\n    };\n\n    Vex.Merge(this.render_options, options);\n    this.setNotes(from, to);\n  }\n\n  setNotes(from, to) {\n    if (!from && !to) {\n      throw new Vex.RuntimeError(\n        'BadArguments', 'Curve needs to have either first_note or last_note set.'\n      );\n    }\n\n    this.from = from;\n    this.to = to;\n    return this;\n  }\n\n  /**\n   * @return {boolean} Returns true if this is a partial bar.\n   */\n  isPartial() {\n    return (!this.from || !this.to);\n  }\n\n  renderCurve(params) {\n    const ctx = this.context;\n    const cps = this.render_options.cps;\n\n    const x_shift = this.render_options.x_shift;\n    const y_shift = this.render_options.y_shift * params.direction;\n\n    const first_x = params.first_x + x_shift;\n    const first_y = params.first_y + y_shift;\n    const last_x = params.last_x - x_shift;\n    const last_y = params.last_y + y_shift;\n    const thickness = this.render_options.thickness;\n\n    const cp_spacing = (last_x - first_x) / (cps.length + 2);\n\n    ctx.beginPath();\n    ctx.moveTo(first_x, first_y);\n    ctx.bezierCurveTo(\n      first_x + cp_spacing + cps[0].x,\n      first_y + (cps[0].y * params.direction),\n      last_x - cp_spacing + cps[1].x,\n      last_y + (cps[1].y * params.direction),\n      last_x,\n      last_y\n    );\n    ctx.bezierCurveTo(\n      last_x - cp_spacing + cps[1].x,\n      last_y + ((cps[1].y + thickness) * params.direction),\n      first_x + cp_spacing + cps[0].x,\n      first_y + ((cps[0].y + thickness) * params.direction),\n      first_x,\n      first_y\n    );\n    ctx.stroke();\n    ctx.closePath();\n    ctx.fill();\n  }\n\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const first_note = this.from;\n    const last_note = this.to;\n    let first_x;\n    let last_x;\n    let first_y;\n    let last_y;\n    let stem_direction;\n\n    let metric = 'baseY';\n    let end_metric = 'baseY';\n\n    function getPosition(position) {\n      return typeof(position) === 'string'\n        ? Curve.PositionString[position]\n        : position;\n    }\n    const position = getPosition(this.render_options.position);\n    const position_end = getPosition(this.render_options.position_end);\n\n    if (position === Curve.Position.NEAR_TOP) {\n      metric = 'topY';\n      end_metric = 'topY';\n    }\n\n    if (position_end === Curve.Position.NEAR_HEAD) {\n      end_metric = 'baseY';\n    } else if (position_end === Curve.Position.NEAR_TOP) {\n      end_metric = 'topY';\n    }\n\n    if (first_note) {\n      first_x = first_note.getTieRightX();\n      stem_direction = first_note.getStemDirection();\n      first_y = first_note.getStemExtents()[metric];\n    } else {\n      first_x = last_note.getStave().getTieStartX();\n      first_y = last_note.getStemExtents()[metric];\n    }\n\n    if (last_note) {\n      last_x = last_note.getTieLeftX();\n      stem_direction = last_note.getStemDirection();\n      last_y = last_note.getStemExtents()[end_metric];\n    } else {\n      last_x = first_note.getStave().getTieEndX();\n      last_y = first_note.getStemExtents()[end_metric];\n    }\n\n    this.renderCurve({\n      first_x,\n      last_x,\n      first_y,\n      last_y,\n      direction: stem_direction * (this.render_options.invert === true ? -1 : 1),\n    });\n    return true;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n// This file implements the `TextDynamics` which renders traditional\n// text dynamics markings, **ie: p, f, sfz, rfz, ppp**\n//\n// You can render any dynamics string that contains a combination of\n// the following letters:  P, M, F, Z, R, S\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.TextDynamics.DEBUG` to `true`.\nfunction L(...args) { if (TextDynamics.DEBUG) Vex.L('Vex.Flow.TextDynamics', args); }\n\nexport class TextDynamics extends Note {\n  // The glyph data for each dynamics letter\n  static get GLYPHS() {\n    return {\n      'f': {\n        code: 'vba',\n        width: 12,\n      },\n      'p': {\n        code: 'vbf',\n        width: 14,\n      },\n      'm': {\n        code: 'v62',\n        width: 17,\n      },\n      's': {\n        code: 'v4a',\n        width: 10,\n      },\n      'z': {\n        code: 'v80',\n        width: 12,\n      },\n      'r': {\n        code: 'vb1',\n        width: 12,\n      },\n    };\n  }\n\n  // A `TextDynamics` object inherits from `Note` so that it can be formatted\n  // within a `Voice`.\n  // Create the dynamics marking. `text_struct` is an object\n  // that contains a `duration` property and a `sequence` of\n  // letters that represents the letters to render\n  constructor(text_struct) {\n    super(text_struct);\n    this.setAttribute('type', 'TextDynamics');\n\n    this.sequence = text_struct.text.toLowerCase();\n    this.line = text_struct.line || 0;\n    this.glyphs = [];\n\n    Vex.Merge(this.render_options, {\n      glyph_font_size: 40,\n    });\n\n    L('New Dynamics Text: ', this.sequence);\n  }\n\n  // Set the Stave line on which the note should be placed\n  setLine(line) {\n    this.line = line;\n    return this;\n  }\n\n  // Preformat the dynamics text\n  preFormat() {\n    let total_width = 0;\n    // Iterate through each letter\n    this.sequence.split('').forEach(letter => {\n      // Get the glyph data for the letter\n      const glyph_data = TextDynamics.GLYPHS[letter];\n      if (!glyph_data) throw new Vex.RERR('Invalid dynamics character: ' + letter);\n\n      const size =  this.render_options.glyph_font_size;\n      const glyph = new Glyph(glyph_data.code, size);\n\n      // Add the glyph\n      this.glyphs.push(glyph);\n\n      total_width += glyph_data.width;\n    });\n\n    // Store the width of the text\n    this.setWidth(total_width);\n    this.preFormatted = true;\n    return this;\n  }\n\n  // Draw the dynamics text on the rendering context\n  draw() {\n    this.setRendered();\n    const x = this.getAbsoluteX();\n    const y = this.stave.getYForLine(this.line + (-3));\n\n    L('Rendering Dynamics: ', this.sequence);\n\n    let letter_x = x;\n    this.glyphs.forEach((glyph, index) => {\n      const current_letter = this.sequence[index];\n      glyph.render(this.context, letter_x, y);\n      letter_x += TextDynamics.GLYPHS[current_letter].width;\n    });\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements `StaveLine` which are simply lines that connect\n// two notes. This object is highly configurable, see the `render_options`.\n// A simple line is often used for notating glissando articulations, but you\n// can format a `StaveLine` with arrows or colors for more pedagogical\n// purposes, such as diagrams.\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Flow } from './tables';\n\n// Attribution: Arrow rendering implementations based off of\n// Patrick Horgan's article, \"Drawing lines and arcs with\n// arrow heads on  HTML5 Canvas\"\n//\n// Draw an arrow head that connects between 3 coordinates\nfunction drawArrowHead(ctx, x0, y0, x1, y1, x2, y2) {\n  // all cases do this.\n  ctx.beginPath();\n  ctx.moveTo(x0, y0);\n  ctx.lineTo(x1, y1);\n  ctx.lineTo(x2, y2);\n  ctx.lineTo(x0, y0);\n  ctx.closePath();\n\n  ctx.fill();\n}\n\n// Helper function to draw a line with arrow heads\nfunction drawArrowLine(ctx, point1, point2, config) {\n  const both_arrows = config.draw_start_arrow && config.draw_end_arrow;\n\n  const x1 = point1.x;\n  const y1 = point1.y;\n  const x2 = point2.x;\n  const y2 = point2.y;\n\n  // For ends with arrow we actually want to stop before we get to the arrow\n  // so that wide lines won't put a flat end on the arrow.\n  const distance = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n  const ratio = (distance - config.arrowhead_length / 3) / distance;\n  let end_x;\n  let end_y;\n  let start_x;\n  let start_y;\n  if (config.draw_end_arrow || both_arrows) {\n    end_x = Math.round(x1 + (x2 - x1) * ratio);\n    end_y = Math.round(y1 + (y2 - y1) * ratio);\n  } else {\n    end_x = x2;\n    end_y = y2;\n  }\n\n  if (config.draw_start_arrow || both_arrows) {\n    start_x = x1 + (x2 - x1) * (1 - ratio);\n    start_y = y1 + (y2 - y1) * (1 - ratio);\n  } else {\n    start_x = x1;\n    start_y = y1;\n  }\n\n  if (config.color) {\n    ctx.setStrokeStyle(config.color);\n    ctx.setFillStyle(config.color);\n  }\n\n  // Draw the shaft of the arrow\n  ctx.beginPath();\n  ctx.moveTo(start_x, start_y);\n  ctx.lineTo(end_x, end_y);\n  ctx.stroke();\n  ctx.closePath();\n\n  // calculate the angle of the line\n  const line_angle = Math.atan2(y2 - y1, x2 - x1);\n  // h is the line length of a side of the arrow head\n  const h = Math.abs(config.arrowhead_length / Math.cos(config.arrowhead_angle));\n\n  let angle1;\n  let angle2;\n  let top_x;\n  let top_y;\n  let bottom_x;\n  let bottom_y;\n\n  if (config.draw_end_arrow || both_arrows) {\n    angle1 = line_angle + Math.PI + config.arrowhead_angle;\n    top_x = x2 + Math.cos(angle1) * h;\n    top_y = y2 + Math.sin(angle1) * h;\n\n    angle2 = line_angle + Math.PI - config.arrowhead_angle;\n    bottom_x = x2 + Math.cos(angle2) * h;\n    bottom_y = y2 + Math.sin(angle2) * h;\n\n    drawArrowHead(ctx, top_x, top_y, x2, y2, bottom_x, bottom_y);\n  }\n\n  if (config.draw_start_arrow || both_arrows) {\n    angle1 = line_angle + config.arrowhead_angle;\n    top_x = x1 + Math.cos(angle1) * h;\n    top_y = y1 + Math.sin(angle1) * h;\n\n    angle2 = line_angle - config.arrowhead_angle;\n    bottom_x = x1 + Math.cos(angle2) * h;\n    bottom_y = y1 + Math.sin(angle2) * h;\n\n    drawArrowHead(ctx, top_x, top_y, x1, y1, bottom_x, bottom_y);\n  }\n}\n\nexport class StaveLine extends Element {\n  // Text Positioning\n  static get TextVerticalPosition() {\n    return {\n      TOP: 1,\n      BOTTOM: 2,\n    };\n  }\n\n  static get TextJustification() {\n    return {\n      LEFT: 1,\n      CENTER: 2,\n      RIGHT: 3,\n    };\n  }\n\n  // Initialize the StaveLine with the given `notes`.\n  //\n  // `notes` is a struct that has:\n  //\n  //  ```\n  //  {\n  //    first_note: Note,\n  //    last_note: Note,\n  //    first_indices: [n1, n2, n3],\n  //    last_indices: [n1, n2, n3]\n  //  }\n  //  ```\n  constructor(notes) {\n    super();\n    this.setAttribute('type', 'StaveLine');\n\n    this.notes = notes;\n\n    this.text = '';\n\n    this.font = {\n      family: 'Arial',\n      size: 10,\n      weight: '',\n    };\n\n    this.render_options = {\n      // Space to add to the left or the right\n      padding_left: 4,\n      padding_right: 3,\n\n      // The width of the line in pixels\n      line_width: 1,\n      // An array of line/space lengths. Unsupported with Raphael (SVG)\n      line_dash: null,\n      // Can draw rounded line end, instead of a square. Unsupported with Raphael (SVG)\n      rounded_end: true,\n      // The color of the line and arrowheads\n      color: null,\n\n      // Flags to draw arrows on each end of the line\n      draw_start_arrow: false,\n      draw_end_arrow: false,\n\n      // The length of the arrowhead sides\n      arrowhead_length: 10,\n      // The angle of the arrowhead\n      arrowhead_angle: Math.PI / 8,\n\n      // The position of the text\n      text_position_vertical: StaveLine.TextVerticalPosition.TOP,\n      text_justification: StaveLine.TextJustification.CENTER,\n    };\n\n    this.setNotes(notes);\n  }\n\n  // Set the font for the `StaveLine` text\n  setFont(font) { this.font = font; return this; }\n  // The the annotation for the `StaveLine`\n  setText(text) { this.text = text; return this; }\n\n  // Set the notes for the `StaveLine`\n  setNotes(notes) {\n    if (!notes.first_note && !notes.last_note) {\n      throw new Vex.RuntimeError(\n        'BadArguments', 'Notes needs to have either first_note or last_note set.'\n      );\n    }\n\n    if (!notes.first_indices) notes.first_indices = [0];\n    if (!notes.last_indices) notes.last_indices = [0];\n\n    if (notes.first_indices.length !== notes.last_indices.length) {\n      throw new Vex.RuntimeError(\n        'BadArguments', 'Connected notes must have similar index sizes'\n      );\n    }\n\n    // Success. Lets grab 'em notes.\n    this.first_note = notes.first_note;\n    this.first_indices = notes.first_indices;\n    this.last_note = notes.last_note;\n    this.last_indices = notes.last_indices;\n    return this;\n  }\n\n  // Apply the style of the `StaveLine` to the context\n  applyLineStyle() {\n    const ctx = this.checkContext();\n    const render_options = this.render_options;\n\n    if (render_options.line_dash) {\n      ctx.setLineDash(render_options.line_dash);\n    }\n\n    if (render_options.line_width) {\n      ctx.setLineWidth(render_options.line_width);\n    }\n\n    if (render_options.rounded_end) {\n      ctx.setLineCap('round');\n    } else {\n      ctx.setLineCap('square');\n    }\n  }\n\n  // Apply the text styling to the context\n  applyFontStyle() {\n    const ctx = this.checkContext();\n\n    if (this.font) {\n      ctx.setFont(this.font.family, this.font.size, this.font.weight);\n    }\n\n    if (this.render_options.color) {\n      ctx.setStrokeStyle(this.render_options.color);\n      ctx.setFillStyle(this.render_options.color);\n    }\n  }\n\n  // Renders the `StaveLine` on the context\n  draw() {\n    const ctx = this.checkContext();\n    this.setRendered();\n\n    const first_note = this.first_note;\n    const last_note = this.last_note;\n    const render_options = this.render_options;\n\n    ctx.save();\n    this.applyLineStyle();\n\n    // Cycle through each set of indices and draw lines\n    let start_position;\n    let end_position;\n    this.first_indices.forEach((first_index, i) => {\n      const last_index = this.last_indices[i];\n\n      // Get initial coordinates for the start/end of the line\n      start_position = first_note.getModifierStartXY(2, first_index);\n      end_position = last_note.getModifierStartXY(1, last_index);\n      const upwards_slope = start_position.y > end_position.y;\n\n      // Adjust `x` coordinates for modifiers\n      start_position.x += first_note.getMetrics().modRightPx + render_options.padding_left;\n      end_position.x -= last_note.getMetrics().modLeftPx + render_options.padding_right;\n\n\n      // Adjust first `x` coordinates for displacements\n      const notehead_width = first_note.getGlyph().getWidth();\n      const first_displaced = first_note.getKeyProps()[first_index].displaced;\n      if (first_displaced && first_note.getStemDirection() === 1) {\n        start_position.x += notehead_width + render_options.padding_left;\n      }\n\n      // Adjust last `x` coordinates for displacements\n      const last_displaced = last_note.getKeyProps()[last_index].displaced;\n      if (last_displaced && last_note.getStemDirection() === -1) {\n        end_position.x -= notehead_width + render_options.padding_right;\n      }\n\n      // Adjust y position better if it's not coming from the center of the note\n      start_position.y += upwards_slope ? -3 : 1;\n      end_position.y += upwards_slope ? 2 : 0;\n\n      drawArrowLine(ctx, start_position, end_position, this.render_options);\n    });\n\n    ctx.restore();\n\n    // Determine the x coordinate where to start the text\n    const text_width = ctx.measureText(this.text).width;\n    const justification = render_options.text_justification;\n    let x = 0;\n    if (justification === StaveLine.TextJustification.LEFT) {\n      x = start_position.x;\n    } else if (justification === StaveLine.TextJustification.CENTER) {\n      const delta_x = (end_position.x - start_position.x);\n      const center_x = (delta_x / 2) + start_position.x;\n      x = center_x - (text_width / 2);\n    } else if (justification === StaveLine.TextJustification.RIGHT) {\n      x = end_position.x  -  text_width;\n    }\n\n    // Determine the y value to start the text\n    let y;\n    const vertical_position = render_options.text_position_vertical;\n    if (vertical_position === StaveLine.TextVerticalPosition.TOP) {\n      y = first_note.getStave().getYForTopText();\n    } else if (vertical_position === StaveLine.TextVerticalPosition.BOTTOM) {\n      y = first_note.getStave().getYForBottomText(Flow.TEXT_HEIGHT_OFFSET_HACK);\n    }\n\n    // Draw the text\n    ctx.save();\n    this.applyFontStyle();\n    ctx.fillText(this.text, x, y);\n    ctx.restore();\n\n    return this;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements different types of pedal markings. These notation\n// elements indicate to the performer when to depress and release the a pedal.\n//\n// In order to create \"Sostenuto\", and \"una corda\" markings, you must set\n// custom text for the release/depress pedal markings.\n\nimport { Vex } from './vex';\nimport { Element } from './element';\nimport { Glyph } from './glyph';\n\n// To enable logging for this class. Set `Vex.Flow.PedalMarking.DEBUG` to `true`.\nfunction L(...args) { if (PedalMarking.DEBUG) Vex.L('Vex.Flow.PedalMarking', args); }\n\n// Draws a pedal glyph with the provided `name` on a rendering `context`\n// at the coordinates `x` and `y. Takes into account the glyph data\n// coordinate shifts.\nfunction drawPedalGlyph(name, context, x, y, point) {\n  const glyph_data = PedalMarking.GLYPHS[name];\n  const glyph = new Glyph(glyph_data.code, point);\n  glyph.render(context, x + glyph_data.x_shift, y + glyph_data.y_shift);\n}\n\nexport class PedalMarking extends Element {\n  // Glyph data\n  static get GLYPHS() {\n    return {\n      'pedal_depress': {\n        code: 'v36',\n        x_shift: -10,\n        y_shift: 0,\n      },\n      'pedal_release': {\n        code: 'v5d',\n        x_shift: -2,\n        y_shift: 3,\n      },\n    };\n  }\n\n  static get Styles() {\n    return {\n      TEXT: 1,\n      BRACKET: 2,\n      MIXED: 3,\n    };\n  }\n\n  static get StylesString() {\n    return {\n      text: PedalMarking.Styles.TEXT,\n      bracket: PedalMarking.Styles.BRACKET,\n      mixed: PedalMarking.Styles.MIXED,\n    };\n  }\n\n  // Create a sustain pedal marking. Returns the defaults PedalMarking.\n  // Which uses the traditional \"Ped\" and \"*\"\" markings.\n  static createSustain(notes) {\n    const pedal = new PedalMarking(notes);\n    return pedal;\n  }\n\n  // Create a sostenuto pedal marking\n  static createSostenuto(notes) {\n    const pedal = new PedalMarking(notes);\n    pedal.setStyle(PedalMarking.Styles.MIXED);\n    pedal.setCustomText('Sost. Ped.');\n    return pedal;\n  }\n\n  // Create an una corda pedal marking\n  static createUnaCorda(notes) {\n    const pedal = new PedalMarking(notes);\n    pedal.setStyle(PedalMarking.Styles.TEXT);\n    pedal.setCustomText('una corda', 'tre corda');\n    return pedal;\n  }\n\n  // ## Prototype Methods\n  constructor(notes) {\n    super();\n    this.setAttribute('type', 'PedalMarking');\n\n    this.notes = notes;\n    this.style = PedalMarking.TEXT;\n    this.line = 0;\n\n    // Custom text for the release/depress markings\n    this.custom_depress_text = '';\n    this.custom_release_text = '';\n\n    this.font = {\n      family: 'Times New Roman',\n      size: 12,\n      weight: 'italic bold',\n    };\n\n    this.render_options = {\n      bracket_height: 10,\n      text_margin_right: 6,\n      bracket_line_width: 1,\n      glyph_point_size: 40,\n      color: 'black',\n    };\n  }\n\n  // Set custom text for the `depress`/`release` pedal markings. No text is\n  // set if the parameter is falsy.\n  setCustomText(depress, release) {\n    this.custom_depress_text = depress || '';\n    this.custom_release_text = release || '';\n    return this;\n  }\n\n  // Set the pedal marking style\n  setStyle(style) {\n    if (style < 1 && style > 3)  {\n      throw new Vex.RERR('InvalidParameter', 'The style must be one found in PedalMarking.Styles');\n    }\n\n    this.style = style;\n    return this;\n  }\n\n  // Set the staff line to render the markings on\n  setLine(line) { this.line = line; return this; }\n\n  // Draw the bracket based pedal markings\n  drawBracketed() {\n    const ctx = this.context;\n    let is_pedal_depressed = false;\n    let prev_x;\n    let prev_y;\n    const pedal = this;\n\n    // Iterate through each note\n    this.notes.forEach((note, index, notes) => {\n      // Each note triggers the opposite pedal action\n      is_pedal_depressed = !is_pedal_depressed;\n\n      // Get the initial coordinates for the note\n      const x = note.getAbsoluteX();\n      const y = note.getStave().getYForBottomText(pedal.line + 3);\n\n      // Throw if current note is positioned before the previous note\n      if (x < prev_x) {\n        throw new Vex.RERR(\n          'InvalidConfiguration', 'The notes provided must be in order of ascending x positions'\n        );\n      }\n\n      // Determine if the previous or next note are the same\n      // as the current note. We need to keep track of this for\n      // when adjustments are made for the release+depress action\n      const next_is_same = notes[index + 1] === note;\n      const prev_is_same = notes[index - 1] === note;\n\n      let x_shift = 0;\n      if (is_pedal_depressed) {\n        // Adjustment for release+depress\n        x_shift =  prev_is_same ? 5 : 0;\n\n        if (pedal.style === PedalMarking.Styles.MIXED && !prev_is_same) {\n          // For MIXED style, start with text instead of bracket\n          if (pedal.custom_depress_text) {\n            // If we have custom text, use instead of the default \"Ped\" glyph\n            const text_width = ctx.measureText(pedal.custom_depress_text).width;\n            ctx.fillText(pedal.custom_depress_text, x - (text_width / 2), y);\n            x_shift = (text_width / 2) + pedal.render_options.text_margin_right;\n          } else {\n            // Render the Ped glyph in position\n            drawPedalGlyph('pedal_depress', ctx, x, y, pedal.render_options.glyph_point_size);\n            x_shift = 20 + pedal.render_options.text_margin_right;\n          }\n        } else {\n          // Draw start bracket\n          ctx.beginPath();\n          ctx.moveTo(x, y - pedal.render_options.bracket_height);\n          ctx.lineTo(x + x_shift, y);\n          ctx.stroke();\n          ctx.closePath();\n        }\n      } else {\n        // Adjustment for release+depress\n        x_shift = next_is_same ? -5 : 0;\n\n        // Draw end bracket\n        ctx.beginPath();\n        ctx.moveTo(prev_x, prev_y);\n        ctx.lineTo(x + x_shift, y);\n        ctx.lineTo(x, y - pedal.render_options.bracket_height);\n        ctx.stroke();\n        ctx.closePath();\n      }\n\n      // Store previous coordinates\n      prev_x = x + x_shift;\n      prev_y = y;\n    });\n  }\n\n  // Draw the text based pedal markings. This defaults to the traditional\n  // \"Ped\" and \"*\"\" symbols if no custom text has been provided.\n  drawText() {\n    const ctx = this.context;\n    let is_pedal_depressed = false;\n    const pedal = this;\n\n    // The glyph point size\n    const point = pedal.render_options.glyph_point_size;\n\n    // Iterate through each note, placing glyphs or custom text accordingly\n    this.notes.forEach(note => {\n      is_pedal_depressed = !is_pedal_depressed;\n      const stave = note.getStave();\n      const x = note.getAbsoluteX();\n      const y = stave.getYForBottomText(pedal.line + 3);\n\n      let text_width = 0;\n      if (is_pedal_depressed) {\n        if (pedal.custom_depress_text) {\n          text_width = ctx.measureText(pedal.custom_depress_text).width;\n          ctx.fillText(pedal.custom_depress_text, x - (text_width / 2), y);\n        } else {\n          drawPedalGlyph('pedal_depress', ctx, x, y, point);\n        }\n      } else {\n        if (pedal.custom_release_text) {\n          text_width = ctx.measureText(pedal.custom_release_text).width;\n          ctx.fillText(pedal.custom_release_text, x - (text_width / 2), y);\n        } else {\n          drawPedalGlyph('pedal_release', ctx, x, y, point);\n        }\n      }\n    });\n  }\n\n  // Render the pedal marking in position on the rendering context\n  draw() {\n    const ctx = this.checkContext();\n    this.setRendered();\n\n    ctx.save();\n    ctx.setStrokeStyle(this.render_options.color);\n    ctx.setFillStyle(this.render_options.color);\n    ctx.setFont(this.font.family, this.font.size, this.font.weight);\n\n    L('Rendering Pedal Marking');\n\n    if (this.style === PedalMarking.Styles.BRACKET || this.style === PedalMarking.Styles.MIXED) {\n      ctx.setLineWidth(this.render_options.bracket_line_width);\n      this.drawBracketed();\n    } else if (this.style === PedalMarking.Styles.TEXT) {\n      this.drawText();\n    }\n\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Cyril Silverman\n//\n// ## Description\n//\n// This file implement `TextBrackets` which extend between two notes.\n// The octave transposition markings (8va, 8vb, 15va, 15vb) can be created\n// using this class.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Renderer } from './renderer';\n\n// To enable logging for this class. Set `Vex.Flow.TextBracket.DEBUG` to `true`.\nfunction L(...args) { if (TextBracket.DEBUG) Vex.L('Vex.Flow.TextBracket', args); }\n\nexport class TextBracket extends Element {\n  // FIXME: Modifier.Position is singular while this is plural, make consistent\n  static get Positions() {\n    return {\n      TOP: 1,\n      BOTTOM: -1,\n    };\n  }\n\n  static get PositionString() {\n    return {\n      top: TextBracket.Positions.TOP,\n      bottom: TextBracket.Positions.BOTTOM,\n    };\n  }\n\n  constructor({\n    start,\n    stop,\n    text = '',\n    superscript = '',\n    position = TextBracket.Positions.TOP,\n  }) {\n    super();\n    this.setAttribute('type', 'TextBracket');\n\n    this.start = start;\n    this.stop = stop;\n\n    this.text = text;\n    this.superscript = superscript;\n\n    this.position = typeof position === 'string'\n      ? TextBracket.PositionString[position]\n      : position;\n\n    this.line = 1;\n\n    this.font = {\n      family: 'Serif',\n      size: 15,\n      weight: 'italic',\n    };\n\n    this.render_options = {\n      dashed: true,\n      dash: [5],\n      color: 'black',\n      line_width: 1,\n      show_bracket: true,\n      bracket_height: 8,\n\n      // In the BOTTOM position, the bracket line can extend\n      // under the superscript.\n      underline_superscript: true,\n    };\n  }\n\n  // Apply the text backet styling to the provided `context`\n  applyStyle(context) {\n    // Apply style for the octave bracket\n    context.setFont(this.font.family, this.font.size, this.font.weight);\n    context.setStrokeStyle(this.render_options.color);\n    context.setFillStyle(this.render_options.color);\n    context.setLineWidth(this.render_options.line_width);\n\n    return this;\n  }\n\n  // Set whether the bracket line should be `dashed`. You can also\n  // optionally set the `dash` pattern by passing in an array of numbers\n  setDashed(dashed, dash) {\n    this.render_options.dashed = dashed;\n    if (dash) this.render_options.dash = dash;\n    return this;\n  }\n\n  // Set the font for the text\n  setFont(font) {\n    // We use Object.assign to support partial updates to the font object\n    this.font = { ...this.font, ...font };\n    return this;\n  }\n  // Set the rendering `context` for the octave bracket\n  setLine(line) { this.line = line; return this; }\n\n  // Draw the octave bracket on the rendering context\n  draw() {\n    const ctx = this.context;\n    this.setRendered();\n\n    let y = 0;\n    switch (this.position) {\n      case TextBracket.Positions.TOP:\n        y = this.start.getStave().getYForTopText(this.line);\n        break;\n      case TextBracket.Positions.BOTTOM:\n        y = this.start.getStave().getYForBottomText(this.line + Flow.TEXT_HEIGHT_OFFSET_HACK);\n        break;\n      default:\n        throw new Vex.RERR('InvalidPosition', `The position ${this.position} is invalid`);\n    }\n\n    // Get the preliminary start and stop coordintates for the bracket\n    const start = { x: this.start.getAbsoluteX(), y };\n    const stop = { x: this.stop.getAbsoluteX(), y };\n\n    L('Rendering TextBracket: start:', start, 'stop:', stop, 'y:', y);\n\n    const bracket_height = this.render_options.bracket_height * this.position;\n\n    ctx.save();\n    this.applyStyle(ctx);\n\n    // Draw text\n    ctx.fillText(this.text, start.x, start.y);\n\n    // Get the width and height for the octave number\n    const main_width = ctx.measureText(this.text).width;\n    const main_height = ctx.measureText('M').width;\n\n    // Calculate the y position for the super script\n    const super_y = start.y - (main_height / 2.5);\n\n    // Draw the superscript\n    ctx.setFont(this.font.family, this.font.size / 1.4, this.font.weight);\n    ctx.fillText(this.superscript, start.x + main_width + 1, super_y);\n\n    // Determine width and height of the superscript\n    const superscript_width = ctx.measureText(this.superscript).width;\n    const super_height = ctx.measureText('M').width;\n\n    // Setup initial coordinates for the bracket line\n    let start_x = start.x;\n    let line_y = super_y;\n    const end_x = stop.x + this.stop.getGlyph().getWidth();\n\n    // Adjust x and y coordinates based on position\n    if (this.position === TextBracket.Positions.TOP) {\n      start_x += main_width + superscript_width + 5;\n      line_y -= super_height / 2.7;\n    } else if (this.position === TextBracket.Positions.BOTTOM) {\n      line_y += super_height / 2.7;\n      start_x += main_width + 2;\n\n      if (!this.render_options.underline_superscript) {\n        start_x += superscript_width;\n      }\n    }\n\n    if (this.render_options.dashed) {\n      // Main line\n      Renderer.drawDashedLine(\n        ctx,\n        start_x,\n        line_y,\n        end_x,\n        line_y,\n        this.render_options.dash\n      );\n      // Ending Bracket\n      if (this.render_options.show_bracket) {\n        Renderer.drawDashedLine(\n          ctx,\n          end_x,\n          line_y + (1 * this.position),\n          end_x,\n          line_y + bracket_height,\n          this.render_options.dash\n        );\n      }\n    } else {\n      ctx.beginPath();\n      ctx.moveTo(start_x, line_y);\n      // Main line\n      ctx.lineTo(end_x, line_y);\n      if (this.render_options.show_bracket) {\n        // Ending bracket\n        ctx.lineTo(end_x, line_y + bracket_height);\n      }\n      ctx.stroke();\n      ctx.closePath();\n    }\n\n    ctx.restore();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// A `BarNote` is used to render bar lines (from `barline.js`). `BarNote`s can\n// be added to a voice and rendered in the middle of a stave. Since it has no\n// duration, it consumes no `tick`s, and is dealt with appropriately by the formatter.\n//\n// See `tests/barnote_tests.js` for usage examples.\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { Barline } from './stavebarline';\n\n// To enable logging for this class. Set `Vex.Flow.BarNote.DEBUG` to `true`.\nfunction L(...args) { if (BarNote.DEBUG) Vex.L('Vex.Flow.BarNote', args); }\n\nexport class BarNote extends Note {\n  constructor(type = Barline.type.SINGLE) {\n    super({ duration: 'b' });\n    this.setAttribute('type', 'BarNote');\n\n    this.metrics = {\n      widths: {},\n    };\n\n    const TYPE = Barline.type;\n    this.metrics.widths = {\n      [TYPE.SINGLE]: 8,\n      [TYPE.DOUBLE]: 12,\n      [TYPE.END]: 15,\n      [TYPE.REPEAT_BEGIN]: 14,\n      [TYPE.REPEAT_END]: 14,\n      [TYPE.REPEAT_BOTH]: 18,\n      [TYPE.NONE]: 0,\n    };\n\n    // Tell the formatter that bar notes have no duration.\n    this.ignore_ticks = true;\n    this.setType(type);\n  }\n\n  // Get and set the type of Bar note. `type` must be one of `Vex.Flow.Barline.type`.\n  getType() { return this.type; }\n  setType(type) {\n    this.type = typeof(type) === 'string'\n      ? Barline.typeString[type]\n      : type;\n\n    // Set width to width of relevant `Barline`.\n    this.setWidth(this.metrics.widths[this.type]);\n    return this;\n  }\n\n  getBoundingBox() {\n    return super.getBoundingBox();\n  }\n\n  addToModifierContext() {\n    /* overridden to ignore */\n    return this;\n  }\n\n  preFormat() {\n    /* overridden to ignore */\n    this.setPreFormatted(true);\n    return this;\n  }\n\n  // Render note to stave.\n  draw() {\n    this.checkContext();\n    if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n    L('Rendering bar line at: ', this.getAbsoluteX());\n    const barline = new Barline(this.type);\n    barline.setX(this.getAbsoluteX());\n    barline.draw(this.stave);\n    this.setRendered();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n\nimport { Vex } from './vex';\nimport { StemmableNote } from './stemmablenote';\n\nexport class GhostNote extends StemmableNote {\n  /** @constructor */\n  constructor(parameter) {\n    // Sanity check\n    if (!parameter) {\n      throw new Vex.RuntimeError('BadArguments',\n        'Ghost note must have valid initialization data to identify ' +\n        'duration.');\n    }\n\n    let note_struct;\n\n    // Preserve backwards-compatibility\n    if (typeof (parameter) === 'string') {\n      note_struct = { duration: parameter };\n    } else if (typeof (parameter) === 'object') {\n      note_struct = parameter;\n    } else {\n      throw new Vex.RuntimeError('BadArguments',\n        'Ghost note must have valid initialization data to identify ' +\n        'duration.');\n    }\n\n    super(note_struct);\n    this.setAttribute('type', 'GhostNote');\n\n    // Note properties\n    this.setWidth(0);\n  }\n\n  isRest() { return true; }\n\n  setStave(stave) {\n    super.setStave(stave);\n  }\n\n  addToModifierContext() { /* intentionally overridden */ return this; }\n\n  preFormat() {\n    this.setPreFormatted(true);\n    return this;\n  }\n\n  draw() {\n    if (!this.stave) throw new Vex.RERR('NoStave', \"Can't draw without a stave.\");\n\n    // Draw the modifiers\n    this.setRendered();\n    for (let i = 0; i < this.modifiers.length; ++i) {\n      const modifier = this.modifiers[i];\n      modifier.setContext(this.context);\n      modifier.drawWithStyle();\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// Author: Mike Corrigan <corrigan@gmail.com>\n//\n// This class implements tremolo notation.\n\nimport { Vex } from './vex';\nimport { Modifier } from './modifier';\nimport { Glyph } from './glyph';\nimport { GraceNote } from './gracenote';\n\nexport class Tremolo extends Modifier {\n  static get CATEGORY() { return 'tremolo'; }\n  static get YOFFSETSTEMUP() { return -9; }\n  static get YOFFSETSTEMDOWN() { return -21; }\n  static get XOFFSETSTEMUP() { return 6; }\n  static get XOFFSETSTEMDOWN() { return -2; }\n  constructor(num) {\n    super();\n    this.setAttribute('type', 'Tremolo');\n\n    this.num = num;\n    this.note = null;\n    this.index = null;\n    this.position = Modifier.Position.CENTER;\n    this.code = 'v74';\n  }\n\n  getCategory() { return Tremolo.CATEGORY; }\n\n  draw() {\n    this.checkContext();\n\n    if (!(this.note && this.index != null)) {\n      throw new Vex.RERR('NoAttachedNote', \"Can't draw Tremolo without a note and index.\");\n    }\n\n    this.setRendered();\n    const stemDirection = this.note.getStemDirection();\n    this.y_spacing = 4 * stemDirection;\n    const start = this.note.getModifierStartXY(this.position, this.index);\n    let x = start.x;\n    let y = this.note.stem.getExtents().topY;\n    const scale = this.note.getCategory() === 'gracenotes' ? GraceNote.SCALE : 1;\n    if (stemDirection < 0) {\n      y += Tremolo.YOFFSETSTEMDOWN * scale;\n    } else {\n      y += Tremolo.YOFFSETSTEMUP * scale;\n    }\n\n    this.font = {\n      family: 'Arial',\n      size: 16 * scale,\n      weight: '',\n    };\n\n    this.render_options = {\n      font_scale: 35 * scale,\n      stroke_px: 3,\n      stroke_spacing: 10 * scale,\n    };\n\n    x += stemDirection < 0 ? Tremolo.XOFFSETSTEMDOWN : Tremolo.XOFFSETSTEMUP;\n    for (let i = 0; i < this.num; ++i) {\n      Glyph.renderGlyph(this.context, x, y, this.render_options.font_scale, this.code);\n      y += this.y_spacing;\n    }\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This file implements the `Crescendo` object which draws crescendos and\n// decrescendo dynamics markings. A `Crescendo` is initialized with a\n// duration and formatted as part of a `Voice` like any other `Note`\n// type in VexFlow. This object would most likely be formatted in a Voice\n// with `TextNotes` - which are used to represent other dynamics markings.\n\nimport { Vex } from './vex';\nimport { Note } from './note';\nimport { TickContext } from './tickcontext';\n\n// To enable logging for this class. Set `Vex.Flow.Crescendo.DEBUG` to `true`.\nfunction L(...args) { if (Crescendo.DEBUG) Vex.L('Vex.Flow.Crescendo', args); }\n\n// Private helper to draw the hairpin\nfunction renderHairpin(ctx, params) {\n  const begin_x = params.begin_x;\n  const end_x = params.end_x;\n  const y = params.y;\n  const half_height =  params.height / 2;\n\n  ctx.beginPath();\n\n  if (params.reverse) {\n    ctx.moveTo(begin_x, y - half_height);\n    ctx.lineTo(end_x,  y);\n    ctx.lineTo(begin_x, y + half_height);\n  } else {\n    ctx.moveTo(end_x,  y - half_height);\n    ctx.lineTo(begin_x, y);\n    ctx.lineTo(end_x,  y + half_height);\n  }\n\n  ctx.stroke();\n  ctx.closePath();\n}\n\nexport class Crescendo extends Note {\n  // Initialize the crescendo's properties\n  constructor(note_struct) {\n    super(note_struct);\n    this.setAttribute('type', 'Crescendo');\n\n    // Whether the object is a decrescendo\n    this.decrescendo = false;\n\n    // The staff line to be placed on\n    this.line = note_struct.line || 0;\n\n    // The height at the open end of the cresc/decresc\n    this.height = 15;\n\n    Vex.Merge(this.render_options, {\n      // Extensions to the length of the crescendo on either side\n      extend_left: 0,\n      extend_right: 0,\n      // Vertical shift\n      y_shift: 0,\n    });\n  }\n\n  // Set the line to center the element on\n  setLine(line) { this.line = line; return this; }\n\n  // Set the full height at the open end\n  setHeight(height) { this.height = height; return this; }\n\n  // Set whether the sign should be a descresendo by passing a bool\n  // to `decresc`\n  setDecrescendo(decresc) {\n    this.decrescendo = decresc;\n    return this;\n  }\n\n  // Preformat the note\n  preFormat() { this.preFormatted = true; return this; }\n\n  // Render the Crescendo object onto the canvas\n  draw() {\n    this.checkContext();\n    this.setRendered();\n\n    const tick_context = this.getTickContext();\n    const next_context = TickContext.getNextContext(tick_context);\n\n    const begin_x = this.getAbsoluteX();\n    const end_x  = next_context ? next_context.getX() : this.stave.x + this.stave.width;\n    const y = this.stave.getYForLine(this.line + (-3)) + 1;\n\n    L(\n      'Drawing ',\n      this.decrescendo ? 'decrescendo ' : 'crescendo ',\n      this.height,\n      'x',\n      begin_x - end_x\n    );\n\n    renderHairpin(this.context, {\n      begin_x: begin_x - this.render_options.extend_left,\n      end_x: end_x + this.render_options.extend_right,\n      y: y + this.render_options.y_shift,\n      height: this.height,\n      reverse: this.decrescendo,\n    });\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// A generic text parsing class for VexFlow.\n\nimport { Vex } from './vex';\n\n// To enable logging for this class. Set `Vex.Flow.Parser.DEBUG` to `true`.\nfunction L(...args) { if (Parser.DEBUG) Vex.L('Vex.Flow.Parser', args); }\n\nexport const X = Vex.MakeException('ParserError');\n\n// Converts parser results into an easy to reference list that can be\n// used in triggers.\nfunction flattenMatches(results) {\n  if (results.matchedString !== undefined) return results.matchedString;\n  if (results.results) return flattenMatches(results.results);\n  if (results.length === 1) return flattenMatches(results[0]);\n  if (results.length === 0) return null;\n  return results.map(flattenMatches);\n}\n\n// This is the base parser class. Given an arbitrary context-free grammar, it\n// can parse any line and execute code when specific rules are met (e.g.,\n// when a string is terminated.)\nexport class Parser {\n  // For an example of a simple grammar, take a look at tests/parser_tests.js or\n  // the EasyScore grammar in easyscore.js.\n  constructor(grammar) {\n    this.grammar = grammar;\n  }\n\n  // Parse `line` using current grammar. Returns {success: true} if the\n  // line parsed correctly, otherwise returns `{success: false, errorPos: N}`\n  // where `errorPos` is the location of the error in the string.\n  parse(line) {\n    this.line = line;\n    this.pos = 0;\n    this.errorPos = -1;\n    const results = this.expect(this.grammar.begin());\n    results.errorPos = this.errorPos;\n    return results;\n  }\n\n  matchFail(returnPos) {\n    if (this.errorPos === -1) this.errorPos = this.pos;\n    this.pos = returnPos;\n  }\n\n  matchSuccess() {\n    this.errorPos = -1;\n  }\n\n  // Look for `token` in this.line[this.pos], and return success\n  // if one is found. `token` is specified as a regular expression.\n  matchToken(token, noSpace = false) {\n    const regexp = noSpace\n      ? new RegExp('^((' + token + '))')\n      : new RegExp('^((' + token + ')\\\\s*)');\n    const workingLine = this.line.slice(this.pos);\n    const result = workingLine.match(regexp);\n    if (result !== null) {\n      return {\n        success: true,\n        matchedString: result[2],\n        incrementPos: result[1].length,\n        pos: this.pos,\n      };\n    } else {\n      return {\n        success: false,\n        pos: this.pos,\n      };\n    }\n  }\n\n  // Execute rule to match a sequence of tokens (or rules). If `maybe` is\n  // set, then return success even if the token is not found, but reset\n  // the position before exiting.\n  expectOne(rule, maybe = false) {\n    const results = [];\n    const pos = this.pos;\n\n    let allMatches = true;\n    let oneMatch = false;\n    maybe = (maybe === true) || (rule.maybe === true);\n\n    // Execute all sub rules in sequence.\n    for (let i = 0; i < rule.expect.length; i++) {\n      const next = rule.expect[i];\n      const localPos = this.pos;\n      const result = this.expect(next);\n\n      // If `rule.or` is set, then return success if any one\n      // of the subrules match, else all subrules must match.\n      if (result.success) {\n        results.push(result);\n        oneMatch = true;\n        if (rule.or) break;\n      } else {\n        allMatches = false;\n        if (!rule.or) {\n          this.pos = localPos;\n          break;\n        }\n      }\n    }\n\n    const gotOne = (rule.or && oneMatch) || allMatches;\n    const success = gotOne || (maybe === true);\n    if (maybe && !gotOne) this.pos = pos;\n    if (success) this.matchSuccess(); else this.matchFail(pos);\n    return { success, results, numMatches: gotOne ? 1 : 0 };\n  }\n\n  // Try to match multiple (one or more) instances of the rule. If `maybe` is set,\n  // then a failed match is also a success (but the position is reset).\n  expectOneOrMore(rule, maybe = false) {\n    const results = [];\n    const pos = this.pos;\n    let numMatches = 0;\n    let more = true;\n\n    do {\n      const result = this.expectOne(rule);\n      if (result.success) {\n        numMatches++;\n        results.push(result.results);\n      } else {\n        more = false;\n      }\n    } while (more);\n\n    const success = (numMatches > 0) || (maybe === true);\n    if (maybe && !(numMatches > 0)) this.pos = pos;\n    if (success) this.matchSuccess(); else this.matchFail(pos);\n    return { success, results, numMatches };\n  }\n\n  // Match zero or more instances of `rule`. Offloads to `expectOneOrMore`.\n  expectZeroOrMore(rule) {\n    return this.expectOneOrMore(rule, true);\n  }\n\n  // Execute the rule produced by the provided the `rules` function. This\n  // ofloads to one of the above matchers and consolidates the results. It is also\n  // responsible for executing any code triggered by the rule (in `rule.run`.)\n  expect(rules) {\n    L('Evaluating rules:', rules);\n    let result;\n    if (!rules) {\n      throw new X('Invalid Rule: ' + rules, rules);\n    }\n\n    // Get rule from Grammar class.\n    const rule = rules.bind(this.grammar)();\n\n    if (rule.token) {\n      // Base case: parse the regex and throw an error if the\n      // line doesn't match.\n      result = this.matchToken(rule.token, (rule.noSpace === true));\n      if (result.success) {\n        // Token match! Update position and throw away parsed portion\n        // of string.\n        this.pos += result.incrementPos;\n      }\n    } else if (rule.expect) {\n      if (rule.oneOrMore) {\n        result = this.expectOneOrMore(rule);\n      } else if (rule.zeroOrMore) {\n        result = this.expectZeroOrMore(rule);\n      } else {\n        result = this.expectOne(rule);\n      }\n    } else {\n      throw new X('Bad grammar! No `token` or `expect` property', rule);\n    }\n\n    // If there's a trigger attached to this rule, then pull it.\n    result.matches = [];\n    if (result.results) result.results.forEach(r => result.matches.push(flattenMatches(r)));\n    if (rule.run && result.success) rule.run(result);\n    return result;\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements a parser for a simple language to generate\n// VexFlow objects.\n\n/* eslint max-classes-per-file: \"off\" */\n\nimport { Vex } from './vex';\nimport { StaveNote } from './stavenote';\nimport { Parser } from './parser';\nimport { Articulation } from './articulation';\n\n// To enable logging for this class. Set `Vex.Flow.EasyScore.DEBUG` to `true`.\nfunction L(...args) { if (EasyScore.DEBUG) Vex.L('Vex.Flow.EasyScore', args); }\n\nexport const X = Vex.MakeException('EasyScoreError');\n\nclass Grammar {\n  constructor(builder) {\n    this.builder = builder;\n  }\n\n  begin() { return this.LINE; }\n\n  LINE() {\n    return {\n      expect: [this.PIECE, this.PIECES, this.EOL],\n    };\n  }\n  PIECE() {\n    return {\n      expect: [this.CHORDORNOTE, this.PARAMS],\n      run: () => this.builder.commitPiece(),\n    };\n  }\n  PIECES() {\n    return {\n      expect: [this.COMMA, this.PIECE],\n      zeroOrMore: true,\n    };\n  }\n  PARAMS() {\n    return {\n      expect: [this.DURATION, this.TYPE, this.DOTS, this.OPTS],\n    };\n  }\n  CHORDORNOTE() {\n    return {\n      expect: [this.CHORD, this.SINGLENOTE],\n      or: true,\n    };\n  }\n  CHORD() {\n    return {\n      expect: [this.LPAREN, this.NOTES, this.RPAREN],\n      run: (state) => this.builder.addChord(state.matches[1]),\n    };\n  }\n  NOTES() {\n    return {\n      expect: [this.NOTE],\n      oneOrMore: true,\n    };\n  }\n  NOTE() {\n    return {\n      expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n    };\n  }\n  SINGLENOTE() {\n    return {\n      expect: [this.NOTENAME, this.ACCIDENTAL, this.OCTAVE],\n      run: (state) =>\n        this.builder.addSingleNote(state.matches[0], state.matches[1], state.matches[2]),\n    };\n  }\n  ACCIDENTAL() {\n    return {\n      expect: [this.ACCIDENTALS],\n      maybe: true,\n    };\n  }\n  DOTS() {\n    return {\n      expect: [this.DOT],\n      zeroOrMore: true,\n      run: (state) => this.builder.setNoteDots(state.matches[0]),\n    };\n  }\n  TYPE() {\n    return {\n      expect: [this.SLASH, this.MAYBESLASH, this.TYPES],\n      maybe: true,\n      run: (state) => this.builder.setNoteType(state.matches[2]),\n    };\n  }\n  DURATION() {\n    return {\n      expect: [this.SLASH, this.DURATIONS],\n      maybe: true,\n      run: (state) => this.builder.setNoteDuration(state.matches[1]),\n    };\n  }\n  OPTS() {\n    return {\n      expect: [this.LBRACKET, this.KEYVAL, this.KEYVALS, this.RBRACKET],\n      maybe: true,\n    };\n  }\n  KEYVALS() {\n    return {\n      expect: [this.COMMA, this.KEYVAL],\n      zeroOrMore: true,\n    };\n  }\n  KEYVAL() {\n    const unquote = (str) => str.slice(1, -1);\n\n    return {\n      expect: [this.KEY, this.EQUALS, this.VAL],\n      run: (state) => this.builder.addNoteOption(state.matches[0], unquote(state.matches[2])),\n    };\n  }\n  VAL() {\n    return {\n      expect: [this.SVAL, this.DVAL],\n      or: true,\n    };\n  }\n\n  KEY() { return { token: '[a-zA-Z][a-zA-Z0-9]*' }; }\n  DVAL() { return { token: '[\"][^\"]*[\"]' }; }\n  SVAL() { return { token: \"['][^']*[']\" }; }\n  NOTENAME() { return { token: '[a-gA-G]' }; }\n  OCTAVE() { return { token: '[0-9]+' }; }\n  ACCIDENTALS() { return { token: 'bbs|bb|bss|bs|b|db|d|##|#|n|\\\\+\\\\+-|\\\\+-|\\\\+\\\\+|\\\\+|k|o' }; }\n  DURATIONS() { return { token: '[0-9whq]+' }; }\n  TYPES() { return { token: '[rRsSxX]' }; }\n  LPAREN() { return { token: '[(]' }; }\n  RPAREN() { return { token: '[)]' }; }\n  COMMA() { return { token: '[,]' }; }\n  DOT() { return { token: '[.]' }; }\n  SLASH() { return { token: '[/]' }; }\n  MAYBESLASH() { return { token: '[/]?' }; }\n  EQUALS() { return { token: '[=]' }; }\n  LBRACKET() { return { token: '\\\\[' }; }\n  RBRACKET() { return { token: '\\\\]' }; }\n  EOL() { return { token: '$' }; }\n}\n\nclass Builder {\n  constructor(factory) {\n    this.factory = factory;\n    this.commitHooks = [];\n    this.reset();\n  }\n\n  reset(options = {}) {\n    this.options = {\n      stem: 'auto',\n      clef: 'treble',\n    };\n    this.elements = {\n      notes: [],\n      accidentals: [],\n    };\n    this.rollingDuration = '8';\n    this.resetPiece();\n    Object.assign(this.options, options);\n  }\n\n  getFactory() { return this.factory; }\n\n  getElements() { return this.elements; }\n\n  addCommitHook(commitHook) {\n    this.commitHooks.push(commitHook);\n  }\n\n  resetPiece() {\n    L('resetPiece');\n    this.piece = {\n      chord: [],\n      duration: this.rollingDuration,\n      dots: 0,\n      type: undefined,\n      options: {},\n    };\n  }\n\n  setNoteDots(dots) {\n    L('setNoteDots:', dots);\n    if (dots) this.piece.dots = dots.length;\n  }\n\n  setNoteDuration(duration) {\n    L('setNoteDuration:', duration);\n    this.rollingDuration = this.piece.duration = duration || this.rollingDuration;\n  }\n\n  setNoteType(type) {\n    L('setNoteType:', type);\n    if (type) this.piece.type = type;\n  }\n\n  addNoteOption(key, value) {\n    L('addNoteOption: key:', key, 'value:', value);\n    this.piece.options[key] = value;\n  }\n\n  addNote(key, accid, octave) {\n    L('addNote:', key, accid, octave);\n    this.piece.chord.push({ key, accid, octave });\n  }\n\n  addSingleNote(key, accid, octave) {\n    L('addSingleNote:', key, accid, octave);\n    this.addNote(key, accid, octave);\n  }\n\n  addChord(notes) {\n    L('startChord');\n    if (typeof (notes[0]) !== 'object') {\n      this.addSingleNote(notes[0]);\n    } else {\n      notes.forEach(n => {\n        if (n) this.addNote(...n);\n      });\n    }\n    L('endChord');\n  }\n\n  commitPiece() {\n    L('commitPiece');\n    const { factory } = this;\n\n    if (!factory) return;\n\n    const options = { ...this.options, ...this.piece.options };\n    const { stem, clef } = options;\n    const autoStem = stem.toLowerCase() === 'auto';\n    const stemDirection = !autoStem && stem.toLowerCase() === 'up'\n      ? StaveNote.STEM_UP\n      : StaveNote.STEM_DOWN;\n\n    // Build StaveNotes.\n    const { chord, duration, dots, type } = this.piece;\n    const keys = chord.map(note => note.key + '/' + note.octave);\n    const note = factory.StaveNote({\n      keys,\n      duration,\n      dots,\n      type,\n      clef,\n      auto_stem: autoStem,\n    });\n    if (!autoStem) note.setStemDirection(stemDirection);\n\n    // Attach accidentals.\n    const accids = chord.map(note => note.accid || null);\n    accids.forEach((accid, i) => {\n      if (accid) note.addAccidental(i, factory.Accidental({ type: accid }));\n    });\n\n    // Attach dots.\n    for (let i = 0; i < dots; i++) note.addDotToAll();\n\n    this.commitHooks.forEach(fn => fn(options, note, this));\n\n    this.elements.notes.push(note);\n    this.elements.accidentals.concat(accids);\n    this.resetPiece();\n  }\n}\n\nfunction setId({ id }, note) {\n  if (id === undefined) return;\n\n  note.setAttribute('id', id);\n}\n\n\nfunction setClass(options, note) {\n  if (!options.class) return;\n\n  const commaSeparatedRegex = /\\s*,\\s*/;\n\n  options.class\n    .split(commaSeparatedRegex)\n    .forEach(className => note.addClass(className));\n}\n\nexport class EasyScore {\n  constructor(options = {}) {\n    this.setOptions(options);\n    this.defaults = {\n      clef: 'treble',\n      time: '4/4',\n      stem: 'auto',\n    };\n  }\n\n  set(defaults) {\n    Object.assign(this.defaults, defaults);\n    return this;\n  }\n\n  setOptions(options) {\n    this.options = {\n      factory: null,\n      builder: null,\n      commitHooks: [\n        setId,\n        setClass,\n        Articulation.easyScoreHook,\n      ],\n      throwOnError: false, ...options\n    };\n\n    this.factory = this.options.factory;\n    this.builder = this.options.builder || new Builder(this.factory);\n    this.grammar = new Grammar(this.builder);\n    this.parser = new Parser(this.grammar);\n    this.options.commitHooks.forEach(commitHook => this.addCommitHook(commitHook));\n    return this;\n  }\n\n  setContext(context) {\n    if (this.factory) this.factory.setContext(context);\n    return this;\n  }\n\n  parse(line, options = {}) {\n    this.builder.reset(options);\n    const result = this.parser.parse(line);\n    if (!result.success && this.options.throwOnError) {\n      throw new X('Error parsing line: ' + line, result);\n    }\n    return result;\n  }\n\n  beam(notes, options = {}) {\n    this.factory.Beam({ notes, options });\n    return notes;\n  }\n\n  tuplet(notes, options = {}) {\n    this.factory.Tuplet({ notes, options });\n    return notes;\n  }\n\n  notes(line, options = {}) {\n    options = { clef: this.defaults.clef, stem: this.defaults.stem, ...options };\n    this.parse(line, options);\n    return this.builder.getElements().notes;\n  }\n\n  voice(notes, voiceOptions) {\n    voiceOptions = { time: this.defaults.time, ...voiceOptions };\n    return this.factory.Voice(voiceOptions).addTickables(notes);\n  }\n\n  addCommitHook(commitHook) {\n    return this.builder.addCommitHook(commitHook);\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n// @author Mohit Cheppudira\n//\n// ## Description\n//\n// This file implements a high level API around VexFlow. It will eventually\n// become the canonical way to use VexFlow.\n//\n// *This API is currently DRAFT*\n\nimport { Vex } from './vex';\nimport { Accidental } from './accidental';\nimport { Articulation } from './articulation';\nimport { Annotation } from './annotation';\nimport { Formatter } from './formatter';\nimport { FretHandFinger } from './frethandfinger';\nimport { StringNumber } from './stringnumber';\nimport { TextDynamics } from './textdynamics';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { Renderer } from './renderer';\nimport { Stave } from './stave';\nimport { StaveTie } from './stavetie';\nimport { StaveLine } from './staveline';\nimport { StaveNote } from './stavenote';\nimport { StaveConnector } from './staveconnector';\nimport { System } from './system';\nimport { TickContext } from './tickcontext';\nimport { Tuplet } from './tuplet';\nimport { Voice } from './voice';\nimport { Beam } from './beam';\nimport { Curve } from './curve';\nimport { GraceNote } from './gracenote';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { NoteSubGroup } from './notesubgroup';\nimport { EasyScore } from './easyscore';\nimport { TimeSigNote } from './timesignote';\nimport { KeySigNote } from './keysignote';\nimport { ClefNote } from './clefnote';\nimport { PedalMarking } from './pedalmarking';\nimport { TextBracket } from './textbracket';\nimport { VibratoBracket } from './vibratobracket';\nimport { GhostNote } from './ghostnote';\nimport { BarNote } from './barnote';\nimport { TabNote } from './tabnote';\nimport { TabStave } from './tabstave';\nimport { TextNote } from './textnote';\n\n// To enable logging for this class. Set `Vex.Flow.Factory.DEBUG` to `true`.\nfunction L(...args) { if (Factory.DEBUG) Vex.L('Vex.Flow.Factory', args); }\n\nexport const X = Vex.MakeException('FactoryError');\n\nfunction setDefaults(params = {}, defaults) {\n  const default_options = defaults.options;\n  params = Object.assign(defaults, params);\n  params.options = Object.assign(default_options, params.options);\n  return params;\n}\n\nexport class Factory {\n  constructor(options) {\n    L('New factory: ', options);\n    const defaults = {\n      stave: {\n        space: 10,\n      },\n      renderer: {\n        context: null,\n        elementId: '',\n        backend: Renderer.Backends.SVG,\n        width: 500,\n        height: 200,\n        background: '#FFF',\n      },\n      font: {\n        face: 'Arial',\n        point: 10,\n        style: '',\n      },\n    };\n\n    this.options = defaults;\n    this.setOptions(options);\n  }\n\n  static newFromElementId(elementId, width = 500, height = 200) {\n    return new Factory({ renderer: { elementId, width, height } });\n  }\n\n  reset() {\n    this.renderQ = [];\n    this.systems = [];\n    this.staves = [];\n    this.voices = [];\n    this.stave = null; // current stave\n  }\n\n  getOptions() { return this.options; }\n  setOptions(options) {\n    for (const key of ['stave', 'renderer', 'font']) {\n      Object.assign(this.options[key], options[key]);\n    }\n    if (this.options.renderer.elementId !== null || this.options.renderer.context) {\n      this.initRenderer();\n    }\n\n    this.reset();\n  }\n\n  initRenderer() {\n    const { elementId, backend, width, height, background } = this.options.renderer;\n    if (elementId === '') {\n      throw new X('HTML DOM element not set in Factory');\n    }\n\n    this.context = Renderer.buildContext(elementId, backend, width, height, background);\n  }\n\n  getContext() { return this.context; }\n  setContext(context) { this.context = context; return this; }\n  getStave() { return this.stave; }\n  getVoices() { return this.voices; }\n\n  // Returns pixels from current stave spacing.\n  space(spacing) { return this.options.stave.space * spacing; }\n\n  Stave(params) {\n    params = setDefaults(params, {\n      x: 0,\n      y: 0,\n      width: this.options.renderer.width - this.space(1),\n      options: {\n        spacing_between_lines_px: this.options.stave.space,\n      },\n    });\n\n    const stave = new Stave(params.x, params.y, params.width, params.options);\n    this.staves.push(stave);\n    stave.setContext(this.context);\n    this.stave = stave;\n    return stave;\n  }\n\n  TabStave(params) {\n    params = setDefaults(params, {\n      x: 0,\n      y: 0,\n      width: this.options.renderer.width - this.space(1),\n      options: {\n        spacing_between_lines_px: this.options.stave.space * 1.3,\n      },\n    });\n\n    const stave = new TabStave(params.x, params.y, params.width, params.options);\n    this.staves.push(stave);\n    stave.setContext(this.context);\n    this.stave = stave;\n    return stave;\n  }\n\n  StaveNote(noteStruct) {\n    const note = new StaveNote(noteStruct);\n    if (this.stave) note.setStave(this.stave);\n    note.setContext(this.context);\n    this.renderQ.push(note);\n    return note;\n  }\n\n  GhostNote(noteStruct) {\n    const ghostNote = new GhostNote(noteStruct);\n    if (this.stave) ghostNote.setStave(this.stave);\n    ghostNote.setContext(this.context);\n    this.renderQ.push(ghostNote);\n    return ghostNote;\n  }\n\n  TextNote(textNoteStruct) {\n    const textNote = new TextNote(textNoteStruct);\n    if (this.stave) textNote.setStave(this.stave);\n    textNote.setContext(this.context);\n    this.renderQ.push(textNote);\n    return textNote;\n  }\n\n  BarNote(params) {\n    params = setDefaults(params, {\n      type: 'single',\n      options: {},\n    });\n\n    const barNote = new BarNote(params.type);\n    if (this.stave) barNote.setStave(this.stave);\n    barNote.setContext(this.context);\n    this.renderQ.push(barNote);\n    return barNote;\n  }\n\n  ClefNote(params) {\n    params = setDefaults(params, {\n      type: 'treble',\n      options: {\n        size: 'default',\n      },\n    });\n\n    const clefNote = new ClefNote(params.type, params.options.size, params.options.annotation);\n    if (this.stave) clefNote.setStave(this.stave);\n    clefNote.setContext(this.context);\n    this.renderQ.push(clefNote);\n    return clefNote;\n  }\n\n  TimeSigNote(params) {\n    params = setDefaults(params, {\n      time: '4/4',\n      options: {},\n    });\n\n    const timeSigNote = new TimeSigNote(params.time);\n    if (this.stave) timeSigNote.setStave(this.stave);\n    timeSigNote.setContext(this.context);\n    this.renderQ.push(timeSigNote);\n    return timeSigNote;\n  }\n\n  KeySigNote(params) {\n    const keySigNote = new KeySigNote(params.key, params.cancelKey, params.alterKey);\n    if (this.stave) keySigNote.setStave(this.stave);\n    keySigNote.setContext(this.context);\n    this.renderQ.push(keySigNote);\n    return keySigNote;\n  }\n\n  TabNote(noteStruct) {\n    const note = new TabNote(noteStruct);\n    if (this.stave) note.setStave(this.stave);\n    note.setContext(this.context);\n    this.renderQ.push(note);\n    return note;\n  }\n\n  GraceNote(noteStruct) {\n    const note = new GraceNote(noteStruct);\n    if (this.stave) note.setStave(this.stave);\n    note.setContext(this.context);\n    return note;\n  }\n\n  GraceNoteGroup(params) {\n    const group = new GraceNoteGroup(params.notes, params.slur);\n    group.setContext(this.context);\n    return group;\n  }\n\n  Accidental(params) {\n    params = setDefaults(params, {\n      type: null,\n      options: {},\n    });\n\n    const accid = new Accidental(params.type);\n    accid.setContext(this.context);\n    return accid;\n  }\n\n  Annotation(params) {\n    params = setDefaults(params, {\n      text: 'p',\n      vJustify: 'below',\n      hJustify: 'center',\n      fontFamily: 'Times',\n      fontSize: 14,\n      fontWeight: 'bold italic',\n      options: {},\n    });\n\n    const annotation = new Annotation(params.text);\n    annotation.setJustification(params.hJustify);\n    annotation.setVerticalJustification(params.vJustify);\n    annotation.setFont(params.fontFamily, params.fontSize, params.fontWeight);\n    annotation.setContext(this.context);\n    return annotation;\n  }\n\n  Articulation(params) {\n    params = setDefaults(params, {\n      type: 'a.',\n      position: 'above',\n      options: {},\n    });\n\n    const articulation = new Articulation(params.type);\n    articulation.setPosition(params.position);\n    articulation.setContext(this.context);\n    return articulation;\n  }\n\n  TextDynamics(params) {\n    params = setDefaults(params, {\n      text: 'p',\n      duration: 'q',\n      dots: 0,\n      line: 0,\n      options: {},\n    });\n\n    const text = new TextDynamics({\n      text: params.text,\n      line: params.line,\n      duration: params.duration,\n      dots: params.dots,\n    });\n\n    if (this.stave) text.setStave(this.stave);\n    text.setContext(this.context);\n    this.renderQ.push(text);\n    return text;\n  }\n\n  Fingering(params) {\n    params = setDefaults(params, {\n      number: '0',\n      position: 'left',\n      options: {},\n    });\n\n    const fingering = new FretHandFinger(params.number);\n    fingering.setPosition(params.position);\n    fingering.setContext(this.context);\n    return fingering;\n  }\n\n  StringNumber(params) {\n    params = setDefaults(params, {\n      number: '0',\n      position: 'left',\n      options: {},\n    });\n\n    const stringNumber = new StringNumber(params.number);\n    stringNumber.setPosition(params.position);\n    stringNumber.setContext(this.context);\n    return stringNumber;\n  }\n\n  TickContext() {\n    return new TickContext().setContext(this.context);\n  }\n\n  ModifierContext() {\n    return new ModifierContext();\n  }\n\n  MultiMeasureRest(params) {\n    const multimeasurerest = new MultiMeasureRest(params.number_of_measures, params);\n    multimeasurerest.setContext(this.context);\n    this.renderQ.push(multimeasurerest);\n    return multimeasurerest;\n  }\n\n  Voice(params) {\n    params = setDefaults(params, {\n      time: '4/4',\n      options: {},\n    });\n    const voice = new Voice(params.time);\n    this.voices.push(voice);\n    return voice;\n  }\n\n  StaveConnector(params) {\n    params = setDefaults(params, {\n      top_stave: null,\n      bottom_stave: null,\n      type: 'double',\n      options: {},\n    });\n    const connector = new StaveConnector(params.top_stave, params.bottom_stave);\n    connector.setType(params.type).setContext(this.context);\n    this.renderQ.push(connector);\n    return connector;\n  }\n\n  Formatter() {\n    return new Formatter();\n  }\n\n  Tuplet(params) {\n    params = setDefaults(params, {\n      notes: [],\n      options: {},\n    });\n\n    const tuplet = new Tuplet(params.notes, params.options).setContext(this.context);\n    this.renderQ.push(tuplet);\n    return tuplet;\n  }\n\n  Beam(params) {\n    params = setDefaults(params, {\n      notes: [],\n      options: {\n        autoStem: false,\n        secondaryBeamBreaks: [],\n      },\n    });\n\n    const beam = new Beam(params.notes, params.options.autoStem).setContext(this.context);\n    beam.breakSecondaryAt(params.options.secondaryBeamBreaks);\n    this.renderQ.push(beam);\n    return beam;\n  }\n\n  Curve(params) {\n    params = setDefaults(params, {\n      from: null,\n      to: null,\n      options: {},\n    });\n\n    const curve = new Curve(params.from, params.to, params.options).setContext(this.context);\n    this.renderQ.push(curve);\n    return curve;\n  }\n\n  StaveTie(params) {\n    params = setDefaults(params, {\n      from: null,\n      to: null,\n      first_indices: [0],\n      last_indices: [0],\n      text: null,\n      options: {\n        direction: undefined,\n      },\n    });\n\n    const tie = new StaveTie({\n      first_note: params.from,\n      last_note: params.to,\n      first_indices: params.first_indices,\n      last_indices: params.last_indices,\n    }, params.text);\n\n    if (params.options.direction) tie.setDirection(params.options.direction);\n    tie.setContext(this.context);\n    this.renderQ.push(tie);\n    return tie;\n  }\n\n  StaveLine(params) {\n    params = setDefaults(params, {\n      from: null,\n      to: null,\n      first_indices: [0],\n      last_indices: [0],\n      options: {},\n    });\n\n    const line = new StaveLine({\n      first_note: params.from,\n      last_note: params.to,\n      first_indices: params.first_indices,\n      last_indices: params.last_indices,\n    });\n\n    if (params.options.text) line.setText(params.options.text);\n    if (params.options.font) line.setFont(params.options.font);\n\n    line.setContext(this.context);\n    this.renderQ.push(line);\n    return line;\n  }\n\n  VibratoBracket(params) {\n    params = setDefaults(params, {\n      from: null,\n      to: null,\n      options: {\n        harsh: false,\n      },\n    });\n\n    const vibratoBracket = new VibratoBracket({\n      start: params.from,\n      stop: params.to,\n    });\n\n    if (params.options.line) vibratoBracket.setLine(params.options.line);\n    if (params.options.harsh) vibratoBracket.setHarsh(params.options.harsh);\n\n    vibratoBracket.setContext(this.context);\n    this.renderQ.push(vibratoBracket);\n\n    return vibratoBracket;\n  }\n\n  TextBracket(params) {\n    params = setDefaults(params, {\n      from: null,\n      to: null,\n      text: '',\n      options: {\n        superscript: '',\n        position: 1,\n      },\n    });\n\n    const textBracket = new TextBracket({\n      start: params.from,\n      stop: params.to,\n      text: params.text,\n      superscript: params.options.superscript,\n      position: params.options.position,\n    });\n\n    if (params.options.line) textBracket.setLine(params.options.line);\n    if (params.options.font) textBracket.setFont(params.options.font);\n\n    textBracket.setContext(this.context);\n    this.renderQ.push(textBracket);\n    return textBracket;\n  }\n\n  System(params = {}) {\n    params.factory = this;\n    const system = new System(params).setContext(this.context);\n    this.systems.push(system);\n    return system;\n  }\n\n  EasyScore(params = {}) {\n    params.factory = this;\n    return new EasyScore(params);\n  }\n\n  PedalMarking(params = {}) {\n    params = setDefaults(params, {\n      notes: [],\n      options: {\n        style: 'mixed',\n      },\n    });\n\n    const pedal = new PedalMarking(params.notes);\n    pedal.setStyle(PedalMarking.StylesString[params.options.style]);\n    pedal.setContext(this.context);\n    this.renderQ.push(pedal);\n    return pedal;\n  }\n\n  NoteSubGroup(params = {}) {\n    params = setDefaults(params, {\n      notes: [],\n      options: {},\n    });\n\n    const group = new NoteSubGroup(params.notes);\n    group.setContext(this.context);\n    return group;\n  }\n\n  draw() {\n    this.systems.forEach(i => i.setContext(this.context).format());\n    this.staves.forEach(i => i.setContext(this.context).draw());\n    this.voices.forEach(i => i.setContext(this.context).draw());\n    this.renderQ.forEach(i => {\n      if (!i.isRendered()) i.setContext(this.context).draw();\n    });\n    this.systems.forEach(i => i.setContext(this.context).draw());\n    this.reset();\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// This class implements a musical system, which is a collection of staves,\n// each which can have one or more voices. All voices across all staves in\n// the system are formatted together.\n\nimport { Element } from './element';\nimport { Factory } from './factory';\nimport { Formatter } from './formatter';\nimport { Note } from './note';\n\nfunction setDefaults(params, defaults) {\n  const default_options = defaults.options;\n  params = Object.assign(defaults, params);\n  params.options = Object.assign(default_options, params.options);\n  return params;\n}\n\nexport class System extends Element {\n  constructor(params = {}) {\n    super();\n    this.setAttribute('type', 'System');\n    this.setOptions(params);\n    this.parts = [];\n  }\n\n  setOptions(options = {}) {\n    this.options = setDefaults(options, {\n      x: 10,\n      y: 10,\n      width: 500,\n      connector: null,\n      spaceBetweenStaves: 12, // stave spaces\n      factory: null,\n      debugFormatter: false,\n      formatIterations: 0,   // number of formatter tuning steps\n      options: {},\n    });\n\n    this.factory = this.options.factory || new Factory({ renderer: { el: null } });\n  }\n\n  setContext(context) {\n    super.setContext(context);\n    this.factory.setContext(context);\n    return this;\n  }\n\n  addConnector(type = 'double') {\n    this.connector = this.factory.StaveConnector({\n      top_stave: this.parts[0].stave,\n      bottom_stave: this.parts[this.parts.length - 1].stave,\n      type,\n    });\n    return this.connector;\n  }\n\n  addStave(params) {\n    params = setDefaults(params, {\n      stave: null,\n      voices: [],\n      spaceAbove: 0, // stave spaces\n      spaceBelow: 0, // stave spaces\n      debugNoteMetrics: false,\n      options: { left_bar: false },\n    });\n\n    if (!params.stave) {\n      params.stave = this.factory.Stave({\n        x: this.options.x,\n        y: this.options.y,\n        width: this.options.width,\n        options: params.options,\n      });\n    }\n\n    params.voices.forEach(voice =>\n      voice\n        .setContext(this.context)\n        .setStave(params.stave)\n        .getTickables()\n        .forEach(tickable => tickable.setStave(params.stave))\n    );\n\n    this.parts.push(params);\n    return params.stave;\n  }\n\n  format() {\n    const formatter = new Formatter();\n    this.formatter = formatter;\n\n    let y = this.options.y;\n    let startX = 0;\n    let allVoices = [];\n    const debugNoteMetricsYs = [];\n\n    // Join the voices for each stave.\n    this.parts.forEach(part => {\n      y = y + part.stave.space(part.spaceAbove);\n      part.stave.setY(y);\n      formatter.joinVoices(part.voices);\n      y = y + part.stave.space(part.spaceBelow);\n      y = y + part.stave.space(this.options.spaceBetweenStaves);\n      if (part.debugNoteMetrics) {\n        debugNoteMetricsYs.push({ y, voice: part.voices[0] });\n        y += 15;\n      }\n      allVoices = allVoices.concat(part.voices);\n\n      startX = Math.max(startX, part.stave.getNoteStartX());\n    });\n\n    // Update the start position of all staves.\n    this.parts.forEach(part => part.stave.setNoteStartX(startX));\n    const justifyWidth = this.options.width - (startX - this.options.x) - Note.STAVEPADDING;\n    formatter.format(allVoices, justifyWidth);\n\n    for (let i = 0; i < this.options.formatIterations; i++) {\n      formatter.tune();\n    }\n\n    this.startX = startX;\n    this.debugNoteMetricsYs = debugNoteMetricsYs;\n    this.lastY = y;\n  }\n\n  draw() {\n    // Render debugging information, if requested.\n    const ctx = this.checkContext();\n    this.setRendered();\n\n    if (this.options.debugFormatter) {\n      Formatter.plotDebugging(ctx, this.formatter, this.startX, this.options.y, this.lastY);\n    }\n\n    this.debugNoteMetricsYs.forEach(d => {\n      d.voice.getTickables().forEach(note => Note.plotMetrics(ctx, note, d.y));\n    });\n  }\n}\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n\nimport { Vex } from './vex';\nimport { Flow } from './tables';\nimport { Element } from './element';\nimport { Fraction } from './fraction';\nimport { Renderer } from './renderer';\nimport { Formatter } from './formatter';\nimport { Music } from './music';\nimport { Glyph } from './glyph';\nimport { Stave } from './stave';\nimport { StaveNote } from './stavenote';\nimport { StaveModifier } from './stavemodifier';\nimport { StaveTempo } from './stavetempo';\nimport { Voice } from './voice';\nimport { Accidental } from './accidental';\nimport { Beam } from './beam';\nimport { StaveTie } from './stavetie';\nimport { TabStave } from './tabstave';\nimport { TabNote } from './tabnote';\nimport { Bend } from './bend';\nimport { Vibrato } from './vibrato';\nimport { VibratoBracket } from './vibratobracket';\nimport { Note } from './note';\nimport { ModifierContext } from './modifiercontext';\nimport { MultiMeasureRest } from './multimeasurerest';\nimport { TickContext } from './tickcontext';\nimport { Articulation } from './articulation';\nimport { Annotation } from './annotation';\nimport { Barline } from './stavebarline';\nimport { NoteHead } from './notehead';\nimport { StaveConnector } from './staveconnector';\nimport { ClefNote } from './clefnote';\nimport { KeySignature } from './keysignature';\nimport { KeySigNote } from './keysignote';\nimport { TimeSignature } from './timesignature';\nimport { TimeSigNote } from './timesignote';\nimport { Stem } from './stem';\nimport { TabTie } from './tabtie';\nimport { Clef } from './clef';\nimport { Dot } from './dot';\nimport { Modifier } from './modifier';\nimport { TabSlide } from './tabslide';\nimport { Tuplet } from './tuplet';\nimport { GraceNote } from './gracenote';\nimport { GraceTabNote } from './gracetabnote';\nimport { Tuning } from './tuning';\nimport { KeyManager } from './keymanager';\nimport { StaveHairpin } from './stavehairpin';\nimport { BoundingBox } from './boundingbox';\nimport { Stroke } from './strokes';\nimport { TextNote } from './textnote';\nimport { Curve } from './curve';\nimport { TextDynamics } from './textdynamics';\nimport { StaveLine } from './staveline';\nimport { Ornament } from './ornament';\nimport { PedalMarking } from './pedalmarking';\nimport { TextBracket } from './textbracket';\nimport { FretHandFinger } from './frethandfinger';\nimport { Repetition } from './staverepetition';\nimport { BarNote } from './barnote';\nimport { GhostNote } from './ghostnote';\nimport { NoteSubGroup } from './notesubgroup';\nimport { GraceNoteGroup } from './gracenotegroup';\nimport { Tremolo } from './tremolo';\nimport { StringNumber } from './stringnumber';\nimport { Crescendo } from './crescendo';\nimport { Volta } from './stavevolta';\nimport { Font } from './fonts/vexflow_font';\nimport { System } from './system';\nimport { Factory } from './factory';\nimport { Parser } from './parser';\nimport { EasyScore } from './easyscore';\nimport { Registry } from './registry';\n\nVex.Flow = Flow;\nVex.Flow.Element = Element;\nVex.Flow.Fraction = Fraction;\nVex.Flow.Renderer = Renderer;\nVex.Flow.Formatter = Formatter;\nVex.Flow.Music = Music;\nVex.Flow.Glyph = Glyph;\nVex.Flow.Stave = Stave;\nVex.Flow.StaveNote = StaveNote;\nVex.Flow.StaveModifier = StaveModifier;\nVex.Flow.StaveTempo = StaveTempo;\nVex.Flow.Voice = Voice;\nVex.Flow.Accidental = Accidental;\nVex.Flow.Beam = Beam;\nVex.Flow.StaveTie = StaveTie;\nVex.Flow.TabStave = TabStave;\nVex.Flow.TabNote = TabNote;\nVex.Flow.Bend = Bend;\nVex.Flow.Vibrato = Vibrato;\nVex.Flow.VibratoBracket = VibratoBracket;\nVex.Flow.Note = Note;\nVex.Flow.ModifierContext = ModifierContext;\nVex.Flow.MultiMeasureRest = MultiMeasureRest;\nVex.Flow.TickContext = TickContext;\nVex.Flow.Articulation = Articulation;\nVex.Flow.Annotation = Annotation;\nVex.Flow.Barline = Barline;\nVex.Flow.NoteHead = NoteHead;\nVex.Flow.StaveConnector = StaveConnector;\nVex.Flow.ClefNote = ClefNote;\nVex.Flow.KeySignature = KeySignature;\nVex.Flow.KeySigNote = KeySigNote;\nVex.Flow.TimeSignature = TimeSignature;\nVex.Flow.TimeSigNote = TimeSigNote;\nVex.Flow.Stem = Stem;\nVex.Flow.TabTie = TabTie;\nVex.Flow.Clef = Clef;\nVex.Flow.Dot = Dot;\nVex.Flow.Modifier = Modifier;\nVex.Flow.TabSlide = TabSlide;\nVex.Flow.Tuplet = Tuplet;\nVex.Flow.GraceNote = GraceNote;\nVex.Flow.GraceTabNote = GraceTabNote;\nVex.Flow.Tuning = Tuning;\nVex.Flow.KeyManager = KeyManager;\nVex.Flow.StaveHairpin = StaveHairpin;\nVex.Flow.BoundingBox = BoundingBox;\nVex.Flow.Stroke = Stroke;\nVex.Flow.TextNote = TextNote;\nVex.Flow.Curve = Curve;\nVex.Flow.TextDynamics = TextDynamics;\nVex.Flow.StaveLine = StaveLine;\nVex.Flow.Ornament = Ornament;\nVex.Flow.PedalMarking = PedalMarking;\nVex.Flow.TextBracket = TextBracket;\nVex.Flow.FretHandFinger = FretHandFinger;\nVex.Flow.Repetition = Repetition;\nVex.Flow.BarNote = BarNote;\nVex.Flow.GhostNote = GhostNote;\nVex.Flow.NoteSubGroup = NoteSubGroup;\nVex.Flow.GraceNoteGroup = GraceNoteGroup;\nVex.Flow.Tremolo = Tremolo;\nVex.Flow.StringNumber = StringNumber;\nVex.Flow.Crescendo = Crescendo;\nVex.Flow.Volta = Volta;\nVex.Flow.Font = Font;\nVex.Flow.System = System;\nVex.Flow.Factory = Factory;\nVex.Flow.Parser = Parser;\nVex.Flow.EasyScore = EasyScore;\nVex.Flow.Registry = Registry;\n\nexport default Vex;\n","// [VexFlow](http://vexflow.com) - Copyright (c) Mohit Muthanna 2010.\n//\n// ## Description\n//\n// This class implements diatonic key management.\n\nimport { Vex } from './vex';\nimport { Music } from './music';\n\nexport class KeyManager {\n  constructor(key) {\n    this.music = new Music();\n    this.setKey(key);\n  }\n\n  setKey(key) {\n    this.key = key;\n    this.reset();\n    return this;\n  }\n\n  getKey() { return this.key; }\n\n  reset() {\n    this.keyParts = this.music.getKeyParts(this.key);\n\n    this.keyString = this.keyParts.root;\n    if (this.keyParts.accidental) this.keyString += this.keyParts.accidental;\n\n    const is_supported_type = Music.scaleTypes[this.keyParts.type];\n    if (!is_supported_type) {\n      throw new Vex.RERR('BadArguments', `Unsupported key type: ${this.key}`);\n    }\n\n    this.scale = this.music.getScaleTones(\n      this.music.getNoteValue(this.keyString),\n      Music.scaleTypes[this.keyParts.type]\n    );\n\n    this.scaleMap = {};\n    this.scaleMapByValue = {};\n    this.originalScaleMapByValue = {};\n\n    const noteLocation = Music.root_indices[this.keyParts.root];\n\n    for (let i = 0; i < Music.roots.length; ++i) {\n      const index = (noteLocation + i) % Music.roots.length;\n      const rootName = Music.roots[index];\n\n      const noteName = this.music.getRelativeNoteName(rootName, this.scale[i]);\n      this.scaleMap[rootName] = noteName;\n      this.scaleMapByValue[this.scale[i]] = noteName;\n      this.originalScaleMapByValue[this.scale[i]] = noteName;\n    }\n\n    return this;\n  }\n\n  getAccidental(key) {\n    const root = this.music.getKeyParts(key).root;\n    const parts = this.music.getNoteParts(this.scaleMap[root]);\n\n    return {\n      note: this.scaleMap[root],\n      accidental: parts.accidental,\n    };\n  }\n\n  selectNote(note) {\n    note = note.toLowerCase();\n    const parts = this.music.getNoteParts(note);\n\n    // First look for matching note in our altered scale\n    const scaleNote = this.scaleMap[parts.root];\n    const modparts = this.music.getNoteParts(scaleNote);\n\n    if (scaleNote === note) {\n      return {\n        'note': scaleNote,\n        'accidental': parts.accidental,\n        'change': false,\n      };\n    }\n\n    // Then search for a note of equivalent value in our altered scale\n    const valueNote = this.scaleMapByValue[this.music.getNoteValue(note)];\n    if (valueNote != null) {\n      return {\n        'note': valueNote,\n        'accidental': this.music.getNoteParts(valueNote).accidental,\n        'change': false,\n      };\n    }\n\n    // Then search for a note of equivalent value in the original scale\n    const originalValueNote = this.originalScaleMapByValue[\n      this.music.getNoteValue(note)];\n    if (originalValueNote != null) {\n      this.scaleMap[modparts.root] = originalValueNote;\n      delete this.scaleMapByValue[this.music.getNoteValue(scaleNote)];\n      this.scaleMapByValue[this.music.getNoteValue(note)] = originalValueNote;\n      return {\n        'note': originalValueNote,\n        'accidental': this.music.getNoteParts(originalValueNote).accidental,\n        'change': true,\n      };\n    }\n\n    // Then try to unmodify a currently modified note.\n    if (modparts.root === note) {\n      delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n      this.scaleMapByValue[this.music.getNoteValue(modparts.root)] =  modparts.root;\n      this.scaleMap[modparts.root] = modparts.root;\n      return {\n        'note': modparts.root,\n        'accidental': null,\n        'change': true,\n      };\n    }\n\n    // Last resort -- shitshoot\n    delete this.scaleMapByValue[this.music.getNoteValue(this.scaleMap[parts.root])];\n    this.scaleMapByValue[this.music.getNoteValue(note)] = note;\n\n    delete this.scaleMap[modparts.root];\n    this.scaleMap[modparts.root] = note;\n\n    return {\n      note,\n      'accidental': parts.accidental,\n      'change': true,\n    };\n  }\n}\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","export const WIDTH = 1540;\nexport const HEIGHT = 200;\n// export const STRINGS = [ //E A D G\n//   {y: 120},{y: 80},{y: 40},{y: 0}\n//]\nexport const STRINGS = [ //G D A E\n  {y: 0},{y: 40},{y: 80},{y: 120}\n];\nexport const FRET_TOP = 28;\nexport const FRET_BOTTOM = 172;\nexport const FRETS = [\n  {x:0},  //nut\n  {x:112}, {x:218}, {x:318}, {x:412}, {x:501}, {x:585},\n  {x:665}, {x:740}, {x:810}, {x:877}, {x: 940}, {x:1000}, //first octave\n  {x:1056}, {x:1109}, {x:1159}, {x:1206}, {x:1250}, {x:1292},\n  {x:1332}, {x:1370}, {x:1405}, {x:1438}, {x:1470},{x:1500}\n]\n\nexport const INLAY_DOT_RADIUS = 8;\n\nfunction halfFret(a, b){\n  return FRETS[a].x + ((FRETS[b].x - FRETS[a].x) / 2)\n}\nexport const INLAY_DOTS = [\n  {x:halfFret(2,3), y:60},\n  {x:halfFret(4,5), y:60},\n  {x:halfFret(6,7), y:60},\n  {x:halfFret(11,12), y:20},\n  {x:halfFret(11,12), y:100},\n  {x:halfFret(14,15), y:60},\n  {x:halfFret(16,17), y:60},\n  {x:halfFret(18,19), y:60},\n  {x:halfFret(23,24), y:20},\n  {x:halfFret(23,24), y:100}\n]\n\nexport const TOP_OFFSET = 40;\nexport const LEFT_OFFSET = 10;\nexport const SCALE = 0.8;\nexport const OPEN_STRING_FINGER_OFFSET = 20;","import Konva from 'konva';\nimport {createStaticFretboardLayer} from './static.js'\nimport {WIDTH, HEIGHT, FRETS, STRINGS, TOP_OFFSET, LEFT_OFFSET, OPEN_STRING_FINGER_OFFSET} from './const.js'\nimport fingerState from './fingerState.js'\n\nlet animating;\nconst CIRCLE_RADIUS = 20\nfunction createOpenStringFingerShape(finger){\n  const string = STRINGS[finger.string]\n  const line = new Konva.Line({\n    points: [0, 0, WIDTH, 0],\n    stroke: '#E5C200',\n    strokeWidth: 4,\n  });\n  return line;\n}\n\nfunction _createOpenStringFingerShape(finger){\n  const group = new Konva.Group({\n    x: 0,\n    y: 0\n  });\n\n  const colors = finger.type === 'default'\n    ? {text: '#FFFFFF', line: '#E5C200', background: '#E5C200'}\n    : {text: '#FFFFFF', line: '#FEFEFE', background: '#FEFEFE'}\n\n\n  const text = new Konva.Text({\n    text: \"<\",\n    fontSize: 48,\n    x: -((CIRCLE_RADIUS-4)/2 + 6),\n    y: -((CIRCLE_RADIUS-4)/2 + 17),\n    fontFamily: 'Calibri',\n    fill: colors.text\n  });\n\n  let circle = new Konva.Circle({\n    x: 0,\n    y: 0,\n    radius: CIRCLE_RADIUS - 4,\n    fill: colors.background,\n    stroke: colors.line,\n    strokeWidth: 2\n  });\n\n  group.add(circle);\n  group.add(text);\n\n  return group;\n}\n\nfunction createCircularFingerShape(finger, circleText){\n  const group = new Konva.Group({\n    x: 0,\n    y: 0\n  });\n\n  const colors = finger.type === 'default'\n    ? {text: '#FFFFFF', line: '#E5C200', background: '#E5C200'}\n    : {text: '#FFFFFF', line: '#FEFEFE', background: '#FEFEFE'}\n\n  const text = new Konva.Text({\n    text: circleText,\n    fontSize: 30,\n    x: -(CIRCLE_RADIUS/2 - 1),\n    y: -(CIRCLE_RADIUS/2 + 6),\n    fontFamily: 'Lato',\n    fill: colors.text\n  });\n\n  let circle = new Konva.Circle({\n    x: 0,\n    y: 0,\n    radius: CIRCLE_RADIUS,\n    fill: colors.background,\n    stroke: colors.line,\n    strokeWidth: 2\n  });\n\n  group.add(circle);\n  group.add(text);\n\n  return group;\n}\n\nfunction createNumericFingerShape(finger){\n  return createCircularFingerShape(finger, finger.nr.toString());\n}\n\nfunction createThumbFingerShape(finger){\n  return createCircularFingerShape(finger, 'T');\n}\n\nfunction createFingerShape(finger){\n  if(finger.nr >= 1 && finger.nr <= 4){\n    return createNumericFingerShape(finger);\n  }\n  if(finger.fret === 0){\n    //open string\n    return createOpenStringFingerShape(finger);\n  }\n  if(finger.nr === 5){\n    //thumb\n    return createThumbFingerShape(finger);\n  }\n}\n\nfunction createHandPositionShape({firstFret: firstFretIndex,\n    lastFret: lastFretIndex}){\n  const group = new Konva.Group({\n    x: 0,\n    y: 0\n  });\n\n  const lastFret = lastFretIndex > FRETS.length -1 ?\n     FRETS[FRETS.length -1] : FRETS[lastFretIndex];\n\n  if(firstFretIndex > 1){\n    let leftSquare = new Konva.Rect({\n      x: 0,\n      y: 0,\n      width: LEFT_OFFSET + FRETS[firstFretIndex - 1].x,\n      height: HEIGHT,\n      fill: \"#33333333\"\n    });\n    group.add(leftSquare);\n  }\n\n  let rightSquare = new Konva.Rect({\n    x: LEFT_OFFSET + lastFret.x,\n    y: 0,\n    width: (WIDTH - lastFret.x) ,\n    height: 200,\n    fill: \"#33333333\"\n  });\n\n  group.add(rightSquare);\n\n  return group;\n}\n\nfunction setFingerPosition(shape, finger, currentLeftOffset){\n  if(finger.fret > FRETS.length - 1){\n    console.log('Fret out of range', finger, FRETS);\n  }\n  if(finger.string){\n    let x = FRETS[finger.fret].x;\n    if(finger.fret === 0){\n      x = ((currentLeftOffset || 0) + OPEN_STRING_FINGER_OFFSET);\n    }\n\n    let y = TOP_OFFSET + STRINGS[finger.string - 1].y ;\n    shape.setAttr('x', x);\n    shape.setAttr('y', y);\n    return true;\n  }\n}\n\nfunction drawFingers(fingerState, fingerLayer, currentLeftOffset){\n  fingerLayer.destroyChildren();\n  fingerState.fingersDown.forEach(fd => {\n    const shape = createFingerShape(fd);\n    if(setFingerPosition(shape, fd, currentLeftOffset)){\n      fingerLayer.add(shape)\n    }\n  });\n\n  if(fingerState.handPosition){\n    const handPosition = createHandPositionShape(fingerState.handPosition);\n    fingerLayer.add(handPosition);\n  }\n}\n\nfunction setContainerSize(container, width, height){\n  const actualWidth = window.innerWidth - 40;\n  SCALE = actualWidth / WIDTH;\n  container.style.width = width * SCALE;\n  container.style.height = height * SCALE;\n}\n\nlet SCALE;\nclass Fretboard{\n  constructor(){\n    this.onTimeChange = this.onTimeChange.bind(this);\n    this.onWindowResize = this.onWindowResize.bind(this);\n  }\n  init(container, timer){\n    this.containerElement = document.getElementById(container);\n    setContainerSize(this.containerElement, WIDTH, HEIGHT);\n    this.needsResizing = true;\n    this.stage = new Konva.Stage({\n      container: container,\n      width: WIDTH,\n      height: HEIGHT,\n      scaleX: SCALE,\n      scaleY: SCALE\n    });\n    this.currentLeftOffset = 0;\n    this.stage.add(createStaticFretboardLayer(this.stage));\n    this.fingerLayer = new Konva.Layer();\n    this.stage.add(this.fingerLayer);\n    this.frameCounter = 0;\n    this.timer = timer;\n    this.timer.addHandler(this);\n    window.addEventListener('resize', this.onWindowResize);\n  }\n  onWindowResize(){\n    //reset position\n    setContainerSize(this.containerElement, WIDTH, HEIGHT);\n    this.needsResizing = true;\n  }\n  destruct(){\n    animating = false;\n    window.removeEventListener('resize', this.onWindowResize);\n  }\n  play(score){\n    this.score = score;\n    this.fingerState = fingerState.init(this.score);\n    animating = true;\n    drawFingers(this.fingerState, this.fingerLayer, this.currentLeftOffset)\n    this.stage.draw();\n  }\n  onTimeChange({currentTime, currentBar}){\n    let needsDraw = false;\n    if(this.score){\n      if(currentTime < this.previousTime){\n        //user scrolled backwards, reinit\n        this.fingerState = fingerState.init(this.score);\n      }\n      this.previousTime = currentTime;\n      this.fingerState = fingerState.getAt(this.fingerState, currentTime);\n      if(this.fingerState.changed){\n        drawFingers(this.fingerState, this.fingerLayer, this.currentLeftOffset)\n        needsDraw = true;\n      }\n    }\n\n    if(this.needsResizing){\n      //scale to is half the container element\n      //1 = 2000 (container 1000)\n      //0.5 = 1000 (container 500)\n      let scale = this.containerElement.offsetWidth / 1550;\n      this.stage.setAttr(\"scaleX\", scale);\n      this.stage.setAttr(\"scaleY\", scale);\n      this.needsResizing = false;\n      needsDraw = true;\n    }\n    if(needsDraw){\n      this.stage.draw();\n    }\n  }\n}\n\nexport default Fretboard;\n","import {WIDTH, HEIGHT, STRINGS, FRET_TOP, FRET_BOTTOM,\n  FRETS, INLAY_DOT_RADIUS, INLAY_DOTS, TOP_OFFSET, LEFT_OFFSET} from './const.js'\n\nfunction createStaticFretboardLayer(stage){\n  // then create layer\n  var layer = new Konva.Layer();\n\n  STRINGS.forEach(string=>{\n    var line = new Konva.Line({\n        points: [0, TOP_OFFSET + string.y, WIDTH, TOP_OFFSET + string.y],\n        stroke: '#A9A9A9',\n        strokeWidth: 1,\n      });\n    // add the shape to the layer\n    layer.add(line);\n  });\n\n  FRETS.forEach(fret=>{\n    var line = new Konva.Line({\n        points: [LEFT_OFFSET + fret.x, FRET_TOP, LEFT_OFFSET + fret.x, FRET_BOTTOM],\n        stroke: '#A9A9A9',\n        strokeWidth: 2,\n      });\n    // add the shape to the layer\n    layer.add(line);\n  });\n\n  INLAY_DOTS.forEach(dot=>{\n    var dot = new Konva.Circle({\n      x: LEFT_OFFSET + dot.x,\n      y: TOP_OFFSET + dot.y,\n      radius: INLAY_DOT_RADIUS,\n      fill: '#A9A9A9',\n      stroke: '#A9A9A9',\n      strokeWidth: 2\n    });\n    // add the shape to the layer\n    layer.add(dot);\n  });\n  return layer;\n}\n\nexport { createStaticFretboardLayer };","import React from 'react';\nimport PropTypes from 'prop-types';\nimport request from 'browser-request';\nimport Fretboard from \"./../fretboard/fretboard.js\"\n\nclass FretboardWrapper extends React.Component{\n  constructor(){\n    super();\n    this.onTimerStarted = this.onTimerStarted.bind(this);\n  }\n  onTimerStarted(){\n    this.fretboard.play(this.props.score);\n  }\n  componentDidMount(){\n    this.fretboard = new Fretboard();\n    this.fretboard.init('fretboard-container', this.props.timer);\n    this.props.timer.addHandler(this);\n  }\n  componentWillUnmount(){\n    this.props.timer.removeHandler(this);\n    this.fretboard.destruct();\n  }\n  render(){\n    return (<div id={'fretboard-wrapper'}>\n       <div id='fretboard-container'>\n       </div>\n      </div>);\n  }\n}\n\nFretboardWrapper.propTypes = {\n  timer: PropTypes.object.isRequired,\n}\nFretboardWrapper.displayName = 'FretboardWrapper';\n\nexport default FretboardWrapper;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport request from 'browser-request';\nimport scorePositionHelper from '../helpers/scorePositionHelper';\nimport { max } from 'lodash';\n\nconst Vex = require('vexflow').default;\nconst Artist = require('../vextab/artist.js');\nconst VexTab = require('../vextab/vextab.js');\n\nlet renderer;\nlet currentX;\nlet barWidths;\nlet totalBarWidth;\n\nfunction reset(){\n  renderer = null;\n  currentX = 0;\n  barWidths = {};\n  totalBarWidth = 0;\n}\n\nfunction calculateBarWidths(bars, fullBarDuration){\n  bars.forEach((bar, i)=>{\n    const fullBarWidth = 600;\n    const barDuration = bar.end - bar.start;\n    const barWidthFactor = barDuration / fullBarDuration;\n\n    let barWidth = fullBarWidth * barWidthFactor;\n    let minWidth = 120;\n    if(bar.noteCount){\n      //legacy scores don't have this value\n      barWidth = 80 + (bar.noteCount * 40);\n    }\n\n    //let's try to use number of notes as a measure of barwidth\n    if(bar.number === 1){\n      barWidth += 40; //clef time, key sigs\n      minWidth += 40;\n    }\n    barWidths[bar.number] =\n      Math.max(minWidth , //at least 400\n        Math.min(window.innerWidth - 100, barWidth) //not more that screen - 100\n      );\n    totalBarWidth += barWidth;\n  })\n}\n\nfunction showVexTab(selector, tuning, key, timeSig, notes, barCount, showNotation, showTabs, beatsPerBar, barNumber){\n  let barWidth = barWidths[barNumber];\n\n  if(!renderer){\n    // Initialize VexTab artist and parser.\n    //6px per note, can be predicted better by counting unique start_ats\n    // width should be passed from outside\n    // const width = 6 * notes.length;\n    // Create VexFlow Renderer from canvas element [selector].\n    renderer = new Vex.Flow.Renderer(\n      $(selector)[0], Vex.Flow.Renderer.Backends.SVG);\n    //renderer.resize(1000, 200)\n    //Stub the clear() on the renderer.getContext()\n    const getContext = renderer.getContext;\n    renderer.getContext = () => {\n      let ctx = getContext.apply(renderer);\n      ctx.clear = ()=>{}\n      return ctx;\n    }\n\n    //Stub renderer resize, so it is called only once\n    renderer.resize(totalBarWidth, 264);\n    renderer.resize = () => {};\n\n  }\n\n  let artist = new Artist(currentX, 30, barWidth, {scale:1});\n  //artist.setOptions(customization options go here);\n\n  var vextab = new VexTab(artist);\n  artist.renderConnector = barNumber === 1;\n  artist.renderClef = barNumber === 1;\n  artist.renderTimeSig = barNumber === 1;\n  artist.renderKeySig =  barNumber === 1;\n  artist.renderTabGlyph = barNumber === 1;\n  try {\n      // Parse VexTab music notation passed in as a string.\n      //vextab.parse(\"tabstave tuning=G/3,D/3,A/2,E/2 clef=bass strings=4 notation=true key=C\\n\" + notes + \"\\n\")\n      let vexTabString = `options beam-stemlets=false beam-middle-only=true\\n`;\n      vexTabString += 'tabstave tuning='\n        + tuning\n        + ` clef=bass time=${timeSig} `\n        + `strings=4 notation=${showNotation===true} tablature=${showTabs===true} key=${key}\\n notes `\n        + notes\n        + '\\n';\n\n      vextab.parse(vexTabString);\n\n      //vextab.parse(\"tabstave\\n\" + \"\\n\")\n      // Render notation onto canvas.\n\n      artist.render(renderer);\n      currentX += artist.width - 18;\n  } catch (e) {\n      console.log(e);\n  }\n}\n\nfunction getStaveNotes(scoreElement){\n  const result = [];\n  for(var index in scoreElement.children[0].children){\n    const child = scoreElement.children[0].children[index];\n    const className = child.className;\n    if(className && className.baseVal === 'vf-stavenote'){\n      result.push(child);\n    }\n  }\n  return result;\n}\n\nfunction getTabNumbers(scoreElement){\n  const result = [];\n  for(var index in scoreElement.children[0].children){\n    const child = scoreElement.children[0].children[index];\n    const nodeName = child.nodeName;\n    if(nodeName && nodeName === 'text' && child.innerHTML.trim()){\n      result.push(child);\n    }\n  }\n  return result;\n}\n\nfunction setBarPositions(bars, notes, noteShapes){\n  // sets position of bar, unless allready set\n  bars.forEach(bar => {\n    if(!bar.position){\n      const firstNote = notes.find(n => n.at >= bar.start);\n      if(firstNote){\n        bar.firstNote = firstNote;\n        const noteShape = noteShapes[firstNote.scoreChildNumber];\n        bar.noteShape = noteShape;\n        if(noteShape){\n          const noteBBox = noteShape.getBBox();\n          bar.position = (noteBBox.x + noteBBox.width) - 60;\n          //-60 is arbitrary, but seems a good approximatio\n          //ideally we should look for the bar separator shapes\n        }\n      }\n    }\n  });\n  //reset first bar so it always shows the entire signature\n  bars[0].position = 0;\n}\n\nfunction setTablatureFont(tabNotes){\n  tabNotes.forEach((tabChild) => {\n    tabChild.style.fontFamily = \"Lato\";\n    tabChild.style.fontWeight = \"bold\";\n  });\n}\n\nvar logged = false;\nfunction setNoteColor(scoreElement, note, color, fontWeight, staveNotes, tabNumbers){\n  let noteChild;\n  let tabChild;\n  try{\n    noteChild = staveNotes[note.scoreChildNumber];\n\n\n    const noteShapes = noteChild.children[0].children;\n\n    Array.from(noteShapes).forEach(noteShape=>{\n      if(!logged){\n        logged = true;\n      }\n      noteShape.children[noteShape.children.length -1].style.fill = color;\n    });\n\n    if(note.tabChildNumber > 0){\n      //Rests have no tab\n      tabChild = tabNumbers[note.tabChildNumber || note.scoreChildNumber];\n      tabChild.style.fontWeight = fontWeight;\n      tabChild.style.color = color;\n      tabChild.style.fill  = color;\n    }\n\n  }catch(exc){\n    //console.log('could not set note color', noteChild, note.scoreChildNumber, color, exc);\n  }\n\n}\n\nfunction normalizeNote(scoreElement, note, staveNotes, tabNumbers){\n  setNoteColor(scoreElement, note, 'black', 'bold', staveNotes, tabNumbers);\n}\n\nfunction normalizeNotes(scoreElement, notes, staveNotes, tabNumbers){\n  if(notes){\n    notes.forEach(n => normalizeNote(scoreElement, n, staveNotes, tabNumbers));\n  }\n}\n\nfunction highlightNote(scoreElement, note, staveNotes, tabNumbers){\n  setNoteColor(scoreElement, note, '#E5C200', 'bold', staveNotes, tabNumbers);\n}\n\nfunction highlightNotes(scoreElement, notes, staveNotes, tabNumbers){\n  if(notes){\n    notes.forEach(n => highlightNote(scoreElement, n, staveNotes, tabNumbers));\n  }\n}\n\n// TODO: can we organize the notes so that lookup is easier?\n// Notes do overlap, so that makes it a bit harder.\n// Maybe add every not to an arry per second (time / 1000)?\n\nlet notesBySecond = {};\nfunction groupNotesBySecond(notes) {\n  notes.forEach((note) => {\n    const noteStartSecond = Math.floor(note.at / 1000) -1;\n    const noteEndSecond = Math.floor(note.to / 1000) + 1;\n    for(let i=noteStartSecond; i < noteEndSecond; i++) {\n      if (!notesBySecond[i]) {\n        notesBySecond[i] = [];\n      }\n      notesBySecond[i].push(note);\n    }\n  });\n}\n\nfunction getCurrentNotes(notes, time){\n  const noteBySecondIndex = Math.floor(time / 1000);\n  if(notesBySecond[noteBySecondIndex]){\n    return notesBySecond[noteBySecondIndex].filter(n => n.at <= time && n.to >= time );\n  }\n  return [];\n}\n\nlet staveNotes = null;\nlet tabNumbers = null;\nlet currentPosition = 0;\nlet currentNotes = null;\nlet totalLength = 0;\nlet viewportWidth = 0;\nlet scoreElement, scoreWrapper;\nlet animating = false;\nlet frameCounter = 0;\nlet positionToPxRatio = 0;\nlet previousBar;\n\nclass ScoreWrapper extends React.Component{\n  init(){\n    reset();\n    //calc bar widths\n    calculateBarWidths(this.props.bars, this.props.fullBarDuration);\n    //render each bar\n    document.getElementById('score-container').innerHTML = '';\n\n    const notes = this.props.bars.forEach((bar) => {\n      //if(bar.number < 3){\n        showVexTab('#score-container',\n          this.props.tabTuning, this.props.tabKey, this.props.timeSig,\n          bar.notes, this.props.bars.length,\n          this.props.showNotation, this.props.showTabs,\n          this.props.beatsPerBar, bar.number, this.props.fullBarDuration,\n          bar);\n      //}\n    });\n\n    scoreElement = document.getElementById('score-container');\n    scoreWrapper = document.getElementById('score-wrapper');\n\n    if(!staveNotes){\n      staveNotes = getStaveNotes(scoreElement);\n      tabNumbers = getTabNumbers(scoreElement);\n\n      setTablatureFont(tabNumbers);\n      setBarPositions(this.props.bars, this.props.notes, staveNotes);\n    }\n\n    groupNotesBySecond(this.props.notes);\n\n    totalLength = scoreElement.clientWidth;\n    viewportWidth = document.body.offsetWidth;\n\n    const maxPosition = this.props.bars[this.props.bars.length -1].end;\n    const lastNoteShape = staveNotes[staveNotes.length -1 ];\n    const lastNoteShapeBBox = lastNoteShape.getBBox();\n    //last note compared to total duration\n    positionToPxRatio = lastNoteShapeBBox.x / maxPosition;\n\n    //start score animation\n    animating = true;\n    //animateScore(this);\n    window.removeEventListener('resize', this.onWindowResize);\n    window.addEventListener('resize', this.onWindowResize);\n  }\n\n  onTimeChange({currentTime, currentBar, tempoFactor}){\n    if(!currentBar) {\n      return;\n    }\n    const focusPoint = (viewportWidth * 0.33);\n    const nextBar = this.props.bars[currentBar.number + 1];\n    let newPosition = 0;\n    if(nextBar){\n      newPosition = (currentBar.position + ((nextBar.position - currentBar.position) / 2)) - focusPoint;\n    } else {\n      newPosition = currentBar.position - focusPoint;\n    }\n\n    if(newPosition < focusPoint){\n      newPosition = 0;\n    }\n\n    if(currentBar)\n    {\n      if(newPosition !== currentPosition){\n        const barDuration = currentBar.end - currentBar.start\n        const barDurationInSeconds = (barDuration / tempoFactor) / 1000;\n\n        let performTransition = true;\n        if(newPosition < currentPosition) {\n          // moving back in time\n          performTransition = false;\n        }\n        if(!previousBar || (previousBar.number != currentBar.number -1)){\n          // not moving to next bar.\n          performTransition = false;\n        }\n\n        if(performTransition){\n          scoreElement.style.transition = `transform ${barDurationInSeconds}s linear`;\n        } else {\n          scoreElement.style.transition = `transform 0s linear`;\n        }\n        scoreElement.style.transform = `translate3d(${-newPosition}px, 0px, 0)`;\n        currentPosition = newPosition;\n      }\n    }\n    previousBar = currentBar;\n    normalizeNotes(scoreElement, currentNotes, staveNotes, tabNumbers);\n    currentNotes = getCurrentNotes(this.props.notes, currentTime);\n    highlightNotes(scoreElement, currentNotes, staveNotes, tabNumbers);\n  }\n\n  componentDidMount(){\n    this.props.timer.addHandler(this);\n    this.init();\n\n  }\n  componentDidUpdate(props){\n    if(props.showTabs != this.props.showTabs ||\n      props.showNotation != this.props.showNotation ||\n      this.props.tabKey != props.tabKey ||\n      this.props.adgcTuning != props.adgcTuning ){\n      //reinit\n      staveNotes = null;\n      this.init();\n    }\n  }\n\n  componentWillUnmount(){\n    this.props.timer.removeHandler(this);\n    animating = false;\n    window.removeEventListener('resize', this.onWindowResize);\n  }\n\n  onWindowResize(){\n    //viewportwidth will be changed\n    viewportWidth = document.body.offsetWidth;\n  }\n\n\n  render(){\n    const SCORE_LINE_HEIGHT = 220;\n    const pageWidth = document.body.offsetWidth;\n    return (<div id={'score-wrapper'} style={{width: pageWidth}} >\n        <div id='score-container' style={{height:SCORE_LINE_HEIGHT}}>\n        </div>\n      </div>);\n  }\n}\n\nScoreWrapper.propTypes = {\n  timer: PropTypes.object.isRequired,\n  bars: PropTypes.array.isRequired,\n  fromBar: PropTypes.object.isRequired,\n  toBar: PropTypes.object.isRequired,\n  tabTuning: PropTypes.string.isRequired,\n  tabKey: PropTypes.string.isRequired,\n  beatsPerBar: PropTypes.number.isRequired,\n  notes: PropTypes.array.isRequired,\n  showNotation: PropTypes.bool.isRequired,\n  showTabs: PropTypes.bool.isRequired,\n  currentKey: PropTypes.object,\n  fullBarDuration: PropTypes.number\n}\nScoreWrapper.displayName = 'ScoreWrapper';\n\nexport default ScoreWrapper;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\n\nclass InfoTrack extends React.Component{\n  constructor(){\n    super();\n    this.state = {currentBar: null}\n  }\n  onTimeChange({currentBar}){\n    if(this.state.currentBar !== currentBar){\n      this.setState({currentBar});\n    }\n  }\n  componentDidMount(){\n    this.props.timer.addHandler(this);\n  }\n  getCurrentInfoTrack(){\n    return this.state.currentBar && this.state.currentBar.infoTrack ?\n      this.state.currentBar.infoTrack : [];\n  }\n  render(){\n    if(this.state.currentBar){\n      return (<div className={'info-track'}>\n        {this.getCurrentInfoTrack().map(info => <p>{info.text}</p>)}\n      </div>)\n    }\n  }\n}\n\nInfoTrack.displayName = 'InfoTrack';\nInfoTrack.propTypes = {\n}\nexport default InfoTrack;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass StripButton extends React.Component{\n  constructor(){\n    super();\n    this._onClick = this._onClick.bind(this);\n  }\n  _onClick(e){\n    e.preventDefault();\n     this.props.onClick(e);\n  }\n  getIconComponent(){\n    if(this.props.iconText){\n      return (<span className={'button-text'}>{this.props.iconText}</span>);\n    }else{\n      return (<span><i className={\"fa \" + this.props.icon}></i></span>);\n    }\n\n  }\n  render(){\n    let openClass = this.props.isOpen ? ' open ' : '';\n    let disabledClass = this.props.disabled ? ' disabled' : '';\n    return (<li className={'borderRight dropup' + disabledClass}>\n      <a className=\"dropdown-toggle\" onClick={this._onClick}>\n        {this.getIconComponent()}{this.props.title}\n      </a>\n      <div className={'dropdownMenu ' + openClass + ' ' + this.props.dropDownClassName}>\n        {this.props.children}\n      </div>\n    </li>);\n  }\n}\nStripButton.displayName = \"StripButton\";\nStripButton.propTypes = {\n  icon: PropTypes.string,\n  iconText: PropTypes.string,\n  title: PropTypes.string,\n  dropDownClassName: PropTypes.string,\n  onClick: PropTypes.func.isRequired,\n  isOpen: PropTypes.bool\n}\n\nexport default StripButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\n\nclass VisibilityButton extends React.Component{\n  constructor(){\n    super();\n    this._onVisibilityOptionChange = this._onVisibilityOptionChange.bind(this);\n  }\n  _onVisibilityOptionChange(field){\n    const newVisibility = Object.assign({}, this.props.visibility);\n    newVisibility[field] = !newVisibility[field];\n    this.props.onVisibilityChanged(newVisibility);\n  }\n  render(){\n    return (<StripButton\n              onClick={() => this.props.onClick(\"VisibilityButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"visibility\"\n              title=\"View\"\n              icon=\"fa-eye\">\n        <ul >\n          <li>\n          <span className=\"spanLabel\">Fretboard:</span>\n          <label className=\"switch\">\n            <input type=\"checkbox\" checked={this.props.visibility.fretboard} onChange={()=>this._onVisibilityOptionChange('fretboard')}/>\n            <span className=\"slider round\"></span>\n          </label>\n          </li>\n          <li>\n          <span className=\"spanLabel\">Tablature:</span>\n          <label className=\"switch\">\n            <input type=\"checkbox\" checked={this.props.visibility.tablature} onChange={()=>this._onVisibilityOptionChange('tablature')}/>\n            <span className=\"slider round\"></span>\n          </label>\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nVisibilityButton.propTypes = {\n  visibility: PropTypes.shape(),\n  onVisibilityChanged: PropTypes.func,\n}\n\nexport default VisibilityButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\n\nconst canPageFuns = {\n  prev: (fromBar, toBar, bars)=>{\n    const barCount = (toBar.number - fromBar.number) + 1;\n    return fromBar.number - barCount > 0;\n  },\n  next: (fromBar, toBar, bars)=>{\n    const barCount = (toBar.number - fromBar.number) + 1;\n    const lastBar = bars[bars.length - 1];\n\n    return (lastBar.number - toBar.number) >= barCount;\n  }\n}\n\nfunction getPagingLink(that, direction, fromBar, toBar, bars){\n\n  const linkTexts = {'next': 'Next', 'prev' : 'Previous'}\n  const iconsClassNames = {'next': 'fa fa-fast-forward', 'prev': 'fa fa-fast-backward'};\n  const handlers = {'next': that._moveNext, 'prev': that._movePrevious};\n\n  let className = iconsClassNames[direction];;\n  let handler = handlers[direction];\n  if(!canPageFuns[direction](fromBar, toBar, bars)){\n    className += ' disabled';\n    handler = () => {};\n  }\n\n  return (<a onClick = {handler}>\n      <span>\n        <i className = {className} />\n      </span>\n    </a>);\n}\n\nfunction pauseRadioElement(that, name, title){\n  return (<label className=\"pauseOptionLabel\">\n      <input\n        type=\"radio\"\n        className=\"loop-radio-button\"\n        checked={that.props.pauseOption === name}\n        onChange={() => that.props.onPauseOptionChanged(name)}/>\n      {title}\n    </label>);\n}\n\nclass LoopButton extends React.Component{\n  constructor(){\n    super();\n    this._fromBarChanged = this._fromBarChanged.bind(this);\n    this._toBarChanged = this._toBarChanged.bind(this);\n    this._movePrevious = this._movePrevious.bind(this);\n    this._moveNext = this._moveNext.bind(this);\n  }\n\n  _fromBarChanged(e){\n    const bars = this.props.score.getBars();\n    const bar = bars.find(b => b.number === parseInt(e.target.value, 10));\n    this.props.onLoopChanged({ fromBar: bar });\n  }\n\n  _toBarChanged(e){\n    const bars = this.props.score.getBars();\n    const bar = bars.find(b => b.number === parseInt(e.target.value, 10));\n    this.props.onLoopChanged({ toBar: bar });\n  }\n\n  _movePrevious(ev){\n    const bars = this.props.score.getBars();\n    const barCount = (this.props.toBar.number - this.props.fromBar.number) + 1;\n    const newFromBar = bars[(this.props.fromBar.number - barCount) -1];\n    const newToBar = bars[(this.props.toBar.number - barCount) -1];\n    this.props.onLoopChanged({fromBar: newFromBar, toBar: newToBar});\n\n    ev.preventDefault();\n  }\n\n  _moveNext(ev){\n    const bars = this.props.score.getBars();\n    const barCount = (this.props.toBar.number - this.props.fromBar.number) + 1;\n    const newFromBar = bars[(this.props.fromBar.number + barCount) -1];\n    const newToBar = bars[(this.props.toBar.number + barCount) -1];\n    this.props.onLoopChanged({fromBar: newFromBar, toBar: newToBar});\n\n    ev.preventDefault();\n  }\n  render(){\n    const bars = this.props.score.getBars();\n    const barsTo = bars.filter(b => b.number >= this.props.fromBar.number);\n\n    let nextLink = null;\n    let prevLink = null;\n\n    if(this.props.fromBar && this.props.toBar)\n    {\n      nextLink = getPagingLink(this, 'next', this.props.fromBar, this.props.toBar, bars);\n      prevLink = getPagingLink(this, 'prev', this.props.fromBar, this.props.toBar, bars);\n    }\n\n    return (\n      <StripButton\n              onClick={() => this.props.onClick(\"LoopButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"loop\"\n              title=\"Loop\"\n              icon=\"fa-undo\">\n        <ul>\n          <li className=\"loop-container\">\n            <div className=\"loop-config-wrapper\">\n              <div className=\"from-bar-to-bar\">\n                  <div>\n                    <span className=\"spanLabel\">{'Start at bar'}</span>\n                    <select\n                      name=\"from-bar\"\n                      value={this.props.fromBar.number}\n                      onChange={this._fromBarChanged}>\n                      {bars.map(b => <option key={b.number} value={b.number}>{b.name}</option>)}\n                    </select>\n                    <span className=\"spanLabel\">{'End at bar:'}</span>\n                    <select\n                      name=\"to-bar\"\n                      value={this.props.toBar.number}\n                      onChange={this._toBarChanged}>\n                      {barsTo.map(b => <option key={b.number} value={b.number}>{b.name}</option>)}\n                    </select>\n                  </div>\n              </div>\n              <div className=\"loop-pause\">\n                <div className=\"loop-pause-title\">\n                  <span className=\"spanLabel\">Add rest</span>\n                </div>\n                <div className='loop-pause-options'>\n                  {pauseRadioElement(this, 'none', 'No Rest')}\n                  {pauseRadioElement(this, 'eight', 'Eight')}\n                  {pauseRadioElement(this, 'quarter', 'Quarter')}\n                  {pauseRadioElement(this, 'half', 'Half')}\n                </div>\n              </div>\n            </div>\n            <div className=\"prev-next\">\n              {prevLink}\n              {nextLink}\n            </div>\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nLoopButton.displayName = 'LoopButton';\nLoopButton.propTypes = {\n  barConfig: PropTypes.object,\n  pauseOption: PropTypes.string,\n  onPauseOptionChanged: PropTypes.func.isRequired,\n  onLoopChanged: PropTypes.func.isRequired,\n}\nexport default LoopButton;","import _extends from 'babel-runtime/helpers/extends';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\n/* eslint-disable react/prop-types */\nimport React from 'react';\n\nvar Track = function Track(props) {\n  var _ref, _ref2;\n\n  var className = props.className,\n      included = props.included,\n      vertical = props.vertical,\n      offset = props.offset,\n      length = props.length,\n      style = props.style,\n      reverse = props.reverse;\n\n  var positonStyle = vertical ? (_ref = {}, _defineProperty(_ref, reverse ? 'top' : 'bottom', offset + '%'), _defineProperty(_ref, reverse ? 'bottom' : 'top', 'auto'), _defineProperty(_ref, 'height', length + '%'), _ref) : (_ref2 = {}, _defineProperty(_ref2, reverse ? 'right' : 'left', offset + '%'), _defineProperty(_ref2, reverse ? 'left' : 'right', 'auto'), _defineProperty(_ref2, 'width', length + '%'), _ref2);\n\n  var elStyle = _extends({}, style, positonStyle);\n  return included ? React.createElement('div', { className: className, style: elStyle }) : null;\n};\n\nexport default Track;","import addDOMEventListener from 'add-dom-event-listener';\nimport ReactDOM from 'react-dom';\nexport default function addEventListenerWrap(target, eventType, cb, option) {\n  /* eslint camelcase: 2 */\n  var callback = ReactDOM.unstable_batchedUpdates ? function run(e) {\n    ReactDOM.unstable_batchedUpdates(cb, e);\n  } : cb;\n  return addDOMEventListener(target, eventType, callback, option);\n}","import _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _extends from 'babel-runtime/helpers/extends';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport warning from 'warning';\n\nvar calcPoints = function calcPoints(vertical, marks, dots, step, min, max) {\n  warning(dots ? step > 0 : true, '`Slider[step]` should be a positive number in order to make Slider[dots] work.');\n  var points = Object.keys(marks).map(parseFloat).sort(function (a, b) {\n    return a - b;\n  });\n  if (dots && step) {\n    for (var i = min; i <= max; i += step) {\n      if (points.indexOf(i) === -1) {\n        points.push(i);\n      }\n    }\n  }\n  return points;\n};\n\nvar Steps = function Steps(_ref) {\n  var prefixCls = _ref.prefixCls,\n      vertical = _ref.vertical,\n      reverse = _ref.reverse,\n      marks = _ref.marks,\n      dots = _ref.dots,\n      step = _ref.step,\n      included = _ref.included,\n      lowerBound = _ref.lowerBound,\n      upperBound = _ref.upperBound,\n      max = _ref.max,\n      min = _ref.min,\n      dotStyle = _ref.dotStyle,\n      activeDotStyle = _ref.activeDotStyle;\n\n  var range = max - min;\n  var elements = calcPoints(vertical, marks, dots, step, min, max).map(function (point) {\n    var _classNames;\n\n    var offset = Math.abs(point - min) / range * 100 + '%';\n\n    var isActived = !included && point === upperBound || included && point <= upperBound && point >= lowerBound;\n    var style = vertical ? _extends({}, dotStyle, _defineProperty({}, reverse ? 'top' : 'bottom', offset)) : _extends({}, dotStyle, _defineProperty({}, reverse ? 'right' : 'left', offset));\n    if (isActived) {\n      style = _extends({}, style, activeDotStyle);\n    }\n\n    var pointClassName = classNames((_classNames = {}, _defineProperty(_classNames, prefixCls + '-dot', true), _defineProperty(_classNames, prefixCls + '-dot-active', isActived), _defineProperty(_classNames, prefixCls + '-dot-reverse', reverse), _classNames));\n\n    return React.createElement('span', { className: pointClassName, style: style, key: point });\n  });\n\n  return React.createElement(\n    'div',\n    { className: prefixCls + '-step' },\n    elements\n  );\n};\n\nSteps.propTypes = {\n  prefixCls: PropTypes.string,\n  activeDotStyle: PropTypes.object,\n  dotStyle: PropTypes.object,\n  min: PropTypes.number,\n  max: PropTypes.number,\n  upperBound: PropTypes.number,\n  lowerBound: PropTypes.number,\n  included: PropTypes.bool,\n  dots: PropTypes.bool,\n  step: PropTypes.number,\n  marks: PropTypes.object,\n  vertical: PropTypes.bool,\n  reverse: PropTypes.bool\n};\n\nexport default Steps;","import _extends from 'babel-runtime/helpers/extends';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nvar Marks = function Marks(_ref) {\n  var className = _ref.className,\n      vertical = _ref.vertical,\n      reverse = _ref.reverse,\n      marks = _ref.marks,\n      included = _ref.included,\n      upperBound = _ref.upperBound,\n      lowerBound = _ref.lowerBound,\n      max = _ref.max,\n      min = _ref.min,\n      onClickLabel = _ref.onClickLabel;\n\n  var marksKeys = Object.keys(marks);\n\n  var range = max - min;\n  var elements = marksKeys.map(parseFloat).sort(function (a, b) {\n    return a - b;\n  }).map(function (point) {\n    var _classNames;\n\n    var markPoint = marks[point];\n    var markPointIsObject = typeof markPoint === 'object' && !React.isValidElement(markPoint);\n    var markLabel = markPointIsObject ? markPoint.label : markPoint;\n    if (!markLabel && markLabel !== 0) {\n      return null;\n    }\n\n    var isActive = !included && point === upperBound || included && point <= upperBound && point >= lowerBound;\n    var markClassName = classNames((_classNames = {}, _defineProperty(_classNames, className + '-text', true), _defineProperty(_classNames, className + '-text-active', isActive), _classNames));\n\n    var bottomStyle = _defineProperty({\n      marginBottom: '-50%'\n    }, reverse ? 'top' : 'bottom', (point - min) / range * 100 + '%');\n\n    var leftStyle = _defineProperty({\n      transform: 'translateX(-50%)',\n      msTransform: 'translateX(-50%)'\n    }, reverse ? 'right' : 'left', reverse ? (point - min / 4) / range * 100 + '%' : (point - min) / range * 100 + '%');\n\n    var style = vertical ? bottomStyle : leftStyle;\n    var markStyle = markPointIsObject ? _extends({}, style, markPoint.style) : style;\n    return React.createElement(\n      'span',\n      {\n        className: markClassName,\n        style: markStyle,\n        key: point,\n        onMouseDown: function onMouseDown(e) {\n          return onClickLabel(e, point);\n        },\n        onTouchStart: function onTouchStart(e) {\n          return onClickLabel(e, point);\n        }\n      },\n      markLabel\n    );\n  });\n\n  return React.createElement(\n    'div',\n    { className: className },\n    elements\n  );\n};\n\nMarks.propTypes = {\n  className: PropTypes.string,\n  vertical: PropTypes.bool,\n  reverse: PropTypes.bool,\n  marks: PropTypes.object,\n  included: PropTypes.bool,\n  upperBound: PropTypes.number,\n  lowerBound: PropTypes.number,\n  max: PropTypes.number,\n  min: PropTypes.number,\n  onClickLabel: PropTypes.func\n};\n\nexport default Marks;","import _extends from 'babel-runtime/helpers/extends';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport addEventListener from 'rc-util/es/Dom/addEventListener';\n\nvar Handle = function (_React$Component) {\n  _inherits(Handle, _React$Component);\n\n  function Handle() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Handle);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Handle.__proto__ || Object.getPrototypeOf(Handle)).call.apply(_ref, [this].concat(args))), _this), _this.state = {\n      clickFocused: false\n    }, _this.setHandleRef = function (node) {\n      _this.handle = node;\n    }, _this.handleMouseUp = function () {\n      if (document.activeElement === _this.handle) {\n        _this.setClickFocus(true);\n      }\n    }, _this.handleMouseDown = function () {\n      // fix https://github.com/ant-design/ant-design/issues/15324\n      _this.focus();\n    }, _this.handleBlur = function () {\n      _this.setClickFocus(false);\n    }, _this.handleKeyDown = function () {\n      _this.setClickFocus(false);\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Handle, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      // mouseup won't trigger if mouse moved out of handle,\n      // so we listen on document here.\n      this.onMouseUpListener = addEventListener(document, 'mouseup', this.handleMouseUp);\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      if (this.onMouseUpListener) {\n        this.onMouseUpListener.remove();\n      }\n    }\n  }, {\n    key: 'setClickFocus',\n    value: function setClickFocus(focused) {\n      this.setState({ clickFocused: focused });\n    }\n  }, {\n    key: 'clickFocus',\n    value: function clickFocus() {\n      this.setClickFocus(true);\n      this.focus();\n    }\n  }, {\n    key: 'focus',\n    value: function focus() {\n      this.handle.focus();\n    }\n  }, {\n    key: 'blur',\n    value: function blur() {\n      this.handle.blur();\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _ref2, _ref3;\n\n      var _props = this.props,\n          prefixCls = _props.prefixCls,\n          vertical = _props.vertical,\n          reverse = _props.reverse,\n          offset = _props.offset,\n          style = _props.style,\n          disabled = _props.disabled,\n          min = _props.min,\n          max = _props.max,\n          value = _props.value,\n          tabIndex = _props.tabIndex,\n          restProps = _objectWithoutProperties(_props, ['prefixCls', 'vertical', 'reverse', 'offset', 'style', 'disabled', 'min', 'max', 'value', 'tabIndex']);\n\n      var className = classNames(this.props.className, _defineProperty({}, prefixCls + '-handle-click-focused', this.state.clickFocused));\n      var positionStyle = vertical ? (_ref2 = {}, _defineProperty(_ref2, reverse ? 'top' : 'bottom', offset + '%'), _defineProperty(_ref2, reverse ? 'bottom' : 'top', 'auto'), _defineProperty(_ref2, 'transform', 'translateY(+50%)'), _ref2) : (_ref3 = {}, _defineProperty(_ref3, reverse ? 'right' : 'left', offset + '%'), _defineProperty(_ref3, reverse ? 'left' : 'right', 'auto'), _defineProperty(_ref3, 'transform', 'translateX(' + (reverse ? '+' : '-') + '50%)'), _ref3);\n      var elStyle = _extends({}, style, positionStyle);\n\n      var _tabIndex = tabIndex || 0;\n      if (disabled || tabIndex === null) {\n        _tabIndex = null;\n      }\n\n      return React.createElement('div', _extends({\n        ref: this.setHandleRef,\n        tabIndex: _tabIndex\n      }, restProps, {\n        className: className,\n        style: elStyle,\n        onBlur: this.handleBlur,\n        onKeyDown: this.handleKeyDown,\n        onMouseDown: this.handleMouseDown\n\n        // aria attribute\n        , role: 'slider',\n        'aria-valuemin': min,\n        'aria-valuemax': max,\n        'aria-valuenow': value,\n        'aria-disabled': !!disabled\n      }));\n    }\n  }]);\n\n  return Handle;\n}(React.Component);\n\nexport default Handle;\n\n\nHandle.propTypes = {\n  prefixCls: PropTypes.string,\n  className: PropTypes.string,\n  vertical: PropTypes.bool,\n  offset: PropTypes.number,\n  style: PropTypes.object,\n  disabled: PropTypes.bool,\n  min: PropTypes.number,\n  max: PropTypes.number,\n  value: PropTypes.number,\n  tabIndex: PropTypes.number,\n  reverse: PropTypes.bool\n};","/**\n * @ignore\n * some key-codes definition and utils from closure-library\n * @author yiminghe@gmail.com\n */\nvar KeyCode = {\n  /**\n   * MAC_ENTER\n   */\n  MAC_ENTER: 3,\n\n  /**\n   * BACKSPACE\n   */\n  BACKSPACE: 8,\n\n  /**\n   * TAB\n   */\n  TAB: 9,\n\n  /**\n   * NUMLOCK on FF/Safari Mac\n   */\n  NUM_CENTER: 12,\n\n  /**\n   * ENTER\n   */\n  ENTER: 13,\n\n  /**\n   * SHIFT\n   */\n  SHIFT: 16,\n\n  /**\n   * CTRL\n   */\n  CTRL: 17,\n\n  /**\n   * ALT\n   */\n  ALT: 18,\n\n  /**\n   * PAUSE\n   */\n  PAUSE: 19,\n\n  /**\n   * CAPS_LOCK\n   */\n  CAPS_LOCK: 20,\n\n  /**\n   * ESC\n   */\n  ESC: 27,\n\n  /**\n   * SPACE\n   */\n  SPACE: 32,\n\n  /**\n   * PAGE_UP\n   */\n  PAGE_UP: 33,\n\n  /**\n   * PAGE_DOWN\n   */\n  PAGE_DOWN: 34,\n\n  /**\n   * END\n   */\n  END: 35,\n\n  /**\n   * HOME\n   */\n  HOME: 36,\n\n  /**\n   * LEFT\n   */\n  LEFT: 37,\n\n  /**\n   * UP\n   */\n  UP: 38,\n\n  /**\n   * RIGHT\n   */\n  RIGHT: 39,\n\n  /**\n   * DOWN\n   */\n  DOWN: 40,\n\n  /**\n   * PRINT_SCREEN\n   */\n  PRINT_SCREEN: 44,\n\n  /**\n   * INSERT\n   */\n  INSERT: 45,\n\n  /**\n   * DELETE\n   */\n  DELETE: 46,\n\n  /**\n   * ZERO\n   */\n  ZERO: 48,\n\n  /**\n   * ONE\n   */\n  ONE: 49,\n\n  /**\n   * TWO\n   */\n  TWO: 50,\n\n  /**\n   * THREE\n   */\n  THREE: 51,\n\n  /**\n   * FOUR\n   */\n  FOUR: 52,\n\n  /**\n   * FIVE\n   */\n  FIVE: 53,\n\n  /**\n   * SIX\n   */\n  SIX: 54,\n\n  /**\n   * SEVEN\n   */\n  SEVEN: 55,\n\n  /**\n   * EIGHT\n   */\n  EIGHT: 56,\n\n  /**\n   * NINE\n   */\n  NINE: 57,\n\n  /**\n   * QUESTION_MARK\n   */\n  QUESTION_MARK: 63,\n\n  /**\n   * A\n   */\n  A: 65,\n\n  /**\n   * B\n   */\n  B: 66,\n\n  /**\n   * C\n   */\n  C: 67,\n\n  /**\n   * D\n   */\n  D: 68,\n\n  /**\n   * E\n   */\n  E: 69,\n\n  /**\n   * F\n   */\n  F: 70,\n\n  /**\n   * G\n   */\n  G: 71,\n\n  /**\n   * H\n   */\n  H: 72,\n\n  /**\n   * I\n   */\n  I: 73,\n\n  /**\n   * J\n   */\n  J: 74,\n\n  /**\n   * K\n   */\n  K: 75,\n\n  /**\n   * L\n   */\n  L: 76,\n\n  /**\n   * M\n   */\n  M: 77,\n\n  /**\n   * N\n   */\n  N: 78,\n\n  /**\n   * O\n   */\n  O: 79,\n\n  /**\n   * P\n   */\n  P: 80,\n\n  /**\n   * Q\n   */\n  Q: 81,\n\n  /**\n   * R\n   */\n  R: 82,\n\n  /**\n   * S\n   */\n  S: 83,\n\n  /**\n   * T\n   */\n  T: 84,\n\n  /**\n   * U\n   */\n  U: 85,\n\n  /**\n   * V\n   */\n  V: 86,\n\n  /**\n   * W\n   */\n  W: 87,\n\n  /**\n   * X\n   */\n  X: 88,\n\n  /**\n   * Y\n   */\n  Y: 89,\n\n  /**\n   * Z\n   */\n  Z: 90,\n\n  /**\n   * META\n   */\n  META: 91,\n\n  /**\n   * WIN_KEY_RIGHT\n   */\n  WIN_KEY_RIGHT: 92,\n\n  /**\n   * CONTEXT_MENU\n   */\n  CONTEXT_MENU: 93,\n\n  /**\n   * NUM_ZERO\n   */\n  NUM_ZERO: 96,\n\n  /**\n   * NUM_ONE\n   */\n  NUM_ONE: 97,\n\n  /**\n   * NUM_TWO\n   */\n  NUM_TWO: 98,\n\n  /**\n   * NUM_THREE\n   */\n  NUM_THREE: 99,\n\n  /**\n   * NUM_FOUR\n   */\n  NUM_FOUR: 100,\n\n  /**\n   * NUM_FIVE\n   */\n  NUM_FIVE: 101,\n\n  /**\n   * NUM_SIX\n   */\n  NUM_SIX: 102,\n\n  /**\n   * NUM_SEVEN\n   */\n  NUM_SEVEN: 103,\n\n  /**\n   * NUM_EIGHT\n   */\n  NUM_EIGHT: 104,\n\n  /**\n   * NUM_NINE\n   */\n  NUM_NINE: 105,\n\n  /**\n   * NUM_MULTIPLY\n   */\n  NUM_MULTIPLY: 106,\n\n  /**\n   * NUM_PLUS\n   */\n  NUM_PLUS: 107,\n\n  /**\n   * NUM_MINUS\n   */\n  NUM_MINUS: 109,\n\n  /**\n   * NUM_PERIOD\n   */\n  NUM_PERIOD: 110,\n\n  /**\n   * NUM_DIVISION\n   */\n  NUM_DIVISION: 111,\n\n  /**\n   * F1\n   */\n  F1: 112,\n\n  /**\n   * F2\n   */\n  F2: 113,\n\n  /**\n   * F3\n   */\n  F3: 114,\n\n  /**\n   * F4\n   */\n  F4: 115,\n\n  /**\n   * F5\n   */\n  F5: 116,\n\n  /**\n   * F6\n   */\n  F6: 117,\n\n  /**\n   * F7\n   */\n  F7: 118,\n\n  /**\n   * F8\n   */\n  F8: 119,\n\n  /**\n   * F9\n   */\n  F9: 120,\n\n  /**\n   * F10\n   */\n  F10: 121,\n\n  /**\n   * F11\n   */\n  F11: 122,\n\n  /**\n   * F12\n   */\n  F12: 123,\n\n  /**\n   * NUMLOCK\n   */\n  NUMLOCK: 144,\n\n  /**\n   * SEMICOLON\n   */\n  SEMICOLON: 186,\n\n  /**\n   * DASH\n   */\n  DASH: 189,\n\n  /**\n   * EQUALS\n   */\n  EQUALS: 187,\n\n  /**\n   * COMMA\n   */\n  COMMA: 188,\n\n  /**\n   * PERIOD\n   */\n  PERIOD: 190,\n\n  /**\n   * SLASH\n   */\n  SLASH: 191,\n\n  /**\n   * APOSTROPHE\n   */\n  APOSTROPHE: 192,\n\n  /**\n   * SINGLE_QUOTE\n   */\n  SINGLE_QUOTE: 222,\n\n  /**\n   * OPEN_SQUARE_BRACKET\n   */\n  OPEN_SQUARE_BRACKET: 219,\n\n  /**\n   * BACKSLASH\n   */\n  BACKSLASH: 220,\n\n  /**\n   * CLOSE_SQUARE_BRACKET\n   */\n  CLOSE_SQUARE_BRACKET: 221,\n\n  /**\n   * WIN_KEY\n   */\n  WIN_KEY: 224,\n\n  /**\n   * MAC_FF_META\n   */\n  MAC_FF_META: 224,\n\n  /**\n   * WIN_IME\n   */\n  WIN_IME: 229,\n  // ======================== Function ========================\n\n  /**\n   * whether text and modified key is entered at the same time.\n   */\n  isTextModifyingKeyEvent: function isTextModifyingKeyEvent(e) {\n    var keyCode = e.keyCode;\n\n    if (e.altKey && !e.ctrlKey || e.metaKey || // Function keys don't generate text\n    keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {\n      return false;\n    } // The following keys are quite harmless, even in combination with\n    // CTRL, ALT or SHIFT.\n\n\n    switch (keyCode) {\n      case KeyCode.ALT:\n      case KeyCode.CAPS_LOCK:\n      case KeyCode.CONTEXT_MENU:\n      case KeyCode.CTRL:\n      case KeyCode.DOWN:\n      case KeyCode.END:\n      case KeyCode.ESC:\n      case KeyCode.HOME:\n      case KeyCode.INSERT:\n      case KeyCode.LEFT:\n      case KeyCode.MAC_FF_META:\n      case KeyCode.META:\n      case KeyCode.NUMLOCK:\n      case KeyCode.NUM_CENTER:\n      case KeyCode.PAGE_DOWN:\n      case KeyCode.PAGE_UP:\n      case KeyCode.PAUSE:\n      case KeyCode.PRINT_SCREEN:\n      case KeyCode.RIGHT:\n      case KeyCode.SHIFT:\n      case KeyCode.UP:\n      case KeyCode.WIN_KEY:\n      case KeyCode.WIN_KEY_RIGHT:\n        return false;\n\n      default:\n        return true;\n    }\n  },\n\n  /**\n   * whether character is entered.\n   */\n  isCharacterKey: function isCharacterKey(keyCode) {\n    if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {\n      return true;\n    }\n\n    if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {\n      return true;\n    }\n\n    if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {\n      return true;\n    } // Safari sends zero key code for non-latin characters.\n\n\n    if (window.navigator.userAgent.indexOf('WebKit') !== -1 && keyCode === 0) {\n      return true;\n    }\n\n    switch (keyCode) {\n      case KeyCode.SPACE:\n      case KeyCode.QUESTION_MARK:\n      case KeyCode.NUM_PLUS:\n      case KeyCode.NUM_MINUS:\n      case KeyCode.NUM_PERIOD:\n      case KeyCode.NUM_DIVISION:\n      case KeyCode.SEMICOLON:\n      case KeyCode.DASH:\n      case KeyCode.EQUALS:\n      case KeyCode.COMMA:\n      case KeyCode.PERIOD:\n      case KeyCode.SLASH:\n      case KeyCode.APOSTROPHE:\n      case KeyCode.SINGLE_QUOTE:\n      case KeyCode.OPEN_SQUARE_BRACKET:\n      case KeyCode.BACKSLASH:\n      case KeyCode.CLOSE_SQUARE_BRACKET:\n        return true;\n\n      default:\n        return false;\n    }\n  }\n};\nexport default KeyCode;","import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';\nimport { findDOMNode } from 'react-dom';\nimport keyCode from 'rc-util/es/KeyCode';\n\nexport function isEventFromHandle(e, handles) {\n  try {\n    return Object.keys(handles).some(function (key) {\n      return e.target === findDOMNode(handles[key]);\n    });\n  } catch (error) {\n    return false;\n  }\n}\n\nexport function isValueOutOfRange(value, _ref) {\n  var min = _ref.min,\n      max = _ref.max;\n\n  return value < min || value > max;\n}\n\nexport function isNotTouchEvent(e) {\n  return e.touches.length > 1 || e.type.toLowerCase() === 'touchend' && e.touches.length > 0;\n}\n\nexport function getClosestPoint(val, _ref2) {\n  var marks = _ref2.marks,\n      step = _ref2.step,\n      min = _ref2.min,\n      max = _ref2.max;\n\n  var points = Object.keys(marks).map(parseFloat);\n  if (step !== null) {\n    var maxSteps = Math.floor((max - min) / step);\n    var steps = Math.min((val - min) / step, maxSteps);\n    var closestStep = Math.round(steps) * step + min;\n    points.push(closestStep);\n  }\n  var diffs = points.map(function (point) {\n    return Math.abs(val - point);\n  });\n  return points[diffs.indexOf(Math.min.apply(Math, _toConsumableArray(diffs)))];\n}\n\nexport function getPrecision(step) {\n  var stepString = step.toString();\n  var precision = 0;\n  if (stepString.indexOf('.') >= 0) {\n    precision = stepString.length - stepString.indexOf('.') - 1;\n  }\n  return precision;\n}\n\nexport function getMousePosition(vertical, e) {\n  return vertical ? e.clientY : e.pageX;\n}\n\nexport function getTouchPosition(vertical, e) {\n  return vertical ? e.touches[0].clientY : e.touches[0].pageX;\n}\n\nexport function getHandleCenterPosition(vertical, handle) {\n  var coords = handle.getBoundingClientRect();\n  return vertical ? coords.top + coords.height * 0.5 : window.pageXOffset + coords.left + coords.width * 0.5;\n}\n\nexport function ensureValueInRange(val, _ref3) {\n  var max = _ref3.max,\n      min = _ref3.min;\n\n  if (val <= min) {\n    return min;\n  }\n  if (val >= max) {\n    return max;\n  }\n  return val;\n}\n\nexport function ensureValuePrecision(val, props) {\n  var step = props.step;\n\n  var closestPoint = isFinite(getClosestPoint(val, props)) ? getClosestPoint(val, props) : 0; // eslint-disable-line\n  return step === null ? closestPoint : parseFloat(closestPoint.toFixed(getPrecision(step)));\n}\n\nexport function pauseEvent(e) {\n  e.stopPropagation();\n  e.preventDefault();\n}\n\nexport function calculateNextValue(func, value, props) {\n  var operations = {\n    increase: function increase(a, b) {\n      return a + b;\n    },\n    decrease: function decrease(a, b) {\n      return a - b;\n    }\n  };\n\n  var indexToGet = operations[func](Object.keys(props.marks).indexOf(JSON.stringify(value)), 1);\n  var keyToGet = Object.keys(props.marks)[indexToGet];\n\n  if (props.step) {\n    return operations[func](value, props.step);\n  } else if (!!Object.keys(props.marks).length && !!props.marks[keyToGet]) {\n    return props.marks[keyToGet];\n  }\n  return value;\n}\n\nexport function getKeyboardValueMutator(e, vertical, reverse) {\n  var increase = 'increase';\n  var decrease = 'decrease';\n  var method = increase;\n  switch (e.keyCode) {\n    case keyCode.UP:\n      method = vertical && reverse ? decrease : increase;break;\n    case keyCode.RIGHT:\n      method = !vertical && reverse ? decrease : increase;break;\n    case keyCode.DOWN:\n      method = vertical && reverse ? increase : decrease;break;\n    case keyCode.LEFT:\n      method = !vertical && reverse ? increase : decrease;break;\n\n    case keyCode.END:\n      return function (value, props) {\n        return props.max;\n      };\n    case keyCode.HOME:\n      return function (value, props) {\n        return props.min;\n      };\n    case keyCode.PAGE_UP:\n      return function (value, props) {\n        return value + props.step * 2;\n      };\n    case keyCode.PAGE_DOWN:\n      return function (value, props) {\n        return value - props.step * 2;\n      };\n\n    default:\n      return undefined;\n  }\n  return function (value, props) {\n    return calculateNextValue(method, value, props);\n  };\n}","import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';\nimport _extends from 'babel-runtime/helpers/extends';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _get from 'babel-runtime/helpers/get';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport addEventListener from 'rc-util/es/Dom/addEventListener';\nimport classNames from 'classnames';\nimport warning from 'warning';\nimport Steps from './Steps';\nimport Marks from './Marks';\nimport Handle from '../Handle';\nimport * as utils from '../utils';\n\nfunction noop() {}\n\nexport default function createSlider(Component) {\n  var _class, _temp;\n\n  return _temp = _class = function (_Component) {\n    _inherits(ComponentEnhancer, _Component);\n\n    function ComponentEnhancer(props) {\n      _classCallCheck(this, ComponentEnhancer);\n\n      var _this = _possibleConstructorReturn(this, (ComponentEnhancer.__proto__ || Object.getPrototypeOf(ComponentEnhancer)).call(this, props));\n\n      _this.onMouseDown = function (e) {\n        if (e.button !== 0) {\n          return;\n        }\n\n        var isVertical = _this.props.vertical;\n        var position = utils.getMousePosition(isVertical, e);\n        if (!utils.isEventFromHandle(e, _this.handlesRefs)) {\n          _this.dragOffset = 0;\n        } else {\n          var handlePosition = utils.getHandleCenterPosition(isVertical, e.target);\n          _this.dragOffset = position - handlePosition;\n          position = handlePosition;\n        }\n        _this.removeDocumentEvents();\n        _this.onStart(position);\n        _this.addDocumentMouseEvents();\n      };\n\n      _this.onTouchStart = function (e) {\n        if (utils.isNotTouchEvent(e)) return;\n\n        var isVertical = _this.props.vertical;\n        var position = utils.getTouchPosition(isVertical, e);\n        if (!utils.isEventFromHandle(e, _this.handlesRefs)) {\n          _this.dragOffset = 0;\n        } else {\n          var handlePosition = utils.getHandleCenterPosition(isVertical, e.target);\n          _this.dragOffset = position - handlePosition;\n          position = handlePosition;\n        }\n        _this.onStart(position);\n        _this.addDocumentTouchEvents();\n        utils.pauseEvent(e);\n      };\n\n      _this.onFocus = function (e) {\n        var _this$props = _this.props,\n            onFocus = _this$props.onFocus,\n            vertical = _this$props.vertical;\n\n        if (utils.isEventFromHandle(e, _this.handlesRefs)) {\n          var handlePosition = utils.getHandleCenterPosition(vertical, e.target);\n          _this.dragOffset = 0;\n          _this.onStart(handlePosition);\n          utils.pauseEvent(e);\n          if (onFocus) {\n            onFocus(e);\n          }\n        }\n      };\n\n      _this.onBlur = function (e) {\n        var onBlur = _this.props.onBlur;\n\n        _this.onEnd();\n        if (onBlur) {\n          onBlur(e);\n        }\n      };\n\n      _this.onMouseUp = function () {\n        if (_this.handlesRefs[_this.prevMovedHandleIndex]) {\n          _this.handlesRefs[_this.prevMovedHandleIndex].clickFocus();\n        }\n      };\n\n      _this.onMouseMove = function (e) {\n        if (!_this.sliderRef) {\n          _this.onEnd();\n          return;\n        }\n        var position = utils.getMousePosition(_this.props.vertical, e);\n        _this.onMove(e, position - _this.dragOffset);\n      };\n\n      _this.onTouchMove = function (e) {\n        if (utils.isNotTouchEvent(e) || !_this.sliderRef) {\n          _this.onEnd();\n          return;\n        }\n\n        var position = utils.getTouchPosition(_this.props.vertical, e);\n        _this.onMove(e, position - _this.dragOffset);\n      };\n\n      _this.onKeyDown = function (e) {\n        if (_this.sliderRef && utils.isEventFromHandle(e, _this.handlesRefs)) {\n          _this.onKeyboard(e);\n        }\n      };\n\n      _this.onClickMarkLabel = function (e, value) {\n        e.stopPropagation();\n        _this.onChange({ value: value });\n        _this.setState({ value: value }, function () {\n          return _this.onEnd(true);\n        });\n      };\n\n      _this.saveSlider = function (slider) {\n        _this.sliderRef = slider;\n      };\n\n      var step = props.step,\n          max = props.max,\n          min = props.min;\n\n      var isPointDiffEven = isFinite(max - min) ? (max - min) % step === 0 : true; // eslint-disable-line\n      warning(step && Math.floor(step) === step ? isPointDiffEven : true, 'Slider[max] - Slider[min] (%s) should be a multiple of Slider[step] (%s)', max - min, step);\n      _this.handlesRefs = {};\n      return _this;\n    }\n\n    _createClass(ComponentEnhancer, [{\n      key: 'componentDidMount',\n      value: function componentDidMount() {\n        // Snapshot testing cannot handle refs, so be sure to null-check this.\n        this.document = this.sliderRef && this.sliderRef.ownerDocument;\n\n        var _props = this.props,\n            autoFocus = _props.autoFocus,\n            disabled = _props.disabled;\n\n        if (autoFocus && !disabled) {\n          this.focus();\n        }\n      }\n    }, {\n      key: 'componentWillUnmount',\n      value: function componentWillUnmount() {\n        if (_get(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'componentWillUnmount', this)) _get(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'componentWillUnmount', this).call(this);\n        this.removeDocumentEvents();\n      }\n    }, {\n      key: 'getSliderStart',\n      value: function getSliderStart() {\n        var slider = this.sliderRef;\n        var _props2 = this.props,\n            vertical = _props2.vertical,\n            reverse = _props2.reverse;\n\n        var rect = slider.getBoundingClientRect();\n        if (vertical) {\n          return reverse ? rect.bottom : rect.top;\n        }\n        return window.pageXOffset + (reverse ? rect.right : rect.left);\n      }\n    }, {\n      key: 'getSliderLength',\n      value: function getSliderLength() {\n        var slider = this.sliderRef;\n        if (!slider) {\n          return 0;\n        }\n\n        var coords = slider.getBoundingClientRect();\n        return this.props.vertical ? coords.height : coords.width;\n      }\n    }, {\n      key: 'addDocumentTouchEvents',\n      value: function addDocumentTouchEvents() {\n        // just work for Chrome iOS Safari and Android Browser\n        this.onTouchMoveListener = addEventListener(this.document, 'touchmove', this.onTouchMove);\n        this.onTouchUpListener = addEventListener(this.document, 'touchend', this.onEnd);\n      }\n    }, {\n      key: 'addDocumentMouseEvents',\n      value: function addDocumentMouseEvents() {\n        this.onMouseMoveListener = addEventListener(this.document, 'mousemove', this.onMouseMove);\n        this.onMouseUpListener = addEventListener(this.document, 'mouseup', this.onEnd);\n      }\n    }, {\n      key: 'removeDocumentEvents',\n      value: function removeDocumentEvents() {\n        /* eslint-disable no-unused-expressions */\n        this.onTouchMoveListener && this.onTouchMoveListener.remove();\n        this.onTouchUpListener && this.onTouchUpListener.remove();\n\n        this.onMouseMoveListener && this.onMouseMoveListener.remove();\n        this.onMouseUpListener && this.onMouseUpListener.remove();\n        /* eslint-enable no-unused-expressions */\n      }\n    }, {\n      key: 'focus',\n      value: function focus() {\n        if (!this.props.disabled) {\n          this.handlesRefs[0].focus();\n        }\n      }\n    }, {\n      key: 'blur',\n      value: function blur() {\n        var _this2 = this;\n\n        if (!this.props.disabled) {\n          Object.keys(this.handlesRefs).forEach(function (key) {\n            if (_this2.handlesRefs[key] && _this2.handlesRefs[key].blur) {\n              _this2.handlesRefs[key].blur();\n            }\n          });\n        }\n      }\n    }, {\n      key: 'calcValue',\n      value: function calcValue(offset) {\n        var _props3 = this.props,\n            vertical = _props3.vertical,\n            min = _props3.min,\n            max = _props3.max;\n\n        var ratio = Math.abs(Math.max(offset, 0) / this.getSliderLength());\n        var value = vertical ? (1 - ratio) * (max - min) + min : ratio * (max - min) + min;\n        return value;\n      }\n    }, {\n      key: 'calcValueByPos',\n      value: function calcValueByPos(position) {\n        var sign = this.props.reverse ? -1 : +1;\n        var pixelOffset = sign * (position - this.getSliderStart());\n        var nextValue = this.trimAlignValue(this.calcValue(pixelOffset));\n        return nextValue;\n      }\n    }, {\n      key: 'calcOffset',\n      value: function calcOffset(value) {\n        var _props4 = this.props,\n            min = _props4.min,\n            max = _props4.max;\n\n        var ratio = (value - min) / (max - min);\n        return ratio * 100;\n      }\n    }, {\n      key: 'saveHandle',\n      value: function saveHandle(index, handle) {\n        this.handlesRefs[index] = handle;\n      }\n    }, {\n      key: 'render',\n      value: function render() {\n        var _classNames;\n\n        var _props5 = this.props,\n            prefixCls = _props5.prefixCls,\n            className = _props5.className,\n            marks = _props5.marks,\n            dots = _props5.dots,\n            step = _props5.step,\n            included = _props5.included,\n            disabled = _props5.disabled,\n            vertical = _props5.vertical,\n            reverse = _props5.reverse,\n            min = _props5.min,\n            max = _props5.max,\n            children = _props5.children,\n            maximumTrackStyle = _props5.maximumTrackStyle,\n            style = _props5.style,\n            railStyle = _props5.railStyle,\n            dotStyle = _props5.dotStyle,\n            activeDotStyle = _props5.activeDotStyle;\n\n        var _get$call = _get(ComponentEnhancer.prototype.__proto__ || Object.getPrototypeOf(ComponentEnhancer.prototype), 'render', this).call(this),\n            tracks = _get$call.tracks,\n            handles = _get$call.handles;\n\n        var sliderClassName = classNames(prefixCls, (_classNames = {}, _defineProperty(_classNames, prefixCls + '-with-marks', Object.keys(marks).length), _defineProperty(_classNames, prefixCls + '-disabled', disabled), _defineProperty(_classNames, prefixCls + '-vertical', vertical), _defineProperty(_classNames, className, className), _classNames));\n        return React.createElement(\n          'div',\n          {\n            ref: this.saveSlider,\n            className: sliderClassName,\n            onTouchStart: disabled ? noop : this.onTouchStart,\n            onMouseDown: disabled ? noop : this.onMouseDown,\n            onMouseUp: disabled ? noop : this.onMouseUp,\n            onKeyDown: disabled ? noop : this.onKeyDown,\n            onFocus: disabled ? noop : this.onFocus,\n            onBlur: disabled ? noop : this.onBlur,\n            style: style\n          },\n          React.createElement('div', {\n            className: prefixCls + '-rail',\n            style: _extends({}, maximumTrackStyle, railStyle)\n          }),\n          tracks,\n          React.createElement(Steps, {\n            prefixCls: prefixCls,\n            vertical: vertical,\n            reverse: reverse,\n            marks: marks,\n            dots: dots,\n            step: step,\n            included: included,\n            lowerBound: this.getLowerBound(),\n            upperBound: this.getUpperBound(),\n            max: max,\n            min: min,\n            dotStyle: dotStyle,\n            activeDotStyle: activeDotStyle\n          }),\n          handles,\n          React.createElement(Marks, {\n            className: prefixCls + '-mark',\n            onClickLabel: disabled ? noop : this.onClickMarkLabel,\n            vertical: vertical,\n            marks: marks,\n            included: included,\n            lowerBound: this.getLowerBound(),\n            upperBound: this.getUpperBound(),\n            max: max,\n            min: min,\n            reverse: reverse\n          }),\n          children\n        );\n      }\n    }]);\n\n    return ComponentEnhancer;\n  }(Component), _class.displayName = 'ComponentEnhancer(' + Component.displayName + ')', _class.propTypes = _extends({}, Component.propTypes, {\n    min: PropTypes.number,\n    max: PropTypes.number,\n    step: PropTypes.number,\n    marks: PropTypes.object,\n    included: PropTypes.bool,\n    className: PropTypes.string,\n    prefixCls: PropTypes.string,\n    disabled: PropTypes.bool,\n    children: PropTypes.any,\n    onBeforeChange: PropTypes.func,\n    onChange: PropTypes.func,\n    onAfterChange: PropTypes.func,\n    handle: PropTypes.func,\n    dots: PropTypes.bool,\n    vertical: PropTypes.bool,\n    style: PropTypes.object,\n    reverse: PropTypes.bool,\n    minimumTrackStyle: PropTypes.object, // just for compatibility, will be deperecate\n    maximumTrackStyle: PropTypes.object, // just for compatibility, will be deperecate\n    handleStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.arrayOf(PropTypes.object)]),\n    trackStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.arrayOf(PropTypes.object)]),\n    railStyle: PropTypes.object,\n    dotStyle: PropTypes.object,\n    activeDotStyle: PropTypes.object,\n    autoFocus: PropTypes.bool,\n    onFocus: PropTypes.func,\n    onBlur: PropTypes.func\n  }), _class.defaultProps = _extends({}, Component.defaultProps, {\n    prefixCls: 'rc-slider',\n    className: '',\n    min: 0,\n    max: 100,\n    step: 1,\n    marks: {},\n    handle: function handle(_ref) {\n      var index = _ref.index,\n          restProps = _objectWithoutProperties(_ref, ['index']);\n\n      delete restProps.dragging;\n      if (restProps.value === null) {\n        return null;\n      }\n\n      return React.createElement(Handle, _extends({}, restProps, { key: index }));\n    },\n\n    onBeforeChange: noop,\n    onChange: noop,\n    onAfterChange: noop,\n    included: true,\n    disabled: false,\n    dots: false,\n    vertical: false,\n    reverse: false,\n    trackStyle: [{}],\n    handleStyle: [{}],\n    railStyle: {},\n    dotStyle: {},\n    activeDotStyle: {}\n  }), _temp;\n}","import _extends from 'babel-runtime/helpers/extends';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\n/* eslint-disable react/prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport warning from 'warning';\nimport Track from './common/Track';\nimport createSlider from './common/createSlider';\nimport * as utils from './utils';\n\nvar Slider = function (_React$Component) {\n  _inherits(Slider, _React$Component);\n\n  function Slider(props) {\n    _classCallCheck(this, Slider);\n\n    var _this = _possibleConstructorReturn(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).call(this, props));\n\n    _this.onEnd = function (force) {\n      var dragging = _this.state.dragging;\n\n      _this.removeDocumentEvents();\n      if (dragging || force) {\n        _this.props.onAfterChange(_this.getValue());\n      }\n      _this.setState({ dragging: false });\n    };\n\n    var defaultValue = props.defaultValue !== undefined ? props.defaultValue : props.min;\n    var value = props.value !== undefined ? props.value : defaultValue;\n\n    _this.state = {\n      value: _this.trimAlignValue(value),\n      dragging: false\n    };\n\n    warning(!('minimumTrackStyle' in props), 'minimumTrackStyle will be deprecated, please use trackStyle instead.');\n    warning(!('maximumTrackStyle' in props), 'maximumTrackStyle will be deprecated, please use railStyle instead.');\n    return _this;\n  }\n\n  _createClass(Slider, [{\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps, prevState) {\n      if (!('value' in this.props || 'min' in this.props || 'max' in this.props)) {\n        return;\n      }\n      var _props = this.props,\n          value = _props.value,\n          onChange = _props.onChange;\n\n      var theValue = value !== undefined ? value : prevState.value;\n      var nextValue = this.trimAlignValue(theValue, this.props);\n      if (nextValue !== prevState.value) {\n        // eslint-disable-next-line\n        this.setState({ value: nextValue });\n        if (utils.isValueOutOfRange(theValue, this.props)) {\n          onChange(nextValue);\n        }\n      }\n    }\n  }, {\n    key: 'onChange',\n    value: function onChange(state) {\n      var props = this.props;\n      var isNotControlled = !('value' in props);\n      var nextState = state.value > this.props.max ? _extends({}, state, { value: this.props.max }) : state;\n      if (isNotControlled) {\n        this.setState(nextState);\n      }\n\n      var changedValue = nextState.value;\n      props.onChange(changedValue);\n    }\n  }, {\n    key: 'onStart',\n    value: function onStart(position) {\n      this.setState({ dragging: true });\n      var props = this.props;\n      var prevValue = this.getValue();\n      props.onBeforeChange(prevValue);\n\n      var value = this.calcValueByPos(position);\n      this.startValue = value;\n      this.startPosition = position;\n\n      if (value === prevValue) return;\n\n      this.prevMovedHandleIndex = 0;\n\n      this.onChange({ value: value });\n    }\n  }, {\n    key: 'onMove',\n    value: function onMove(e, position) {\n      utils.pauseEvent(e);\n      var oldValue = this.state.value;\n\n      var value = this.calcValueByPos(position);\n      if (value === oldValue) return;\n\n      this.onChange({ value: value });\n    }\n  }, {\n    key: 'onKeyboard',\n    value: function onKeyboard(e) {\n      var _props2 = this.props,\n          reverse = _props2.reverse,\n          vertical = _props2.vertical;\n\n      var valueMutator = utils.getKeyboardValueMutator(e, vertical, reverse);\n      if (valueMutator) {\n        utils.pauseEvent(e);\n        var state = this.state;\n        var oldValue = state.value;\n        var mutatedValue = valueMutator(oldValue, this.props);\n        var value = this.trimAlignValue(mutatedValue);\n        if (value === oldValue) return;\n\n        this.onChange({ value: value });\n        this.props.onAfterChange(value);\n        this.onEnd();\n      }\n    }\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.state.value;\n    }\n  }, {\n    key: 'getLowerBound',\n    value: function getLowerBound() {\n      return this.props.min;\n    }\n  }, {\n    key: 'getUpperBound',\n    value: function getUpperBound() {\n      return this.state.value;\n    }\n  }, {\n    key: 'trimAlignValue',\n    value: function trimAlignValue(v) {\n      var nextProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      if (v === null) {\n        return null;\n      }\n\n      var mergedProps = _extends({}, this.props, nextProps);\n      var val = utils.ensureValueInRange(v, mergedProps);\n      return utils.ensureValuePrecision(val, mergedProps);\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props3 = this.props,\n          prefixCls = _props3.prefixCls,\n          vertical = _props3.vertical,\n          included = _props3.included,\n          disabled = _props3.disabled,\n          minimumTrackStyle = _props3.minimumTrackStyle,\n          trackStyle = _props3.trackStyle,\n          handleStyle = _props3.handleStyle,\n          tabIndex = _props3.tabIndex,\n          min = _props3.min,\n          max = _props3.max,\n          reverse = _props3.reverse,\n          handleGenerator = _props3.handle;\n      var _state = this.state,\n          value = _state.value,\n          dragging = _state.dragging;\n\n      var offset = this.calcOffset(value);\n      var handle = handleGenerator({\n        className: prefixCls + '-handle',\n        prefixCls: prefixCls,\n        vertical: vertical,\n        offset: offset,\n        value: value,\n        dragging: dragging,\n        disabled: disabled,\n        min: min,\n        max: max,\n        reverse: reverse,\n        index: 0,\n        tabIndex: tabIndex,\n        style: handleStyle[0] || handleStyle,\n        ref: function ref(h) {\n          return _this2.saveHandle(0, h);\n        }\n      });\n\n      var _trackStyle = trackStyle[0] || trackStyle;\n      var track = React.createElement(Track, {\n        className: prefixCls + '-track',\n        vertical: vertical,\n        included: included,\n        offset: 0,\n        reverse: reverse,\n        length: offset,\n        style: _extends({}, minimumTrackStyle, _trackStyle)\n      });\n\n      return { tracks: track, handles: handle };\n    }\n  }]);\n\n  return Slider;\n}(React.Component);\n\nSlider.propTypes = {\n  defaultValue: PropTypes.number,\n  value: PropTypes.number,\n  disabled: PropTypes.bool,\n  autoFocus: PropTypes.bool,\n  tabIndex: PropTypes.number,\n  reverse: PropTypes.bool,\n  min: PropTypes.number,\n  max: PropTypes.number\n};\n\n\nexport default createSlider(Slider);","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n  // Call this.constructor.gDSFP to support sub-classes.\n  var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n  if (state !== null && state !== undefined) {\n    this.setState(state);\n  }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n  // Call this.constructor.gDSFP to support sub-classes.\n  // Use the setState() updater to ensure state isn't stale in certain edge cases.\n  function updater(prevState) {\n    var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n    return state !== null && state !== undefined ? state : null;\n  }\n  // Binding \"this\" is important for shallow renderer support.\n  this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n  try {\n    var prevProps = this.props;\n    var prevState = this.state;\n    this.props = nextProps;\n    this.state = nextState;\n    this.__reactInternalSnapshotFlag = true;\n    this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n      prevProps,\n      prevState\n    );\n  } finally {\n    this.props = prevProps;\n    this.state = prevState;\n  }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n  var prototype = Component.prototype;\n\n  if (!prototype || !prototype.isReactComponent) {\n    throw new Error('Can only polyfill class components');\n  }\n\n  if (\n    typeof Component.getDerivedStateFromProps !== 'function' &&\n    typeof prototype.getSnapshotBeforeUpdate !== 'function'\n  ) {\n    return Component;\n  }\n\n  // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n  // Error if any of these lifecycles are present,\n  // Because they would work differently between older and newer (16.3+) versions of React.\n  var foundWillMountName = null;\n  var foundWillReceivePropsName = null;\n  var foundWillUpdateName = null;\n  if (typeof prototype.componentWillMount === 'function') {\n    foundWillMountName = 'componentWillMount';\n  } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n    foundWillMountName = 'UNSAFE_componentWillMount';\n  }\n  if (typeof prototype.componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'componentWillReceiveProps';\n  } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n  }\n  if (typeof prototype.componentWillUpdate === 'function') {\n    foundWillUpdateName = 'componentWillUpdate';\n  } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n    foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n  }\n  if (\n    foundWillMountName !== null ||\n    foundWillReceivePropsName !== null ||\n    foundWillUpdateName !== null\n  ) {\n    var componentName = Component.displayName || Component.name;\n    var newApiName =\n      typeof Component.getDerivedStateFromProps === 'function'\n        ? 'getDerivedStateFromProps()'\n        : 'getSnapshotBeforeUpdate()';\n\n    throw Error(\n      'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n        componentName +\n        ' uses ' +\n        newApiName +\n        ' but also contains the following legacy lifecycles:' +\n        (foundWillMountName !== null ? '\\n  ' + foundWillMountName : '') +\n        (foundWillReceivePropsName !== null\n          ? '\\n  ' + foundWillReceivePropsName\n          : '') +\n        (foundWillUpdateName !== null ? '\\n  ' + foundWillUpdateName : '') +\n        '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n        'https://fb.me/react-async-component-lifecycle-hooks'\n    );\n  }\n\n  // React <= 16.2 does not support static getDerivedStateFromProps.\n  // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n  // Newer versions of React will ignore these lifecycles if gDSFP exists.\n  if (typeof Component.getDerivedStateFromProps === 'function') {\n    prototype.componentWillMount = componentWillMount;\n    prototype.componentWillReceiveProps = componentWillReceiveProps;\n  }\n\n  // React <= 16.2 does not support getSnapshotBeforeUpdate.\n  // As a workaround, use cWU to invoke the new lifecycle.\n  // Newer versions of React will ignore that lifecycle if gSBU exists.\n  if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n    if (typeof prototype.componentDidUpdate !== 'function') {\n      throw new Error(\n        'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n      );\n    }\n\n    prototype.componentWillUpdate = componentWillUpdate;\n\n    var componentDidUpdate = prototype.componentDidUpdate;\n\n    prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n      prevProps,\n      prevState,\n      maybeSnapshot\n    ) {\n      // 16.3+ will not execute our will-update method;\n      // It will pass a snapshot value to did-update though.\n      // Older versions will require our polyfilled will-update value.\n      // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n      // Because for <= 15.x versions this might be a \"prevContext\" object.\n      // We also can't just check \"__reactInternalSnapshot\",\n      // Because get-snapshot might return a falsy value.\n      // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n      var snapshot = this.__reactInternalSnapshotFlag\n        ? this.__reactInternalSnapshot\n        : maybeSnapshot;\n\n      componentDidUpdate.call(this, prevProps, prevState, snapshot);\n    };\n  }\n\n  return Component;\n}\n\nexport { polyfill };\n","import _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _extends from 'babel-runtime/helpers/extends';\nimport _toConsumableArray from 'babel-runtime/helpers/toConsumableArray';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\n/* eslint-disable react/prop-types */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { polyfill } from 'react-lifecycles-compat';\nimport shallowEqual from 'shallowequal';\nimport Track from './common/Track';\nimport createSlider from './common/createSlider';\nimport * as utils from './utils';\n\nvar _trimAlignValue = function _trimAlignValue(_ref) {\n  var value = _ref.value,\n      handle = _ref.handle,\n      bounds = _ref.bounds,\n      props = _ref.props;\n  var allowCross = props.allowCross,\n      pushable = props.pushable;\n\n  var thershold = Number(pushable);\n  var valInRange = utils.ensureValueInRange(value, props);\n  var valNotConflict = valInRange;\n  if (!allowCross && handle != null && bounds !== undefined) {\n    if (handle > 0 && valInRange <= bounds[handle - 1] + thershold) {\n      valNotConflict = bounds[handle - 1] + thershold;\n    }\n    if (handle < bounds.length - 1 && valInRange >= bounds[handle + 1] - thershold) {\n      valNotConflict = bounds[handle + 1] - thershold;\n    }\n  }\n  return utils.ensureValuePrecision(valNotConflict, props);\n};\n\nvar Range = function (_React$Component) {\n  _inherits(Range, _React$Component);\n\n  function Range(props) {\n    _classCallCheck(this, Range);\n\n    var _this = _possibleConstructorReturn(this, (Range.__proto__ || Object.getPrototypeOf(Range)).call(this, props));\n\n    _this.onEnd = function (force) {\n      var handle = _this.state.handle;\n\n      _this.removeDocumentEvents();\n\n      if (handle !== null || force) {\n        _this.props.onAfterChange(_this.getValue());\n      }\n\n      _this.setState({\n        handle: null\n      });\n    };\n\n    var count = props.count,\n        min = props.min,\n        max = props.max;\n\n    var initialValue = Array.apply(undefined, _toConsumableArray(Array(count + 1))).map(function () {\n      return min;\n    });\n    var defaultValue = 'defaultValue' in props ? props.defaultValue : initialValue;\n    var value = props.value !== undefined ? props.value : defaultValue;\n    var bounds = value.map(function (v, i) {\n      return _trimAlignValue({\n        value: v,\n        handle: i,\n        props: props\n      });\n    });\n    var recent = bounds[0] === max ? 0 : bounds.length - 1;\n\n    _this.state = {\n      handle: null,\n      recent: recent,\n      bounds: bounds\n    };\n    return _this;\n  }\n\n  _createClass(Range, [{\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps, prevState) {\n      var _this2 = this;\n\n      if (!('value' in this.props || 'min' in this.props || 'max' in this.props)) {\n        return;\n      }\n      if (this.props.min === prevProps.min && this.props.max === prevProps.max && shallowEqual(this.props.value, prevProps.value)) {\n        return;\n      }\n      var _props = this.props,\n          onChange = _props.onChange,\n          value = _props.value;\n\n      var currentValue = value || prevState.bounds;\n      if (currentValue.some(function (v) {\n        return utils.isValueOutOfRange(v, _this2.props);\n      })) {\n        var newValues = currentValue.map(function (v) {\n          return utils.ensureValueInRange(v, _this2.props);\n        });\n        onChange(newValues);\n      }\n    }\n  }, {\n    key: 'onChange',\n    value: function onChange(state) {\n      var props = this.props;\n      var isNotControlled = !('value' in props);\n      if (isNotControlled) {\n        this.setState(state);\n      } else {\n        var controlledState = {};\n\n        ['handle', 'recent'].forEach(function (item) {\n          if (state[item] !== undefined) {\n            controlledState[item] = state[item];\n          }\n        });\n\n        if (Object.keys(controlledState).length) {\n          this.setState(controlledState);\n        }\n      }\n\n      var data = _extends({}, this.state, state);\n      var changedValue = data.bounds;\n      props.onChange(changedValue);\n    }\n  }, {\n    key: 'onStart',\n    value: function onStart(position) {\n      var props = this.props;\n      var state = this.state;\n      var bounds = this.getValue();\n      props.onBeforeChange(bounds);\n\n      var value = this.calcValueByPos(position);\n      this.startValue = value;\n      this.startPosition = position;\n\n      var closestBound = this.getClosestBound(value);\n      this.prevMovedHandleIndex = this.getBoundNeedMoving(value, closestBound);\n\n      this.setState({\n        handle: this.prevMovedHandleIndex,\n        recent: this.prevMovedHandleIndex\n      });\n\n      var prevValue = bounds[this.prevMovedHandleIndex];\n      if (value === prevValue) return;\n\n      var nextBounds = [].concat(_toConsumableArray(state.bounds));\n      nextBounds[this.prevMovedHandleIndex] = value;\n      this.onChange({ bounds: nextBounds });\n    }\n  }, {\n    key: 'onMove',\n    value: function onMove(e, position) {\n      utils.pauseEvent(e);\n      var state = this.state;\n\n      var value = this.calcValueByPos(position);\n      var oldValue = state.bounds[state.handle];\n      if (value === oldValue) return;\n\n      this.moveTo(value);\n    }\n  }, {\n    key: 'onKeyboard',\n    value: function onKeyboard(e) {\n      var _props2 = this.props,\n          reverse = _props2.reverse,\n          vertical = _props2.vertical;\n\n      var valueMutator = utils.getKeyboardValueMutator(e, vertical, reverse);\n\n      if (valueMutator) {\n        utils.pauseEvent(e);\n        var state = this.state,\n            props = this.props;\n        var bounds = state.bounds,\n            handle = state.handle;\n\n        var oldValue = bounds[handle === null ? state.recent : handle];\n        var mutatedValue = valueMutator(oldValue, props);\n        var value = _trimAlignValue({\n          value: mutatedValue,\n          handle: handle,\n          bounds: state.bounds,\n          props: props\n        });\n        if (value === oldValue) return;\n        var isFromKeyboardEvent = true;\n        this.moveTo(value, isFromKeyboardEvent);\n      }\n    }\n  }, {\n    key: 'getValue',\n    value: function getValue() {\n      return this.state.bounds;\n    }\n  }, {\n    key: 'getClosestBound',\n    value: function getClosestBound(value) {\n      var bounds = this.state.bounds;\n\n      var closestBound = 0;\n      for (var i = 1; i < bounds.length - 1; ++i) {\n        if (value >= bounds[i]) {\n          closestBound = i;\n        }\n      }\n      if (Math.abs(bounds[closestBound + 1] - value) < Math.abs(bounds[closestBound] - value)) {\n        closestBound += 1;\n      }\n      return closestBound;\n    }\n  }, {\n    key: 'getBoundNeedMoving',\n    value: function getBoundNeedMoving(value, closestBound) {\n      var _state = this.state,\n          bounds = _state.bounds,\n          recent = _state.recent;\n\n      var boundNeedMoving = closestBound;\n      var isAtTheSamePoint = bounds[closestBound + 1] === bounds[closestBound];\n\n      if (isAtTheSamePoint && bounds[recent] === bounds[closestBound]) {\n        boundNeedMoving = recent;\n      }\n\n      if (isAtTheSamePoint && value !== bounds[closestBound + 1]) {\n        boundNeedMoving = value < bounds[closestBound + 1] ? closestBound : closestBound + 1;\n      }\n      return boundNeedMoving;\n    }\n  }, {\n    key: 'getLowerBound',\n    value: function getLowerBound() {\n      return this.state.bounds[0];\n    }\n  }, {\n    key: 'getUpperBound',\n    value: function getUpperBound() {\n      var bounds = this.state.bounds;\n\n      return bounds[bounds.length - 1];\n    }\n\n    /**\n     * Returns an array of possible slider points, taking into account both\n     * `marks` and `step`. The result is cached.\n     */\n\n  }, {\n    key: 'getPoints',\n    value: function getPoints() {\n      var _props3 = this.props,\n          marks = _props3.marks,\n          step = _props3.step,\n          min = _props3.min,\n          max = _props3.max;\n\n      var cache = this._getPointsCache;\n      if (!cache || cache.marks !== marks || cache.step !== step) {\n        var pointsObject = _extends({}, marks);\n        if (step !== null) {\n          for (var point = min; point <= max; point += step) {\n            pointsObject[point] = point;\n          }\n        }\n        var points = Object.keys(pointsObject).map(parseFloat);\n        points.sort(function (a, b) {\n          return a - b;\n        });\n        this._getPointsCache = { marks: marks, step: step, points: points };\n      }\n      return this._getPointsCache.points;\n    }\n  }, {\n    key: 'moveTo',\n    value: function moveTo(value, isFromKeyboardEvent) {\n      var _this3 = this;\n\n      var state = this.state,\n          props = this.props;\n\n      var nextBounds = [].concat(_toConsumableArray(state.bounds));\n      var handle = state.handle === null ? state.recent : state.handle;\n      nextBounds[handle] = value;\n      var nextHandle = handle;\n      if (props.pushable !== false) {\n        this.pushSurroundingHandles(nextBounds, nextHandle);\n      } else if (props.allowCross) {\n        nextBounds.sort(function (a, b) {\n          return a - b;\n        });\n        nextHandle = nextBounds.indexOf(value);\n      }\n      this.onChange({\n        recent: nextHandle,\n        handle: nextHandle,\n        bounds: nextBounds\n      });\n      if (isFromKeyboardEvent) {\n        // known problem: because setState is async,\n        // so trigger focus will invoke handler's onEnd and another handler's onStart too early,\n        // cause onBeforeChange and onAfterChange receive wrong value.\n        // here use setState callback to hack，but not elegant\n        this.props.onAfterChange(nextBounds);\n        this.setState({}, function () {\n          _this3.handlesRefs[nextHandle].focus();\n        });\n        this.onEnd();\n      }\n    }\n  }, {\n    key: 'pushSurroundingHandles',\n    value: function pushSurroundingHandles(bounds, handle) {\n      var value = bounds[handle];\n      var threshold = this.props.pushable;\n\n      threshold = Number(threshold);\n\n      var direction = 0;\n      if (bounds[handle + 1] - value < threshold) {\n        direction = +1; // push to right\n      }\n      if (value - bounds[handle - 1] < threshold) {\n        direction = -1; // push to left\n      }\n\n      if (direction === 0) {\n        return;\n      }\n\n      var nextHandle = handle + direction;\n      var diffToNext = direction * (bounds[nextHandle] - value);\n      if (!this.pushHandle(bounds, nextHandle, direction, threshold - diffToNext)) {\n        // revert to original value if pushing is impossible\n        bounds[handle] = bounds[nextHandle] - direction * threshold;\n      }\n    }\n  }, {\n    key: 'pushHandle',\n    value: function pushHandle(bounds, handle, direction, amount) {\n      var originalValue = bounds[handle];\n      var currentValue = bounds[handle];\n      while (direction * (currentValue - originalValue) < amount) {\n        if (!this.pushHandleOnePoint(bounds, handle, direction)) {\n          // can't push handle enough to create the needed `amount` gap, so we\n          // revert its position to the original value\n          bounds[handle] = originalValue;\n          return false;\n        }\n        currentValue = bounds[handle];\n      }\n      // the handle was pushed enough to create the needed `amount` gap\n      return true;\n    }\n  }, {\n    key: 'pushHandleOnePoint',\n    value: function pushHandleOnePoint(bounds, handle, direction) {\n      var points = this.getPoints();\n      var pointIndex = points.indexOf(bounds[handle]);\n      var nextPointIndex = pointIndex + direction;\n      if (nextPointIndex >= points.length || nextPointIndex < 0) {\n        // reached the minimum or maximum available point, can't push anymore\n        return false;\n      }\n      var nextHandle = handle + direction;\n      var nextValue = points[nextPointIndex];\n      var threshold = this.props.pushable;\n\n      var diffToNext = direction * (bounds[nextHandle] - nextValue);\n      if (!this.pushHandle(bounds, nextHandle, direction, threshold - diffToNext)) {\n        // couldn't push next handle, so we won't push this one either\n        return false;\n      }\n      // push the handle\n      bounds[handle] = nextValue;\n      return true;\n    }\n  }, {\n    key: 'trimAlignValue',\n    value: function trimAlignValue(value) {\n      var _state2 = this.state,\n          handle = _state2.handle,\n          bounds = _state2.bounds;\n\n      return _trimAlignValue({\n        value: value,\n        handle: handle,\n        bounds: bounds,\n        props: this.props\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var _state3 = this.state,\n          handle = _state3.handle,\n          bounds = _state3.bounds;\n      var _props4 = this.props,\n          prefixCls = _props4.prefixCls,\n          vertical = _props4.vertical,\n          included = _props4.included,\n          disabled = _props4.disabled,\n          min = _props4.min,\n          max = _props4.max,\n          reverse = _props4.reverse,\n          handleGenerator = _props4.handle,\n          trackStyle = _props4.trackStyle,\n          handleStyle = _props4.handleStyle,\n          tabIndex = _props4.tabIndex;\n\n\n      var offsets = bounds.map(function (v) {\n        return _this4.calcOffset(v);\n      });\n\n      var handleClassName = prefixCls + '-handle';\n      var handles = bounds.map(function (v, i) {\n        var _classNames;\n\n        var _tabIndex = tabIndex[i] || 0;\n        if (disabled || tabIndex[i] === null) {\n          _tabIndex = null;\n        }\n        return handleGenerator({\n          className: classNames((_classNames = {}, _defineProperty(_classNames, handleClassName, true), _defineProperty(_classNames, handleClassName + '-' + (i + 1), true), _classNames)),\n          prefixCls: prefixCls,\n          vertical: vertical,\n          offset: offsets[i],\n          value: v,\n          dragging: handle === i,\n          index: i,\n          tabIndex: _tabIndex,\n          min: min,\n          max: max,\n          reverse: reverse,\n          disabled: disabled,\n          style: handleStyle[i],\n          ref: function ref(h) {\n            return _this4.saveHandle(i, h);\n          }\n        });\n      });\n\n      var tracks = bounds.slice(0, -1).map(function (_, index) {\n        var _classNames2;\n\n        var i = index + 1;\n        var trackClassName = classNames((_classNames2 = {}, _defineProperty(_classNames2, prefixCls + '-track', true), _defineProperty(_classNames2, prefixCls + '-track-' + i, true), _classNames2));\n        return React.createElement(Track, {\n          className: trackClassName,\n          vertical: vertical,\n          reverse: reverse,\n          included: included,\n          offset: offsets[i - 1],\n          length: offsets[i] - offsets[i - 1],\n          style: trackStyle[index],\n          key: i\n        });\n      });\n\n      return { tracks: tracks, handles: handles };\n    }\n  }], [{\n    key: 'getDerivedStateFromProps',\n    value: function getDerivedStateFromProps(props, state) {\n      if ('value' in props || 'min' in props || 'max' in props) {\n        var value = props.value || state.bounds;\n        var nextBounds = value.map(function (v, i) {\n          return _trimAlignValue({\n            value: v,\n            handle: i,\n            bounds: state.bounds,\n            props: props\n          });\n        });\n        if (nextBounds.length === state.bounds.length && nextBounds.every(function (v, i) {\n          return v === state.bounds[i];\n        })) {\n          return null;\n        }\n        return _extends({}, state, {\n          bounds: nextBounds\n        });\n      }\n      return null;\n    }\n  }]);\n\n  return Range;\n}(React.Component);\n\nRange.displayName = 'Range';\nRange.propTypes = {\n  autoFocus: PropTypes.bool,\n  defaultValue: PropTypes.arrayOf(PropTypes.number),\n  value: PropTypes.arrayOf(PropTypes.number),\n  count: PropTypes.number,\n  pushable: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),\n  allowCross: PropTypes.bool,\n  disabled: PropTypes.bool,\n  reverse: PropTypes.bool,\n  tabIndex: PropTypes.arrayOf(PropTypes.number),\n  min: PropTypes.number,\n  max: PropTypes.number\n};\nRange.defaultProps = {\n  count: 1,\n  allowCross: true,\n  pushable: false,\n  tabIndex: []\n};\n\n\npolyfill(Range);\n\nexport default createSlider(Range);","export default function contains(root, n) {\n  var node = n;\n\n  while (node) {\n    if (node === root) {\n      return true;\n    }\n\n    node = node.parentNode;\n  }\n\n  return false;\n}","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\n\nvar ContainerRender = /*#__PURE__*/function (_React$Component) {\n  _inherits(ContainerRender, _React$Component);\n\n  var _super = _createSuper(ContainerRender);\n\n  function ContainerRender() {\n    var _this;\n\n    _classCallCheck(this, ContainerRender);\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _super.call.apply(_super, [this].concat(args));\n\n    _this.removeContainer = function () {\n      if (_this.container) {\n        ReactDOM.unmountComponentAtNode(_this.container);\n\n        _this.container.parentNode.removeChild(_this.container);\n\n        _this.container = null;\n      }\n    };\n\n    _this.renderComponent = function (props, ready) {\n      var _this$props = _this.props,\n          visible = _this$props.visible,\n          getComponent = _this$props.getComponent,\n          forceRender = _this$props.forceRender,\n          getContainer = _this$props.getContainer,\n          parent = _this$props.parent;\n\n      if (visible || parent._component || forceRender) {\n        if (!_this.container) {\n          _this.container = getContainer();\n        }\n\n        ReactDOM.unstable_renderSubtreeIntoContainer(parent, getComponent(props), _this.container, function callback() {\n          if (ready) {\n            ready.call(this);\n          }\n        });\n      }\n    };\n\n    return _this;\n  }\n\n  _createClass(ContainerRender, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      if (this.props.autoMount) {\n        this.renderComponent();\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (this.props.autoMount) {\n        this.renderComponent();\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      if (this.props.autoDestroy) {\n        this.removeContainer();\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return this.props.children({\n        renderComponent: this.renderComponent,\n        removeContainer: this.removeContainer\n      });\n    }\n  }]);\n\n  return ContainerRender;\n}(React.Component);\n\nContainerRender.propTypes = {\n  autoMount: PropTypes.bool,\n  autoDestroy: PropTypes.bool,\n  visible: PropTypes.bool,\n  forceRender: PropTypes.bool,\n  parent: PropTypes.any,\n  getComponent: PropTypes.func.isRequired,\n  getContainer: PropTypes.func.isRequired,\n  children: PropTypes.func.isRequired\n};\nContainerRender.defaultProps = {\n  autoMount: true,\n  autoDestroy: true,\n  forceRender: false\n};\nexport { ContainerRender as default };","function _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\n\nvar Portal = /*#__PURE__*/function (_React$Component) {\n  _inherits(Portal, _React$Component);\n\n  var _super = _createSuper(Portal);\n\n  function Portal() {\n    _classCallCheck(this, Portal);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(Portal, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.createContainer();\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps) {\n      var didUpdate = this.props.didUpdate;\n\n      if (didUpdate) {\n        didUpdate(prevProps);\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.removeContainer();\n    }\n  }, {\n    key: \"createContainer\",\n    value: function createContainer() {\n      this._container = this.props.getContainer();\n      this.forceUpdate();\n    }\n  }, {\n    key: \"removeContainer\",\n    value: function removeContainer() {\n      if (this._container) {\n        this._container.parentNode.removeChild(this._container);\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      if (this._container) {\n        return ReactDOM.createPortal(this.props.children, this._container);\n      }\n\n      return null;\n    }\n  }]);\n\n  return Portal;\n}(React.Component);\n\nPortal.propTypes = {\n  getContainer: PropTypes.func.isRequired,\n  children: PropTypes.node.isRequired,\n  didUpdate: PropTypes.func\n};\nexport { Portal as default };","function ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n  return target;\n}\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\n\nvar vendorPrefix;\nvar jsCssMap = {\n  Webkit: '-webkit-',\n  Moz: '-moz-',\n  // IE did it wrong again ...\n  ms: '-ms-',\n  O: '-o-'\n};\nfunction getVendorPrefix() {\n  if (vendorPrefix !== undefined) {\n    return vendorPrefix;\n  }\n  vendorPrefix = '';\n  var style = document.createElement('p').style;\n  var testProp = 'Transform';\n  for (var key in jsCssMap) {\n    if (key + testProp in style) {\n      vendorPrefix = key;\n    }\n  }\n  return vendorPrefix;\n}\nfunction getTransitionName() {\n  return getVendorPrefix() ? \"\".concat(getVendorPrefix(), \"TransitionProperty\") : 'transitionProperty';\n}\nfunction getTransformName() {\n  return getVendorPrefix() ? \"\".concat(getVendorPrefix(), \"Transform\") : 'transform';\n}\nfunction setTransitionProperty(node, value) {\n  var name = getTransitionName();\n  if (name) {\n    node.style[name] = value;\n    if (name !== 'transitionProperty') {\n      node.style.transitionProperty = value;\n    }\n  }\n}\nfunction setTransform(node, value) {\n  var name = getTransformName();\n  if (name) {\n    node.style[name] = value;\n    if (name !== 'transform') {\n      node.style.transform = value;\n    }\n  }\n}\nfunction getTransitionProperty(node) {\n  return node.style.transitionProperty || node.style[getTransitionName()];\n}\nfunction getTransformXY(node) {\n  var style = window.getComputedStyle(node, null);\n  var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());\n  if (transform && transform !== 'none') {\n    var matrix = transform.replace(/[^0-9\\-.,]/g, '').split(',');\n    return {\n      x: parseFloat(matrix[12] || matrix[4], 0),\n      y: parseFloat(matrix[13] || matrix[5], 0)\n    };\n  }\n  return {\n    x: 0,\n    y: 0\n  };\n}\nvar matrix2d = /matrix\\((.*)\\)/;\nvar matrix3d = /matrix3d\\((.*)\\)/;\nfunction setTransformXY(node, xy) {\n  var style = window.getComputedStyle(node, null);\n  var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());\n  if (transform && transform !== 'none') {\n    var arr;\n    var match2d = transform.match(matrix2d);\n    if (match2d) {\n      match2d = match2d[1];\n      arr = match2d.split(',').map(function (item) {\n        return parseFloat(item, 10);\n      });\n      arr[4] = xy.x;\n      arr[5] = xy.y;\n      setTransform(node, \"matrix(\".concat(arr.join(','), \")\"));\n    } else {\n      var match3d = transform.match(matrix3d)[1];\n      arr = match3d.split(',').map(function (item) {\n        return parseFloat(item, 10);\n      });\n      arr[12] = xy.x;\n      arr[13] = xy.y;\n      setTransform(node, \"matrix3d(\".concat(arr.join(','), \")\"));\n    }\n  } else {\n    setTransform(node, \"translateX(\".concat(xy.x, \"px) translateY(\").concat(xy.y, \"px) translateZ(0)\"));\n  }\n}\n\nvar RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\nvar getComputedStyleX;\n\n// https://stackoverflow.com/a/3485654/3040605\nfunction forceRelayout(elem) {\n  var originalStyle = elem.style.display;\n  elem.style.display = 'none';\n  elem.offsetHeight; // eslint-disable-line\n  elem.style.display = originalStyle;\n}\nfunction css(el, name, v) {\n  var value = v;\n  if (_typeof(name) === 'object') {\n    for (var i in name) {\n      if (name.hasOwnProperty(i)) {\n        css(el, i, name[i]);\n      }\n    }\n    return undefined;\n  }\n  if (typeof value !== 'undefined') {\n    if (typeof value === 'number') {\n      value = \"\".concat(value, \"px\");\n    }\n    el.style[name] = value;\n    return undefined;\n  }\n  return getComputedStyleX(el, name);\n}\nfunction getClientPosition(elem) {\n  var box;\n  var x;\n  var y;\n  var doc = elem.ownerDocument;\n  var body = doc.body;\n  var docElem = doc && doc.documentElement;\n  // 根据 GBS 最新数据，A-Grade Browsers 都已支持 getBoundingClientRect 方法，不用再考虑传统的实现方式\n  box = elem.getBoundingClientRect();\n\n  // 注：jQuery 还考虑减去 docElem.clientLeft/clientTop\n  // 但测试发现，这样反而会导致当 html 和 body 有边距/边框样式时，获取的值不正确\n  // 此外，ie6 会忽略 html 的 margin 值，幸运地是没有谁会去设置 html 的 margin\n\n  x = Math.floor(box.left);\n  y = Math.floor(box.top);\n\n  // In IE, most of the time, 2 extra pixels are added to the top and left\n  // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n  // IE6 standards mode, this border can be overridden by setting the\n  // document element's border to zero -- thus, we cannot rely on the\n  // offset always being 2 pixels.\n\n  // In quirks mode, the offset can be determined by querying the body's\n  // clientLeft/clientTop, but in standards mode, it is found by querying\n  // the document element's clientLeft/clientTop.  Since we already called\n  // getClientBoundingRect we have already forced a reflow, so it is not\n  // too expensive just to query them all.\n\n  // ie 下应该减去窗口的边框吧，毕竟默认 absolute 都是相对窗口定位的\n  // 窗口边框标准是设 documentElement ,quirks 时设置 body\n  // 最好禁止在 body 和 html 上边框 ，但 ie < 9 html 默认有 2px ，减去\n  // 但是非 ie 不可能设置窗口边框，body html 也不是窗口 ,ie 可以通过 html,body 设置\n  // 标准 ie 下 docElem.clientTop 就是 border-top\n  // ie7 html 即窗口边框改变不了。永远为 2\n  // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框，即使设了 border-top 也为 0\n\n  x -= docElem.clientLeft || body.clientLeft || 0;\n  y -= docElem.clientTop || body.clientTop || 0;\n  return {\n    left: x,\n    top: y\n  };\n}\nfunction getScroll(w, top) {\n  var ret = w[\"page\".concat(top ? 'Y' : 'X', \"Offset\")];\n  var method = \"scroll\".concat(top ? 'Top' : 'Left');\n  if (typeof ret !== 'number') {\n    var d = w.document;\n    // ie6,7,8 standard mode\n    ret = d.documentElement[method];\n    if (typeof ret !== 'number') {\n      // quirks mode\n      ret = d.body[method];\n    }\n  }\n  return ret;\n}\nfunction getScrollLeft(w) {\n  return getScroll(w);\n}\nfunction getScrollTop(w) {\n  return getScroll(w, true);\n}\nfunction getOffset(el) {\n  var pos = getClientPosition(el);\n  var doc = el.ownerDocument;\n  var w = doc.defaultView || doc.parentWindow;\n  pos.left += getScrollLeft(w);\n  pos.top += getScrollTop(w);\n  return pos;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n  // must use == for ie8\n  /* eslint eqeqeq:0 */\n  return obj !== null && obj !== undefined && obj == obj.window;\n}\nfunction getDocument(node) {\n  if (isWindow(node)) {\n    return node.document;\n  }\n  if (node.nodeType === 9) {\n    return node;\n  }\n  return node.ownerDocument;\n}\nfunction _getComputedStyle(elem, name, cs) {\n  var computedStyle = cs;\n  var val = '';\n  var d = getDocument(elem);\n  computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null);\n\n  // https://github.com/kissyteam/kissy/issues/61\n  if (computedStyle) {\n    val = computedStyle.getPropertyValue(name) || computedStyle[name];\n  }\n  return val;\n}\nvar _RE_NUM_NO_PX = new RegExp(\"^(\".concat(RE_NUM, \")(?!px)[a-z%]+$\"), 'i');\nvar RE_POS = /^(top|right|bottom|left)$/;\nvar CURRENT_STYLE = 'currentStyle';\nvar RUNTIME_STYLE = 'runtimeStyle';\nvar LEFT = 'left';\nvar PX = 'px';\nfunction _getComputedStyleIE(elem, name) {\n  // currentStyle maybe null\n  // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n  var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n  // 当 width/height 设置为百分比时，通过 pixelLeft 方式转换的 width/height 值\n  // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n  // 在 ie 下不对，需要直接用 offset 方式\n  // borderWidth 等值也有问题，但考虑到 borderWidth 设为百分比的概率很小，这里就不考虑了\n\n  // From the awesome hack by Dean Edwards\n  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n  // If we're not dealing with a regular pixel number\n  // but a number that has a weird ending, we need to convert it to pixels\n  // exclude left right for relativity\n  if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n    // Remember the original values\n    var style = elem.style;\n    var left = style[LEFT];\n    var rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n    // prevent flashing of content\n    elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n    // Put in the new values to get a computed value out\n    style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n    ret = style.pixelLeft + PX;\n\n    // Revert the changed values\n    style[LEFT] = left;\n    elem[RUNTIME_STYLE][LEFT] = rsLeft;\n  }\n  return ret === '' ? 'auto' : ret;\n}\nif (typeof window !== 'undefined') {\n  getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;\n}\nfunction getOffsetDirection(dir, option) {\n  if (dir === 'left') {\n    return option.useCssRight ? 'right' : dir;\n  }\n  return option.useCssBottom ? 'bottom' : dir;\n}\nfunction oppositeOffsetDirection(dir) {\n  if (dir === 'left') {\n    return 'right';\n  } else if (dir === 'right') {\n    return 'left';\n  } else if (dir === 'top') {\n    return 'bottom';\n  } else if (dir === 'bottom') {\n    return 'top';\n  }\n}\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setLeftTop(elem, offset, option) {\n  // set position first, in-case top/left are set even on static elem\n  if (css(elem, 'position') === 'static') {\n    elem.style.position = 'relative';\n  }\n  var presetH = -999;\n  var presetV = -999;\n  var horizontalProperty = getOffsetDirection('left', option);\n  var verticalProperty = getOffsetDirection('top', option);\n  var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);\n  var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);\n  if (horizontalProperty !== 'left') {\n    presetH = 999;\n  }\n  if (verticalProperty !== 'top') {\n    presetV = 999;\n  }\n  var originalTransition = '';\n  var originalOffset = getOffset(elem);\n  if ('left' in offset || 'top' in offset) {\n    originalTransition = getTransitionProperty(elem) || '';\n    setTransitionProperty(elem, 'none');\n  }\n  if ('left' in offset) {\n    elem.style[oppositeHorizontalProperty] = '';\n    elem.style[horizontalProperty] = \"\".concat(presetH, \"px\");\n  }\n  if ('top' in offset) {\n    elem.style[oppositeVerticalProperty] = '';\n    elem.style[verticalProperty] = \"\".concat(presetV, \"px\");\n  }\n  // force relayout\n  forceRelayout(elem);\n  var old = getOffset(elem);\n  var originalStyle = {};\n  for (var key in offset) {\n    if (offset.hasOwnProperty(key)) {\n      var dir = getOffsetDirection(key, option);\n      var preset = key === 'left' ? presetH : presetV;\n      var off = originalOffset[key] - old[key];\n      if (dir === key) {\n        originalStyle[dir] = preset + off;\n      } else {\n        originalStyle[dir] = preset - off;\n      }\n    }\n  }\n  css(elem, originalStyle);\n  // force relayout\n  forceRelayout(elem);\n  if ('left' in offset || 'top' in offset) {\n    setTransitionProperty(elem, originalTransition);\n  }\n  var ret = {};\n  for (var _key in offset) {\n    if (offset.hasOwnProperty(_key)) {\n      var _dir = getOffsetDirection(_key, option);\n      var _off = offset[_key] - originalOffset[_key];\n      if (_key === _dir) {\n        ret[_dir] = originalStyle[_dir] + _off;\n      } else {\n        ret[_dir] = originalStyle[_dir] - _off;\n      }\n    }\n  }\n  css(elem, ret);\n}\nfunction setTransform$1(elem, offset) {\n  var originalOffset = getOffset(elem);\n  var originalXY = getTransformXY(elem);\n  var resultXY = {\n    x: originalXY.x,\n    y: originalXY.y\n  };\n  if ('left' in offset) {\n    resultXY.x = originalXY.x + offset.left - originalOffset.left;\n  }\n  if ('top' in offset) {\n    resultXY.y = originalXY.y + offset.top - originalOffset.top;\n  }\n  setTransformXY(elem, resultXY);\n}\nfunction setOffset(elem, offset, option) {\n  if (option.ignoreShake) {\n    var oriOffset = getOffset(elem);\n    var oLeft = oriOffset.left.toFixed(0);\n    var oTop = oriOffset.top.toFixed(0);\n    var tLeft = offset.left.toFixed(0);\n    var tTop = offset.top.toFixed(0);\n    if (oLeft === tLeft && oTop === tTop) {\n      return;\n    }\n  }\n  if (option.useCssRight || option.useCssBottom) {\n    setLeftTop(elem, offset, option);\n  } else if (option.useCssTransform && getTransformName() in document.body.style) {\n    setTransform$1(elem, offset);\n  } else {\n    setLeftTop(elem, offset, option);\n  }\n}\nfunction each(arr, fn) {\n  for (var i = 0; i < arr.length; i++) {\n    fn(arr[i]);\n  }\n}\nfunction isBorderBoxFn(elem) {\n  return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\nvar BOX_MODELS = ['margin', 'border', 'padding'];\nvar CONTENT_INDEX = -1;\nvar PADDING_INDEX = 2;\nvar BORDER_INDEX = 1;\nvar MARGIN_INDEX = 0;\nfunction swap(elem, options, callback) {\n  var old = {};\n  var style = elem.style;\n  var name;\n\n  // Remember the old values, and insert the new ones\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      old[name] = style[name];\n      style[name] = options[name];\n    }\n  }\n  callback.call(elem);\n\n  // Revert the old values\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      style[name] = old[name];\n    }\n  }\n}\nfunction getPBMWidth(elem, props, which) {\n  var value = 0;\n  var prop;\n  var j;\n  var i;\n  for (j = 0; j < props.length; j++) {\n    prop = props[j];\n    if (prop) {\n      for (i = 0; i < which.length; i++) {\n        var cssProp = void 0;\n        if (prop === 'border') {\n          cssProp = \"\".concat(prop).concat(which[i], \"Width\");\n        } else {\n          cssProp = prop + which[i];\n        }\n        value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n      }\n    }\n  }\n  return value;\n}\nvar domUtils = {\n  getParent: function getParent(element) {\n    var parent = element;\n    do {\n      if (parent.nodeType === 11 && parent.host) {\n        parent = parent.host;\n      } else {\n        parent = parent.parentNode;\n      }\n    } while (parent && parent.nodeType !== 1 && parent.nodeType !== 9);\n    return parent;\n  }\n};\neach(['Width', 'Height'], function (name) {\n  domUtils[\"doc\".concat(name)] = function (refWin) {\n    var d = refWin.document;\n    return Math.max(\n    // firefox chrome documentElement.scrollHeight< body.scrollHeight\n    // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n    d.documentElement[\"scroll\".concat(name)],\n    // quirks : documentElement.scrollHeight 最大等于可视窗口多一点？\n    d.body[\"scroll\".concat(name)], domUtils[\"viewport\".concat(name)](d));\n  };\n  domUtils[\"viewport\".concat(name)] = function (win) {\n    // pc browser includes scrollbar in window.innerWidth\n    var prop = \"client\".concat(name);\n    var doc = win.document;\n    var body = doc.body;\n    var documentElement = doc.documentElement;\n    var documentElementProp = documentElement[prop];\n    // 标准模式取 documentElement\n    // backcompat 取 body\n    return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;\n  };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra]  'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, ex) {\n  var extra = ex;\n  if (isWindow(elem)) {\n    return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);\n  } else if (elem.nodeType === 9) {\n    return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);\n  }\n  var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  var borderBoxValue = name === 'width' ? Math.floor(elem.getBoundingClientRect().width) : Math.floor(elem.getBoundingClientRect().height);\n  var isBorderBox = isBorderBoxFn(elem);\n  var cssBoxValue = 0;\n  if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) {\n    borderBoxValue = undefined;\n    // Fall back to computed then un computed css if necessary\n    cssBoxValue = getComputedStyleX(elem, name);\n    if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) {\n      cssBoxValue = elem.style[name] || 0;\n    }\n    // Normalize '', auto, and prepare for extra\n    cssBoxValue = Math.floor(parseFloat(cssBoxValue)) || 0;\n  }\n  if (extra === undefined) {\n    extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n  }\n  var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;\n  var val = borderBoxValue || cssBoxValue;\n  if (extra === CONTENT_INDEX) {\n    if (borderBoxValueOrIsBorderBox) {\n      return val - getPBMWidth(elem, ['border', 'padding'], which);\n    }\n    return cssBoxValue;\n  } else if (borderBoxValueOrIsBorderBox) {\n    if (extra === BORDER_INDEX) {\n      return val;\n    }\n    return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which) : getPBMWidth(elem, ['margin'], which));\n  }\n  return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which);\n}\nvar cssShow = {\n  position: 'absolute',\n  visibility: 'hidden',\n  display: 'block'\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay() {\n  for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n    args[_key2] = arguments[_key2];\n  }\n  var val;\n  var elem = args[0];\n  // in case elem is window\n  // elem.offsetWidth === undefined\n  if (elem.offsetWidth !== 0) {\n    val = getWH.apply(undefined, args);\n  } else {\n    swap(elem, cssShow, function () {\n      val = getWH.apply(undefined, args);\n    });\n  }\n  return val;\n}\neach(['width', 'height'], function (name) {\n  var first = name.charAt(0).toUpperCase() + name.slice(1);\n  domUtils[\"outer\".concat(first)] = function (el, includeMargin) {\n    return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);\n  };\n  var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  domUtils[name] = function (elem, v) {\n    var val = v;\n    if (val !== undefined) {\n      if (elem) {\n        var isBorderBox = isBorderBoxFn(elem);\n        if (isBorderBox) {\n          val += getPBMWidth(elem, ['padding', 'border'], which);\n        }\n        return css(elem, name, val);\n      }\n      return undefined;\n    }\n    return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n  };\n});\nfunction mix(to, from) {\n  for (var i in from) {\n    if (from.hasOwnProperty(i)) {\n      to[i] = from[i];\n    }\n  }\n  return to;\n}\nvar utils = {\n  getWindow: function getWindow(node) {\n    if (node && node.document && node.setTimeout) {\n      return node;\n    }\n    var doc = node.ownerDocument || node;\n    return doc.defaultView || doc.parentWindow;\n  },\n  getDocument: getDocument,\n  offset: function offset(el, value, option) {\n    if (typeof value !== 'undefined') {\n      setOffset(el, value, option || {});\n    } else {\n      return getOffset(el);\n    }\n  },\n  isWindow: isWindow,\n  each: each,\n  css: css,\n  clone: function clone(obj) {\n    var i;\n    var ret = {};\n    for (i in obj) {\n      if (obj.hasOwnProperty(i)) {\n        ret[i] = obj[i];\n      }\n    }\n    var overflow = obj.overflow;\n    if (overflow) {\n      for (i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          ret.overflow[i] = obj.overflow[i];\n        }\n      }\n    }\n    return ret;\n  },\n  mix: mix,\n  getWindowScrollLeft: function getWindowScrollLeft(w) {\n    return getScrollLeft(w);\n  },\n  getWindowScrollTop: function getWindowScrollTop(w) {\n    return getScrollTop(w);\n  },\n  merge: function merge() {\n    var ret = {};\n    for (var i = 0; i < arguments.length; i++) {\n      utils.mix(ret, i < 0 || arguments.length <= i ? undefined : arguments[i]);\n    }\n    return ret;\n  },\n  viewportWidth: 0,\n  viewportHeight: 0\n};\nmix(utils, domUtils);\n\n/**\n * 得到会导致元素显示不全的祖先元素\n */\nvar getParent = utils.getParent;\nfunction getOffsetParent(element) {\n  if (utils.isWindow(element) || element.nodeType === 9) {\n    return null;\n  }\n  // ie 这个也不是完全可行\n  /*\n   <div style=\"width: 50px;height: 100px;overflow: hidden\">\n   <div style=\"width: 50px;height: 100px;position: relative;\" id=\"d6\">\n   元素 6 高 100px 宽 50px<br/>\n   </div>\n   </div>\n   */\n  // element.offsetParent does the right thing in ie7 and below. Return parent with layout!\n  //  In other browsers it only includes elements with position absolute, relative or\n  // fixed, not elements with overflow set to auto or scroll.\n  //        if (UA.ie && ieMode < 8) {\n  //            return element.offsetParent;\n  //        }\n  // 统一的 offsetParent 方法\n  var doc = utils.getDocument(element);\n  var body = doc.body;\n  var parent;\n  var positionStyle = utils.css(element, 'position');\n  var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute';\n  if (!skipStatic) {\n    return element.nodeName.toLowerCase() === 'html' ? null : getParent(element);\n  }\n  for (parent = getParent(element); parent && parent !== body && parent.nodeType !== 9; parent = getParent(parent)) {\n    positionStyle = utils.css(parent, 'position');\n    if (positionStyle !== 'static') {\n      return parent;\n    }\n  }\n  return null;\n}\n\nvar getParent$1 = utils.getParent;\nfunction isAncestorFixed(element) {\n  if (utils.isWindow(element) || element.nodeType === 9) {\n    return false;\n  }\n  var doc = utils.getDocument(element);\n  var body = doc.body;\n  var parent = null;\n  for (parent = getParent$1(element);\n  // 修复元素位于 document.documentElement 下导致崩溃问题\n  parent && parent !== body && parent !== doc; parent = getParent$1(parent)) {\n    var positionStyle = utils.css(parent, 'position');\n    if (positionStyle === 'fixed') {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * 获得元素的显示部分的区域\n */\nfunction getVisibleRectForElement(element, alwaysByViewport) {\n  var visibleRect = {\n    left: 0,\n    right: Infinity,\n    top: 0,\n    bottom: Infinity\n  };\n  var el = getOffsetParent(element);\n  var doc = utils.getDocument(element);\n  var win = doc.defaultView || doc.parentWindow;\n  var body = doc.body;\n  var documentElement = doc.documentElement;\n\n  // Determine the size of the visible rect by climbing the dom accounting for\n  // all scrollable containers.\n  while (el) {\n    // clientWidth is zero for inline block elements in ie.\n    if ((navigator.userAgent.indexOf('MSIE') === -1 || el.clientWidth !== 0) &&\n    // body may have overflow set on it, yet we still get the entire\n    // viewport. In some browsers, el.offsetParent may be\n    // document.documentElement, so check for that too.\n    el !== body && el !== documentElement && utils.css(el, 'overflow') !== 'visible') {\n      var pos = utils.offset(el);\n      // add border\n      pos.left += el.clientLeft;\n      pos.top += el.clientTop;\n      visibleRect.top = Math.max(visibleRect.top, pos.top);\n      visibleRect.right = Math.min(visibleRect.right,\n      // consider area without scrollBar\n      pos.left + el.clientWidth);\n      visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);\n      visibleRect.left = Math.max(visibleRect.left, pos.left);\n    } else if (el === body || el === documentElement) {\n      break;\n    }\n    el = getOffsetParent(el);\n  }\n\n  // Set element position to fixed\n  // make sure absolute element itself don't affect it's visible area\n  // https://github.com/ant-design/ant-design/issues/7601\n  var originalPosition = null;\n  if (!utils.isWindow(element) && element.nodeType !== 9) {\n    originalPosition = element.style.position;\n    var position = utils.css(element, 'position');\n    if (position === 'absolute') {\n      element.style.position = 'fixed';\n    }\n  }\n  var scrollX = utils.getWindowScrollLeft(win);\n  var scrollY = utils.getWindowScrollTop(win);\n  var viewportWidth = utils.viewportWidth(win);\n  var viewportHeight = utils.viewportHeight(win);\n  var documentWidth = documentElement.scrollWidth;\n  var documentHeight = documentElement.scrollHeight;\n\n  // scrollXXX on html is sync with body which means overflow: hidden on body gets wrong scrollXXX.\n  // We should cut this ourself.\n  var bodyStyle = window.getComputedStyle(body);\n  if (bodyStyle.overflowX === 'hidden') {\n    documentWidth = win.innerWidth;\n  }\n  if (bodyStyle.overflowY === 'hidden') {\n    documentHeight = win.innerHeight;\n  }\n\n  // Reset element position after calculate the visible area\n  if (element.style) {\n    element.style.position = originalPosition;\n  }\n  if (alwaysByViewport || isAncestorFixed(element)) {\n    // Clip by viewport's size.\n    visibleRect.left = Math.max(visibleRect.left, scrollX);\n    visibleRect.top = Math.max(visibleRect.top, scrollY);\n    visibleRect.right = Math.min(visibleRect.right, scrollX + viewportWidth);\n    visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + viewportHeight);\n  } else {\n    // Clip by document's size.\n    var maxVisibleWidth = Math.max(documentWidth, scrollX + viewportWidth);\n    visibleRect.right = Math.min(visibleRect.right, maxVisibleWidth);\n    var maxVisibleHeight = Math.max(documentHeight, scrollY + viewportHeight);\n    visibleRect.bottom = Math.min(visibleRect.bottom, maxVisibleHeight);\n  }\n  return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;\n}\n\nfunction adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {\n  var pos = utils.clone(elFuturePos);\n  var size = {\n    width: elRegion.width,\n    height: elRegion.height\n  };\n  if (overflow.adjustX && pos.left < visibleRect.left) {\n    pos.left = visibleRect.left;\n  }\n\n  // Left edge inside and right edge outside viewport, try to resize it.\n  if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {\n    size.width -= pos.left + size.width - visibleRect.right;\n  }\n\n  // Right edge outside viewport, try to move it.\n  if (overflow.adjustX && pos.left + size.width > visibleRect.right) {\n    // 保证左边界和可视区域左边界对齐\n    pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);\n  }\n\n  // Top edge outside viewport, try to move it.\n  if (overflow.adjustY && pos.top < visibleRect.top) {\n    pos.top = visibleRect.top;\n  }\n\n  // Top edge inside and bottom edge outside viewport, try to resize it.\n  if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {\n    size.height -= pos.top + size.height - visibleRect.bottom;\n  }\n\n  // Bottom edge outside viewport, try to move it.\n  if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {\n    // 保证上边界和可视区域上边界对齐\n    pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);\n  }\n  return utils.mix(pos, size);\n}\n\nfunction getRegion(node) {\n  var offset;\n  var w;\n  var h;\n  if (!utils.isWindow(node) && node.nodeType !== 9) {\n    offset = utils.offset(node);\n    w = utils.outerWidth(node);\n    h = utils.outerHeight(node);\n  } else {\n    var win = utils.getWindow(node);\n    offset = {\n      left: utils.getWindowScrollLeft(win),\n      top: utils.getWindowScrollTop(win)\n    };\n    w = utils.viewportWidth(win);\n    h = utils.viewportHeight(win);\n  }\n  offset.width = w;\n  offset.height = h;\n  return offset;\n}\n\n/**\n * 获取 node 上的 align 对齐点 相对于页面的坐标\n */\n\nfunction getAlignOffset(region, align) {\n  var V = align.charAt(0);\n  var H = align.charAt(1);\n  var w = region.width;\n  var h = region.height;\n  var x = region.left;\n  var y = region.top;\n  if (V === 'c') {\n    y += h / 2;\n  } else if (V === 'b') {\n    y += h;\n  }\n  if (H === 'c') {\n    x += w / 2;\n  } else if (H === 'r') {\n    x += w;\n  }\n  return {\n    left: x,\n    top: y\n  };\n}\n\nfunction getElFuturePos(elRegion, refNodeRegion, points, offset, targetOffset) {\n  var p1 = getAlignOffset(refNodeRegion, points[1]);\n  var p2 = getAlignOffset(elRegion, points[0]);\n  var diff = [p2.left - p1.left, p2.top - p1.top];\n  return {\n    left: Math.round(elRegion.left - diff[0] + offset[0] - targetOffset[0]),\n    top: Math.round(elRegion.top - diff[1] + offset[1] - targetOffset[1])\n  };\n}\n\n/**\n * align dom node flexibly\n * @author yiminghe@gmail.com\n */\n\n// http://yiminghe.iteye.com/blog/1124720\n\nfunction isFailX(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;\n}\nfunction isFailY(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;\n}\nfunction isCompleteFailX(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;\n}\nfunction isCompleteFailY(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;\n}\nfunction flip(points, reg, map) {\n  var ret = [];\n  utils.each(points, function (p) {\n    ret.push(p.replace(reg, function (m) {\n      return map[m];\n    }));\n  });\n  return ret;\n}\nfunction flipOffset(offset, index) {\n  offset[index] = -offset[index];\n  return offset;\n}\nfunction convertOffset(str, offsetLen) {\n  var n;\n  if (/%$/.test(str)) {\n    n = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;\n  } else {\n    n = parseInt(str, 10);\n  }\n  return n || 0;\n}\nfunction normalizeOffset(offset, el) {\n  offset[0] = convertOffset(offset[0], el.width);\n  offset[1] = convertOffset(offset[1], el.height);\n}\n\n/**\n * @param el\n * @param tgtRegion 参照节点所占的区域: { left, top, width, height }\n * @param align\n */\nfunction doAlign(el, tgtRegion, align, isTgtRegionVisible) {\n  var points = align.points;\n  var offset = align.offset || [0, 0];\n  var targetOffset = align.targetOffset || [0, 0];\n  var overflow = align.overflow;\n  var source = align.source || el;\n  offset = [].concat(offset);\n  targetOffset = [].concat(targetOffset);\n  overflow = overflow || {};\n  var newOverflowCfg = {};\n  var fail = 0;\n  var alwaysByViewport = !!(overflow && overflow.alwaysByViewport);\n  // 当前节点可以被放置的显示区域\n  var visibleRect = getVisibleRectForElement(source, alwaysByViewport);\n  // 当前节点所占的区域, left/top/width/height\n  var elRegion = getRegion(source);\n  // 将 offset 转换成数值，支持百分比\n  normalizeOffset(offset, elRegion);\n  normalizeOffset(targetOffset, tgtRegion);\n  // 当前节点将要被放置的位置\n  var elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset);\n  // 当前节点将要所处的区域\n  var newElRegion = utils.merge(elRegion, elFuturePos);\n\n  // 如果可视区域不能完全放置当前节点时允许调整\n  if (visibleRect && (overflow.adjustX || overflow.adjustY) && isTgtRegionVisible) {\n    if (overflow.adjustX) {\n      // 如果横向不能放下\n      if (isFailX(elFuturePos, elRegion, visibleRect)) {\n        // 对齐位置反下\n        var newPoints = flip(points, /[lr]/gi, {\n          l: 'r',\n          r: 'l'\n        });\n        // 偏移量也反下\n        var newOffset = flipOffset(offset, 0);\n        var newTargetOffset = flipOffset(targetOffset, 0);\n        var newElFuturePos = getElFuturePos(elRegion, tgtRegion, newPoints, newOffset, newTargetOffset);\n        if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {\n          fail = 1;\n          points = newPoints;\n          offset = newOffset;\n          targetOffset = newTargetOffset;\n        }\n      }\n    }\n    if (overflow.adjustY) {\n      // 如果纵向不能放下\n      if (isFailY(elFuturePos, elRegion, visibleRect)) {\n        // 对齐位置反下\n        var _newPoints = flip(points, /[tb]/gi, {\n          t: 'b',\n          b: 't'\n        });\n        // 偏移量也反下\n        var _newOffset = flipOffset(offset, 1);\n        var _newTargetOffset = flipOffset(targetOffset, 1);\n        var _newElFuturePos = getElFuturePos(elRegion, tgtRegion, _newPoints, _newOffset, _newTargetOffset);\n        if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {\n          fail = 1;\n          points = _newPoints;\n          offset = _newOffset;\n          targetOffset = _newTargetOffset;\n        }\n      }\n    }\n\n    // 如果失败，重新计算当前节点将要被放置的位置\n    if (fail) {\n      elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset);\n      utils.mix(newElRegion, elFuturePos);\n    }\n    var isStillFailX = isFailX(elFuturePos, elRegion, visibleRect);\n    var isStillFailY = isFailY(elFuturePos, elRegion, visibleRect);\n    // 检查反下后的位置是否可以放下了，如果仍然放不下：\n    // 1. 复原修改过的定位参数\n    if (isStillFailX || isStillFailY) {\n      var _newPoints2 = points;\n\n      // 重置对应部分的翻转逻辑\n      if (isStillFailX) {\n        _newPoints2 = flip(points, /[lr]/gi, {\n          l: 'r',\n          r: 'l'\n        });\n      }\n      if (isStillFailY) {\n        _newPoints2 = flip(points, /[tb]/gi, {\n          t: 'b',\n          b: 't'\n        });\n      }\n      points = _newPoints2;\n      offset = align.offset || [0, 0];\n      targetOffset = align.targetOffset || [0, 0];\n    }\n    // 2. 只有指定了可以调整当前方向才调整\n    newOverflowCfg.adjustX = overflow.adjustX && isStillFailX;\n    newOverflowCfg.adjustY = overflow.adjustY && isStillFailY;\n\n    // 确实要调整，甚至可能会调整高度宽度\n    if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {\n      newElRegion = adjustForViewport(elFuturePos, elRegion, visibleRect, newOverflowCfg);\n    }\n  }\n\n  // need judge to in case set fixed with in css on height auto element\n  if (newElRegion.width !== elRegion.width) {\n    utils.css(source, 'width', utils.width(source) + newElRegion.width - elRegion.width);\n  }\n  if (newElRegion.height !== elRegion.height) {\n    utils.css(source, 'height', utils.height(source) + newElRegion.height - elRegion.height);\n  }\n\n  // https://github.com/kissyteam/kissy/issues/190\n  // 相对于屏幕位置没变，而 left/top 变了\n  // 例如 <div 'relative'><el absolute></div>\n  utils.offset(source, {\n    left: newElRegion.left,\n    top: newElRegion.top\n  }, {\n    useCssRight: align.useCssRight,\n    useCssBottom: align.useCssBottom,\n    useCssTransform: align.useCssTransform,\n    ignoreShake: align.ignoreShake\n  });\n  return {\n    points: points,\n    offset: offset,\n    targetOffset: targetOffset,\n    overflow: newOverflowCfg\n  };\n}\n/**\n *  2012-04-26 yiminghe@gmail.com\n *   - 优化智能对齐算法\n *   - 慎用 resizeXX\n *\n *  2011-07-13 yiminghe@gmail.com note:\n *   - 增加智能对齐，以及大小调整选项\n **/\n\nfunction isOutOfVisibleRect(target, alwaysByViewport) {\n  var visibleRect = getVisibleRectForElement(target, alwaysByViewport);\n  var targetRegion = getRegion(target);\n  return !visibleRect || targetRegion.left + targetRegion.width <= visibleRect.left || targetRegion.top + targetRegion.height <= visibleRect.top || targetRegion.left >= visibleRect.right || targetRegion.top >= visibleRect.bottom;\n}\nfunction alignElement(el, refNode, align) {\n  var target = align.target || refNode;\n  var refNodeRegion = getRegion(target);\n  var isTargetNotOutOfVisible = !isOutOfVisibleRect(target, align.overflow && align.overflow.alwaysByViewport);\n  return doAlign(el, refNodeRegion, align, isTargetNotOutOfVisible);\n}\nalignElement.__getOffsetParent = getOffsetParent;\nalignElement.__getVisibleRectForElement = getVisibleRectForElement;\n\n/**\n * `tgtPoint`: { pageX, pageY } or { clientX, clientY }.\n * If client position provided, will internal convert to page position.\n */\n\nfunction alignPoint(el, tgtPoint, align) {\n  var pageX;\n  var pageY;\n  var doc = utils.getDocument(el);\n  var win = doc.defaultView || doc.parentWindow;\n  var scrollX = utils.getWindowScrollLeft(win);\n  var scrollY = utils.getWindowScrollTop(win);\n  var viewportWidth = utils.viewportWidth(win);\n  var viewportHeight = utils.viewportHeight(win);\n  if ('pageX' in tgtPoint) {\n    pageX = tgtPoint.pageX;\n  } else {\n    pageX = scrollX + tgtPoint.clientX;\n  }\n  if ('pageY' in tgtPoint) {\n    pageY = tgtPoint.pageY;\n  } else {\n    pageY = scrollY + tgtPoint.clientY;\n  }\n  var tgtRegion = {\n    left: pageX,\n    top: pageY,\n    width: 0,\n    height: 0\n  };\n  var pointInView = pageX >= 0 && pageX <= scrollX + viewportWidth && pageY >= 0 && pageY <= scrollY + viewportHeight;\n\n  // Provide default target point\n  var points = [align.points[0], 'cc'];\n  return doAlign(el, tgtRegion, _objectSpread2(_objectSpread2({}, align), {}, {\n    points: points\n  }), pointInView);\n}\n\nexport default alignElement;\nexport { alignElement, alignPoint };\n//# sourceMappingURL=index.js.map\n","import _extends from 'babel-runtime/helpers/extends';\nfunction isPointsEq(a1, a2, isAlignPoint) {\n  if (isAlignPoint) {\n    return a1[0] === a2[0];\n  }\n  return a1[0] === a2[0] && a1[1] === a2[1];\n}\n\nexport function getAlignFromPlacement(builtinPlacements, placementStr, align) {\n  var baseAlign = builtinPlacements[placementStr] || {};\n  return _extends({}, baseAlign, align);\n}\n\nexport function getAlignPopupClassName(builtinPlacements, prefixCls, align, isAlignPoint) {\n  var points = align.points;\n  for (var placement in builtinPlacements) {\n    if (builtinPlacements.hasOwnProperty(placement)) {\n      if (isPointsEq(builtinPlacements[placement].points, points, isAlignPoint)) {\n        return prefixCls + '-placement-' + placement;\n      }\n    }\n  }\n  return '';\n}\n\nexport function saveRef(name, component) {\n  this[name] = component;\n}","import contains from 'rc-util/es/Dom/contains';\n\nexport function buffer(fn, ms) {\n  var timer = void 0;\n\n  function clear() {\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n  }\n\n  function bufferFn() {\n    clear();\n    timer = setTimeout(fn, ms);\n  }\n\n  bufferFn.clear = clear;\n\n  return bufferFn;\n}\n\nexport function isSamePoint(prev, next) {\n  if (prev === next) return true;\n  if (!prev || !next) return false;\n\n  if ('pageX' in next && 'pageY' in next) {\n    return prev.pageX === next.pageX && prev.pageY === next.pageY;\n  }\n\n  if ('clientX' in next && 'clientY' in next) {\n    return prev.clientX === next.clientX && prev.clientY === next.clientY;\n  }\n\n  return false;\n}\n\nexport function isWindow(obj) {\n  return obj && typeof obj === 'object' && obj.window === obj;\n}\n\nexport function isSimilarValue(val1, val2) {\n  var int1 = Math.floor(val1);\n  var int2 = Math.floor(val2);\n  return Math.abs(int1 - int2) <= 1;\n}\n\nexport function restoreFocus(activeElement, container) {\n  // Focus back if is in the container\n  if (activeElement !== document.activeElement && contains(container, activeElement)) {\n    activeElement.focus();\n  }\n}","import _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport { alignElement, alignPoint } from 'dom-align';\nimport addEventListener from 'rc-util/es/Dom/addEventListener';\n\nimport { isWindow, buffer, isSamePoint, isSimilarValue, restoreFocus } from './util';\n\nfunction getElement(func) {\n  if (typeof func !== 'function' || !func) return null;\n  return func();\n}\n\nfunction getPoint(point) {\n  if (typeof point !== 'object' || !point) return null;\n  return point;\n}\n\nvar Align = function (_Component) {\n  _inherits(Align, _Component);\n\n  function Align() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Align);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Align.__proto__ || Object.getPrototypeOf(Align)).call.apply(_ref, [this].concat(args))), _this), _this.forceAlign = function () {\n      var _this$props = _this.props,\n          disabled = _this$props.disabled,\n          target = _this$props.target,\n          align = _this$props.align,\n          onAlign = _this$props.onAlign;\n\n      if (!disabled && target) {\n        var source = ReactDOM.findDOMNode(_this);\n\n        var result = void 0;\n        var element = getElement(target);\n        var point = getPoint(target);\n\n        // IE lose focus after element realign\n        // We should record activeElement and restore later\n        var activeElement = document.activeElement;\n\n        if (element) {\n          result = alignElement(source, element, align);\n        } else if (point) {\n          result = alignPoint(source, point, align);\n        }\n\n        restoreFocus(activeElement, source);\n\n        if (onAlign) {\n          onAlign(source, result);\n        }\n      }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Align, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var props = this.props;\n      // if parent ref not attached .... use document.getElementById\n      this.forceAlign();\n      if (!props.disabled && props.monitorWindowResize) {\n        this.startMonitorWindowResize();\n      }\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(prevProps) {\n      var reAlign = false;\n      var props = this.props;\n\n      if (!props.disabled) {\n        var source = ReactDOM.findDOMNode(this);\n        var sourceRect = source ? source.getBoundingClientRect() : null;\n\n        if (prevProps.disabled) {\n          reAlign = true;\n        } else {\n          var lastElement = getElement(prevProps.target);\n          var currentElement = getElement(props.target);\n          var lastPoint = getPoint(prevProps.target);\n          var currentPoint = getPoint(props.target);\n\n          if (isWindow(lastElement) && isWindow(currentElement)) {\n            // Skip if is window\n            reAlign = false;\n          } else if (lastElement !== currentElement || // Element change\n          lastElement && !currentElement && currentPoint || // Change from element to point\n          lastPoint && currentPoint && currentElement || // Change from point to element\n          currentPoint && !isSamePoint(lastPoint, currentPoint)) {\n            reAlign = true;\n          }\n\n          // If source element size changed\n          var preRect = this.sourceRect || {};\n          if (!reAlign && source && (!isSimilarValue(preRect.width, sourceRect.width) || !isSimilarValue(preRect.height, sourceRect.height))) {\n            reAlign = true;\n          }\n        }\n\n        this.sourceRect = sourceRect;\n      }\n\n      if (reAlign) {\n        this.forceAlign();\n      }\n\n      if (props.monitorWindowResize && !props.disabled) {\n        this.startMonitorWindowResize();\n      } else {\n        this.stopMonitorWindowResize();\n      }\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.stopMonitorWindowResize();\n    }\n  }, {\n    key: 'startMonitorWindowResize',\n    value: function startMonitorWindowResize() {\n      if (!this.resizeHandler) {\n        this.bufferMonitor = buffer(this.forceAlign, this.props.monitorBufferTime);\n        this.resizeHandler = addEventListener(window, 'resize', this.bufferMonitor);\n      }\n    }\n  }, {\n    key: 'stopMonitorWindowResize',\n    value: function stopMonitorWindowResize() {\n      if (this.resizeHandler) {\n        this.bufferMonitor.clear();\n        this.resizeHandler.remove();\n        this.resizeHandler = null;\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this2 = this;\n\n      var _props = this.props,\n          childrenProps = _props.childrenProps,\n          children = _props.children;\n\n      var child = React.Children.only(children);\n      if (childrenProps) {\n        var newProps = {};\n        var propList = Object.keys(childrenProps);\n        propList.forEach(function (prop) {\n          newProps[prop] = _this2.props[childrenProps[prop]];\n        });\n\n        return React.cloneElement(child, newProps);\n      }\n      return child;\n    }\n  }]);\n\n  return Align;\n}(Component);\n\nAlign.propTypes = {\n  childrenProps: PropTypes.object,\n  align: PropTypes.object.isRequired,\n  target: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({\n    clientX: PropTypes.number,\n    clientY: PropTypes.number,\n    pageX: PropTypes.number,\n    pageY: PropTypes.number\n  })]),\n  onAlign: PropTypes.func,\n  monitorBufferTime: PropTypes.number,\n  monitorWindowResize: PropTypes.bool,\n  disabled: PropTypes.bool,\n  children: PropTypes.any\n};\nAlign.defaultProps = {\n  target: function target() {\n    return window;\n  },\n  monitorBufferTime: 50,\n  monitorWindowResize: false,\n  disabled: false\n};\n\n\nexport default Align;","// export this package's api\nimport Align from './Align';\n\nexport default Align;","import React from 'react';\n\nvar unsafeLifecyclesPolyfill = function unsafeLifecyclesPolyfill(Component) {\n  var prototype = Component.prototype;\n\n  if (!prototype || !prototype.isReactComponent) {\n    throw new Error('Can only polyfill class components');\n  } // only handle componentWillReceiveProps\n\n\n  if (typeof prototype.componentWillReceiveProps !== 'function') {\n    return Component;\n  } // In React 16.9, React.Profiler was introduced together with UNSAFE_componentWillReceiveProps\n  // https://reactjs.org/blog/2019/08/08/react-v16.9.0.html#performance-measurements-with-reactprofiler\n\n\n  if (!React.Profiler) {\n    return Component;\n  } // Here polyfill get started\n\n\n  prototype.UNSAFE_componentWillReceiveProps = prototype.componentWillReceiveProps;\n  delete prototype.componentWillReceiveProps;\n  return Component;\n};\n\nexport default unsafeLifecyclesPolyfill;","import React from 'react';\n\nexport function toArrayChildren(children) {\n  var ret = [];\n  React.Children.forEach(children, function (child) {\n    ret.push(child);\n  });\n  return ret;\n}\n\nexport function findChildInChildrenByKey(children, key) {\n  var ret = null;\n  if (children) {\n    children.forEach(function (child) {\n      if (ret) {\n        return;\n      }\n      if (child && child.key === key) {\n        ret = child;\n      }\n    });\n  }\n  return ret;\n}\n\nexport function findShownChildInChildrenByKey(children, key, showProp) {\n  var ret = null;\n  if (children) {\n    children.forEach(function (child) {\n      if (child && child.key === key && child.props[showProp]) {\n        if (ret) {\n          throw new Error('two child with same key for <rc-animate> children');\n        }\n        ret = child;\n      }\n    });\n  }\n  return ret;\n}\n\nexport function findHiddenChildInChildrenByKey(children, key, showProp) {\n  var found = 0;\n  if (children) {\n    children.forEach(function (child) {\n      if (found) {\n        return;\n      }\n      found = child && child.key === key && !child.props[showProp];\n    });\n  }\n  return found;\n}\n\nexport function isSameChildren(c1, c2, showProp) {\n  var same = c1.length === c2.length;\n  if (same) {\n    c1.forEach(function (child, index) {\n      var child2 = c2[index];\n      if (child && child2) {\n        if (child && !child2 || !child && child2) {\n          same = false;\n        } else if (child.key !== child2.key) {\n          same = false;\n        } else if (showProp && child.props[showProp] !== child2.props[showProp]) {\n          same = false;\n        }\n      }\n    });\n  }\n  return same;\n}\n\nexport function mergeChildren(prev, next) {\n  var ret = [];\n\n  // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n  var nextChildrenPending = {};\n  var pendingChildren = [];\n  prev.forEach(function (child) {\n    if (child && findChildInChildrenByKey(next, child.key)) {\n      if (pendingChildren.length) {\n        nextChildrenPending[child.key] = pendingChildren;\n        pendingChildren = [];\n      }\n    } else {\n      pendingChildren.push(child);\n    }\n  });\n\n  next.forEach(function (child) {\n    if (child && Object.prototype.hasOwnProperty.call(nextChildrenPending, child.key)) {\n      ret = ret.concat(nextChildrenPending[child.key]);\n    }\n    ret.push(child);\n  });\n\n  ret = ret.concat(pendingChildren);\n\n  return ret;\n}","var START_EVENT_NAME_MAP = {\n  transitionstart: {\n    transition: 'transitionstart',\n    WebkitTransition: 'webkitTransitionStart',\n    MozTransition: 'mozTransitionStart',\n    OTransition: 'oTransitionStart',\n    msTransition: 'MSTransitionStart'\n  },\n\n  animationstart: {\n    animation: 'animationstart',\n    WebkitAnimation: 'webkitAnimationStart',\n    MozAnimation: 'mozAnimationStart',\n    OAnimation: 'oAnimationStart',\n    msAnimation: 'MSAnimationStart'\n  }\n};\n\nvar END_EVENT_NAME_MAP = {\n  transitionend: {\n    transition: 'transitionend',\n    WebkitTransition: 'webkitTransitionEnd',\n    MozTransition: 'mozTransitionEnd',\n    OTransition: 'oTransitionEnd',\n    msTransition: 'MSTransitionEnd'\n  },\n\n  animationend: {\n    animation: 'animationend',\n    WebkitAnimation: 'webkitAnimationEnd',\n    MozAnimation: 'mozAnimationEnd',\n    OAnimation: 'oAnimationEnd',\n    msAnimation: 'MSAnimationEnd'\n  }\n};\n\nvar startEvents = [];\nvar endEvents = [];\n\nfunction detectEvents() {\n  var testEl = document.createElement('div');\n  var style = testEl.style;\n\n  if (!('AnimationEvent' in window)) {\n    delete START_EVENT_NAME_MAP.animationstart.animation;\n    delete END_EVENT_NAME_MAP.animationend.animation;\n  }\n\n  if (!('TransitionEvent' in window)) {\n    delete START_EVENT_NAME_MAP.transitionstart.transition;\n    delete END_EVENT_NAME_MAP.transitionend.transition;\n  }\n\n  function process(EVENT_NAME_MAP, events) {\n    for (var baseEventName in EVENT_NAME_MAP) {\n      if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {\n        var baseEvents = EVENT_NAME_MAP[baseEventName];\n        for (var styleName in baseEvents) {\n          if (styleName in style) {\n            events.push(baseEvents[styleName]);\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  process(START_EVENT_NAME_MAP, startEvents);\n  process(END_EVENT_NAME_MAP, endEvents);\n}\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n  detectEvents();\n}\n\nfunction addEventListener(node, eventName, eventListener) {\n  node.addEventListener(eventName, eventListener, false);\n}\n\nfunction removeEventListener(node, eventName, eventListener) {\n  node.removeEventListener(eventName, eventListener, false);\n}\n\nvar TransitionEvents = {\n  // Start events\n  startEvents: startEvents,\n\n  addStartEventListener: function addStartEventListener(node, eventListener) {\n    if (startEvents.length === 0) {\n      window.setTimeout(eventListener, 0);\n      return;\n    }\n    startEvents.forEach(function (startEvent) {\n      addEventListener(node, startEvent, eventListener);\n    });\n  },\n  removeStartEventListener: function removeStartEventListener(node, eventListener) {\n    if (startEvents.length === 0) {\n      return;\n    }\n    startEvents.forEach(function (startEvent) {\n      removeEventListener(node, startEvent, eventListener);\n    });\n  },\n\n\n  // End events\n  endEvents: endEvents,\n\n  addEndEventListener: function addEndEventListener(node, eventListener) {\n    if (endEvents.length === 0) {\n      window.setTimeout(eventListener, 0);\n      return;\n    }\n    endEvents.forEach(function (endEvent) {\n      addEventListener(node, endEvent, eventListener);\n    });\n  },\n  removeEndEventListener: function removeEndEventListener(node, eventListener) {\n    if (endEvents.length === 0) {\n      return;\n    }\n    endEvents.forEach(function (endEvent) {\n      removeEventListener(node, endEvent, eventListener);\n    });\n  }\n};\n\nexport default TransitionEvents;","import _typeof from 'babel-runtime/helpers/typeof';\nimport Event from './Event';\nimport classes from 'component-classes';\n\nvar isCssAnimationSupported = Event.endEvents.length !== 0;\nvar capitalPrefixes = ['Webkit', 'Moz', 'O',\n// ms is special .... !\n'ms'];\nvar prefixes = ['-webkit-', '-moz-', '-o-', 'ms-', ''];\n\nfunction getStyleProperty(node, name) {\n  // old ff need null, https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle\n  var style = window.getComputedStyle(node, null);\n  var ret = '';\n  for (var i = 0; i < prefixes.length; i++) {\n    ret = style.getPropertyValue(prefixes[i] + name);\n    if (ret) {\n      break;\n    }\n  }\n  return ret;\n}\n\nfunction fixBrowserByTimeout(node) {\n  if (isCssAnimationSupported) {\n    var transitionDelay = parseFloat(getStyleProperty(node, 'transition-delay')) || 0;\n    var transitionDuration = parseFloat(getStyleProperty(node, 'transition-duration')) || 0;\n    var animationDelay = parseFloat(getStyleProperty(node, 'animation-delay')) || 0;\n    var animationDuration = parseFloat(getStyleProperty(node, 'animation-duration')) || 0;\n    var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);\n    // sometimes, browser bug\n    node.rcEndAnimTimeout = setTimeout(function () {\n      node.rcEndAnimTimeout = null;\n      if (node.rcEndListener) {\n        node.rcEndListener();\n      }\n    }, time * 1000 + 200);\n  }\n}\n\nfunction clearBrowserBugTimeout(node) {\n  if (node.rcEndAnimTimeout) {\n    clearTimeout(node.rcEndAnimTimeout);\n    node.rcEndAnimTimeout = null;\n  }\n}\n\nvar cssAnimation = function cssAnimation(node, transitionName, endCallback) {\n  var nameIsObj = (typeof transitionName === 'undefined' ? 'undefined' : _typeof(transitionName)) === 'object';\n  var className = nameIsObj ? transitionName.name : transitionName;\n  var activeClassName = nameIsObj ? transitionName.active : transitionName + '-active';\n  var end = endCallback;\n  var start = void 0;\n  var active = void 0;\n  var nodeClasses = classes(node);\n\n  if (endCallback && Object.prototype.toString.call(endCallback) === '[object Object]') {\n    end = endCallback.end;\n    start = endCallback.start;\n    active = endCallback.active;\n  }\n\n  if (node.rcEndListener) {\n    node.rcEndListener();\n  }\n\n  node.rcEndListener = function (e) {\n    if (e && e.target !== node) {\n      return;\n    }\n\n    if (node.rcAnimTimeout) {\n      clearTimeout(node.rcAnimTimeout);\n      node.rcAnimTimeout = null;\n    }\n\n    clearBrowserBugTimeout(node);\n\n    nodeClasses.remove(className);\n    nodeClasses.remove(activeClassName);\n\n    Event.removeEndEventListener(node, node.rcEndListener);\n    node.rcEndListener = null;\n\n    // Usually this optional end is used for informing an owner of\n    // a leave animation and telling it to remove the child.\n    if (end) {\n      end();\n    }\n  };\n\n  Event.addEndEventListener(node, node.rcEndListener);\n\n  if (start) {\n    start();\n  }\n  nodeClasses.add(className);\n\n  node.rcAnimTimeout = setTimeout(function () {\n    node.rcAnimTimeout = null;\n    nodeClasses.add(activeClassName);\n    if (active) {\n      setTimeout(active, 0);\n    }\n    fixBrowserByTimeout(node);\n    // 30ms for firefox\n  }, 30);\n\n  return {\n    stop: function stop() {\n      if (node.rcEndListener) {\n        node.rcEndListener();\n      }\n    }\n  };\n};\n\ncssAnimation.style = function (node, style, callback) {\n  if (node.rcEndListener) {\n    node.rcEndListener();\n  }\n\n  node.rcEndListener = function (e) {\n    if (e && e.target !== node) {\n      return;\n    }\n\n    if (node.rcAnimTimeout) {\n      clearTimeout(node.rcAnimTimeout);\n      node.rcAnimTimeout = null;\n    }\n\n    clearBrowserBugTimeout(node);\n\n    Event.removeEndEventListener(node, node.rcEndListener);\n    node.rcEndListener = null;\n\n    // Usually this optional callback is used for informing an owner of\n    // a leave animation and telling it to remove the child.\n    if (callback) {\n      callback();\n    }\n  };\n\n  Event.addEndEventListener(node, node.rcEndListener);\n\n  node.rcAnimTimeout = setTimeout(function () {\n    for (var s in style) {\n      if (style.hasOwnProperty(s)) {\n        node.style[s] = style[s];\n      }\n    }\n    node.rcAnimTimeout = null;\n    fixBrowserByTimeout(node);\n  }, 0);\n};\n\ncssAnimation.setTransition = function (node, p, value) {\n  var property = p;\n  var v = value;\n  if (value === undefined) {\n    v = property;\n    property = '';\n  }\n  property = property || '';\n  capitalPrefixes.forEach(function (prefix) {\n    node.style[prefix + 'Transition' + property] = v;\n  });\n};\n\ncssAnimation.isCssAnimationSupported = isCssAnimationSupported;\n\nexport { isCssAnimationSupported };\n\nexport default cssAnimation;","var util = {\n  isAppearSupported: function isAppearSupported(props) {\n    return props.transitionName && props.transitionAppear || props.animation.appear;\n  },\n  isEnterSupported: function isEnterSupported(props) {\n    return props.transitionName && props.transitionEnter || props.animation.enter;\n  },\n  isLeaveSupported: function isLeaveSupported(props) {\n    return props.transitionName && props.transitionLeave || props.animation.leave;\n  },\n  allowAppearCallback: function allowAppearCallback(props) {\n    return props.transitionAppear || props.animation.appear;\n  },\n  allowEnterCallback: function allowEnterCallback(props) {\n    return props.transitionEnter || props.animation.enter;\n  },\n  allowLeaveCallback: function allowLeaveCallback(props) {\n    return props.transitionLeave || props.animation.leave;\n  }\n};\nexport default util;","import _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport cssAnimate, { isCssAnimationSupported } from 'css-animation';\nimport animUtil from './util/animate';\n\nvar transitionMap = {\n  enter: 'transitionEnter',\n  appear: 'transitionAppear',\n  leave: 'transitionLeave'\n};\n\nvar AnimateChild = function (_React$Component) {\n  _inherits(AnimateChild, _React$Component);\n\n  function AnimateChild() {\n    _classCallCheck(this, AnimateChild);\n\n    return _possibleConstructorReturn(this, (AnimateChild.__proto__ || Object.getPrototypeOf(AnimateChild)).apply(this, arguments));\n  }\n\n  _createClass(AnimateChild, [{\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this.stop();\n    }\n  }, {\n    key: 'componentWillEnter',\n    value: function componentWillEnter(done) {\n      if (animUtil.isEnterSupported(this.props)) {\n        this.transition('enter', done);\n      } else {\n        done();\n      }\n    }\n  }, {\n    key: 'componentWillAppear',\n    value: function componentWillAppear(done) {\n      if (animUtil.isAppearSupported(this.props)) {\n        this.transition('appear', done);\n      } else {\n        done();\n      }\n    }\n  }, {\n    key: 'componentWillLeave',\n    value: function componentWillLeave(done) {\n      if (animUtil.isLeaveSupported(this.props)) {\n        this.transition('leave', done);\n      } else {\n        // always sync, do not interupt with react component life cycle\n        // update hidden -> animate hidden ->\n        // didUpdate -> animate leave -> unmount (if animate is none)\n        done();\n      }\n    }\n  }, {\n    key: 'transition',\n    value: function transition(animationType, finishCallback) {\n      var _this2 = this;\n\n      var node = ReactDOM.findDOMNode(this);\n      var props = this.props;\n      var transitionName = props.transitionName;\n      var nameIsObj = typeof transitionName === 'object';\n      this.stop();\n      var end = function end() {\n        _this2.stopper = null;\n        finishCallback();\n      };\n      if ((isCssAnimationSupported || !props.animation[animationType]) && transitionName && props[transitionMap[animationType]]) {\n        var name = nameIsObj ? transitionName[animationType] : transitionName + '-' + animationType;\n        var activeName = name + '-active';\n        if (nameIsObj && transitionName[animationType + 'Active']) {\n          activeName = transitionName[animationType + 'Active'];\n        }\n        this.stopper = cssAnimate(node, {\n          name: name,\n          active: activeName\n        }, end);\n      } else {\n        this.stopper = props.animation[animationType](node, end);\n      }\n    }\n  }, {\n    key: 'stop',\n    value: function stop() {\n      var stopper = this.stopper;\n      if (stopper) {\n        this.stopper = null;\n        stopper.stop();\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n\n  return AnimateChild;\n}(React.Component);\n\nAnimateChild.propTypes = {\n  children: PropTypes.any,\n  animation: PropTypes.any,\n  transitionName: PropTypes.any\n};\nexport default AnimateChild;","import _extends from 'babel-runtime/helpers/extends';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport unsafeLifecyclesPolyfill from 'rc-util/es/unsafeLifecyclesPolyfill';\nimport { toArrayChildren, mergeChildren, findShownChildInChildrenByKey, findChildInChildrenByKey, isSameChildren } from './ChildrenUtils';\nimport AnimateChild from './AnimateChild';\nimport animUtil from './util/animate';\n\nvar defaultKey = 'rc_animate_' + Date.now();\n\nfunction getChildrenFromProps(props) {\n  var children = props.children;\n  if (React.isValidElement(children)) {\n    if (!children.key) {\n      return React.cloneElement(children, {\n        key: defaultKey\n      });\n    }\n  }\n  return children;\n}\n\nfunction noop() {}\n\nvar Animate = function (_React$Component) {\n  _inherits(Animate, _React$Component);\n\n  // eslint-disable-line\n\n  function Animate(props) {\n    _classCallCheck(this, Animate);\n\n    var _this = _possibleConstructorReturn(this, (Animate.__proto__ || Object.getPrototypeOf(Animate)).call(this, props));\n\n    _initialiseProps.call(_this);\n\n    _this.currentlyAnimatingKeys = {};\n    _this.keysToEnter = [];\n    _this.keysToLeave = [];\n\n    _this.state = {\n      children: toArrayChildren(getChildrenFromProps(props))\n    };\n\n    _this.childrenRefs = {};\n    return _this;\n  }\n\n  _createClass(Animate, [{\n    key: 'componentDidMount',\n    value: function componentDidMount() {\n      var _this2 = this;\n\n      var showProp = this.props.showProp;\n      var children = this.state.children;\n      if (showProp) {\n        children = children.filter(function (child) {\n          return !!child.props[showProp];\n        });\n      }\n      children.forEach(function (child) {\n        if (child) {\n          _this2.performAppear(child.key);\n        }\n      });\n    }\n  }, {\n    key: 'componentWillReceiveProps',\n    value: function componentWillReceiveProps(nextProps) {\n      var _this3 = this;\n\n      this.nextProps = nextProps;\n      var nextChildren = toArrayChildren(getChildrenFromProps(nextProps));\n      var props = this.props;\n      // exclusive needs immediate response\n      if (props.exclusive) {\n        Object.keys(this.currentlyAnimatingKeys).forEach(function (key) {\n          _this3.stop(key);\n        });\n      }\n      var showProp = props.showProp;\n      var currentlyAnimatingKeys = this.currentlyAnimatingKeys;\n      // last props children if exclusive\n      var currentChildren = props.exclusive ? toArrayChildren(getChildrenFromProps(props)) : this.state.children;\n      // in case destroy in showProp mode\n      var newChildren = [];\n      if (showProp) {\n        currentChildren.forEach(function (currentChild) {\n          var nextChild = currentChild && findChildInChildrenByKey(nextChildren, currentChild.key);\n          var newChild = void 0;\n          if ((!nextChild || !nextChild.props[showProp]) && currentChild.props[showProp]) {\n            newChild = React.cloneElement(nextChild || currentChild, _defineProperty({}, showProp, true));\n          } else {\n            newChild = nextChild;\n          }\n          if (newChild) {\n            newChildren.push(newChild);\n          }\n        });\n        nextChildren.forEach(function (nextChild) {\n          if (!nextChild || !findChildInChildrenByKey(currentChildren, nextChild.key)) {\n            newChildren.push(nextChild);\n          }\n        });\n      } else {\n        newChildren = mergeChildren(currentChildren, nextChildren);\n      }\n\n      // need render to avoid update\n      this.setState({\n        children: newChildren\n      });\n\n      nextChildren.forEach(function (child) {\n        var key = child && child.key;\n        if (child && currentlyAnimatingKeys[key]) {\n          return;\n        }\n        var hasPrev = child && findChildInChildrenByKey(currentChildren, key);\n        if (showProp) {\n          var showInNext = child.props[showProp];\n          if (hasPrev) {\n            var showInNow = findShownChildInChildrenByKey(currentChildren, key, showProp);\n            if (!showInNow && showInNext) {\n              _this3.keysToEnter.push(key);\n            }\n          } else if (showInNext) {\n            _this3.keysToEnter.push(key);\n          }\n        } else if (!hasPrev) {\n          _this3.keysToEnter.push(key);\n        }\n      });\n\n      currentChildren.forEach(function (child) {\n        var key = child && child.key;\n        if (child && currentlyAnimatingKeys[key]) {\n          return;\n        }\n        var hasNext = child && findChildInChildrenByKey(nextChildren, key);\n        if (showProp) {\n          var showInNow = child.props[showProp];\n          if (hasNext) {\n            var showInNext = findShownChildInChildrenByKey(nextChildren, key, showProp);\n            if (!showInNext && showInNow) {\n              _this3.keysToLeave.push(key);\n            }\n          } else if (showInNow) {\n            _this3.keysToLeave.push(key);\n          }\n        } else if (!hasNext) {\n          _this3.keysToLeave.push(key);\n        }\n      });\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate() {\n      var keysToEnter = this.keysToEnter;\n      this.keysToEnter = [];\n      keysToEnter.forEach(this.performEnter);\n      var keysToLeave = this.keysToLeave;\n      this.keysToLeave = [];\n      keysToLeave.forEach(this.performLeave);\n    }\n  }, {\n    key: 'isValidChildByKey',\n    value: function isValidChildByKey(currentChildren, key) {\n      var showProp = this.props.showProp;\n      if (showProp) {\n        return findShownChildInChildrenByKey(currentChildren, key, showProp);\n      }\n      return findChildInChildrenByKey(currentChildren, key);\n    }\n  }, {\n    key: 'stop',\n    value: function stop(key) {\n      delete this.currentlyAnimatingKeys[key];\n      var component = this.childrenRefs[key];\n      if (component) {\n        component.stop();\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _this4 = this;\n\n      var props = this.props;\n      this.nextProps = props;\n      var stateChildren = this.state.children;\n      var children = null;\n      if (stateChildren) {\n        children = stateChildren.map(function (child) {\n          if (child === null || child === undefined) {\n            return child;\n          }\n          if (!child.key) {\n            throw new Error('must set key for <rc-animate> children');\n          }\n          return React.createElement(\n            AnimateChild,\n            {\n              key: child.key,\n              ref: function ref(node) {\n                _this4.childrenRefs[child.key] = node;\n              },\n              animation: props.animation,\n              transitionName: props.transitionName,\n              transitionEnter: props.transitionEnter,\n              transitionAppear: props.transitionAppear,\n              transitionLeave: props.transitionLeave\n            },\n            child\n          );\n        });\n      }\n      var Component = props.component;\n      if (Component) {\n        var passedProps = props;\n        if (typeof Component === 'string') {\n          passedProps = _extends({\n            className: props.className,\n            style: props.style\n          }, props.componentProps);\n        }\n        return React.createElement(\n          Component,\n          passedProps,\n          children\n        );\n      }\n      return children[0] || null;\n    }\n  }]);\n\n  return Animate;\n}(React.Component);\n\nAnimate.isAnimate = true;\nAnimate.propTypes = {\n  className: PropTypes.string,\n  style: PropTypes.object,\n  component: PropTypes.any,\n  componentProps: PropTypes.object,\n  animation: PropTypes.object,\n  transitionName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  transitionEnter: PropTypes.bool,\n  transitionAppear: PropTypes.bool,\n  exclusive: PropTypes.bool,\n  transitionLeave: PropTypes.bool,\n  onEnd: PropTypes.func,\n  onEnter: PropTypes.func,\n  onLeave: PropTypes.func,\n  onAppear: PropTypes.func,\n  showProp: PropTypes.string,\n  children: PropTypes.node\n};\nAnimate.defaultProps = {\n  animation: {},\n  component: 'span',\n  componentProps: {},\n  transitionEnter: true,\n  transitionLeave: true,\n  transitionAppear: false,\n  onEnd: noop,\n  onEnter: noop,\n  onLeave: noop,\n  onAppear: noop\n};\n\nvar _initialiseProps = function _initialiseProps() {\n  var _this5 = this;\n\n  this.performEnter = function (key) {\n    // may already remove by exclusive\n    if (_this5.childrenRefs[key]) {\n      _this5.currentlyAnimatingKeys[key] = true;\n      _this5.childrenRefs[key].componentWillEnter(_this5.handleDoneAdding.bind(_this5, key, 'enter'));\n    }\n  };\n\n  this.performAppear = function (key) {\n    if (_this5.childrenRefs[key]) {\n      _this5.currentlyAnimatingKeys[key] = true;\n      _this5.childrenRefs[key].componentWillAppear(_this5.handleDoneAdding.bind(_this5, key, 'appear'));\n    }\n  };\n\n  this.handleDoneAdding = function (key, type) {\n    var props = _this5.props;\n    delete _this5.currentlyAnimatingKeys[key];\n    // if update on exclusive mode, skip check\n    if (props.exclusive && props !== _this5.nextProps) {\n      return;\n    }\n    var currentChildren = toArrayChildren(getChildrenFromProps(props));\n    if (!_this5.isValidChildByKey(currentChildren, key)) {\n      // exclusive will not need this\n      _this5.performLeave(key);\n    } else if (type === 'appear') {\n      if (animUtil.allowAppearCallback(props)) {\n        props.onAppear(key);\n        props.onEnd(key, true);\n      }\n    } else if (animUtil.allowEnterCallback(props)) {\n      props.onEnter(key);\n      props.onEnd(key, true);\n    }\n  };\n\n  this.performLeave = function (key) {\n    // may already remove by exclusive\n    if (_this5.childrenRefs[key]) {\n      _this5.currentlyAnimatingKeys[key] = true;\n      _this5.childrenRefs[key].componentWillLeave(_this5.handleDoneLeaving.bind(_this5, key));\n    }\n  };\n\n  this.handleDoneLeaving = function (key) {\n    var props = _this5.props;\n    delete _this5.currentlyAnimatingKeys[key];\n    // if update on exclusive mode, skip check\n    if (props.exclusive && props !== _this5.nextProps) {\n      return;\n    }\n    var currentChildren = toArrayChildren(getChildrenFromProps(props));\n    // in case state change is too fast\n    if (_this5.isValidChildByKey(currentChildren, key)) {\n      _this5.performEnter(key);\n    } else {\n      var end = function end() {\n        if (animUtil.allowLeaveCallback(props)) {\n          props.onLeave(key);\n          props.onEnd(key, false);\n        }\n      };\n      if (!isSameChildren(_this5.state.children, currentChildren, props.showProp)) {\n        _this5.setState({\n          children: currentChildren\n        }, end);\n      } else {\n        end();\n      }\n    }\n  };\n};\n\nexport default unsafeLifecyclesPolyfill(Animate);","import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nvar LazyRenderBox = function (_Component) {\n  _inherits(LazyRenderBox, _Component);\n\n  function LazyRenderBox() {\n    _classCallCheck(this, LazyRenderBox);\n\n    return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  LazyRenderBox.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n    return nextProps.hiddenClassName || nextProps.visible;\n  };\n\n  LazyRenderBox.prototype.render = function render() {\n    var _props = this.props,\n        hiddenClassName = _props.hiddenClassName,\n        visible = _props.visible,\n        props = _objectWithoutProperties(_props, ['hiddenClassName', 'visible']);\n\n    if (hiddenClassName || React.Children.count(props.children) > 1) {\n      if (!visible && hiddenClassName) {\n        props.className += ' ' + hiddenClassName;\n      }\n      return React.createElement('div', props);\n    }\n\n    return React.Children.only(props.children);\n  };\n\n  return LazyRenderBox;\n}(Component);\n\nLazyRenderBox.propTypes = {\n  children: PropTypes.any,\n  className: PropTypes.string,\n  visible: PropTypes.bool,\n  hiddenClassName: PropTypes.string\n};\n\n\nexport default LazyRenderBox;","import _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport LazyRenderBox from './LazyRenderBox';\n\nvar PopupInner = function (_Component) {\n  _inherits(PopupInner, _Component);\n\n  function PopupInner() {\n    _classCallCheck(this, PopupInner);\n\n    return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  PopupInner.prototype.render = function render() {\n    var props = this.props;\n    var className = props.className;\n    if (!props.visible) {\n      className += ' ' + props.hiddenClassName;\n    }\n    return React.createElement(\n      'div',\n      {\n        className: className,\n        onMouseEnter: props.onMouseEnter,\n        onMouseLeave: props.onMouseLeave,\n        onMouseDown: props.onMouseDown,\n        onTouchStart: props.onTouchStart,\n        style: props.style\n      },\n      React.createElement(\n        LazyRenderBox,\n        { className: props.prefixCls + '-content', visible: props.visible },\n        props.children\n      )\n    );\n  };\n\n  return PopupInner;\n}(Component);\n\nPopupInner.propTypes = {\n  hiddenClassName: PropTypes.string,\n  className: PropTypes.string,\n  prefixCls: PropTypes.string,\n  onMouseEnter: PropTypes.func,\n  onMouseLeave: PropTypes.func,\n  onMouseDown: PropTypes.func,\n  onTouchStart: PropTypes.func,\n  children: PropTypes.any\n};\n\n\nexport default PopupInner;","import _extends from 'babel-runtime/helpers/extends';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport Align from 'rc-align';\nimport Animate from 'rc-animate';\nimport PopupInner from './PopupInner';\nimport LazyRenderBox from './LazyRenderBox';\nimport { saveRef } from './utils';\n\nvar Popup = function (_Component) {\n  _inherits(Popup, _Component);\n\n  function Popup(props) {\n    _classCallCheck(this, Popup);\n\n    var _this = _possibleConstructorReturn(this, _Component.call(this, props));\n\n    _initialiseProps.call(_this);\n\n    _this.state = {\n      // Used for stretch\n      stretchChecked: false,\n      targetWidth: undefined,\n      targetHeight: undefined\n    };\n\n    _this.savePopupRef = saveRef.bind(_this, 'popupInstance');\n    _this.saveAlignRef = saveRef.bind(_this, 'alignInstance');\n    return _this;\n  }\n\n  Popup.prototype.componentDidMount = function componentDidMount() {\n    this.rootNode = this.getPopupDomNode();\n    this.setStretchSize();\n  };\n\n  Popup.prototype.componentDidUpdate = function componentDidUpdate() {\n    this.setStretchSize();\n  };\n\n  // Record size if stretch needed\n\n\n  Popup.prototype.getPopupDomNode = function getPopupDomNode() {\n    return ReactDOM.findDOMNode(this.popupInstance);\n  };\n\n  // `target` on `rc-align` can accept as a function to get the bind element or a point.\n  // ref: https://www.npmjs.com/package/rc-align\n\n\n  Popup.prototype.getMaskTransitionName = function getMaskTransitionName() {\n    var props = this.props;\n    var transitionName = props.maskTransitionName;\n    var animation = props.maskAnimation;\n    if (!transitionName && animation) {\n      transitionName = props.prefixCls + '-' + animation;\n    }\n    return transitionName;\n  };\n\n  Popup.prototype.getTransitionName = function getTransitionName() {\n    var props = this.props;\n    var transitionName = props.transitionName;\n    if (!transitionName && props.animation) {\n      transitionName = props.prefixCls + '-' + props.animation;\n    }\n    return transitionName;\n  };\n\n  Popup.prototype.getClassName = function getClassName(currentAlignClassName) {\n    return this.props.prefixCls + ' ' + this.props.className + ' ' + currentAlignClassName;\n  };\n\n  Popup.prototype.getPopupElement = function getPopupElement() {\n    var _this2 = this;\n\n    var savePopupRef = this.savePopupRef;\n    var _state = this.state,\n        stretchChecked = _state.stretchChecked,\n        targetHeight = _state.targetHeight,\n        targetWidth = _state.targetWidth;\n    var _props = this.props,\n        align = _props.align,\n        visible = _props.visible,\n        prefixCls = _props.prefixCls,\n        style = _props.style,\n        getClassNameFromAlign = _props.getClassNameFromAlign,\n        destroyPopupOnHide = _props.destroyPopupOnHide,\n        stretch = _props.stretch,\n        children = _props.children,\n        onMouseEnter = _props.onMouseEnter,\n        onMouseLeave = _props.onMouseLeave,\n        onMouseDown = _props.onMouseDown,\n        onTouchStart = _props.onTouchStart;\n\n    var className = this.getClassName(this.currentAlignClassName || getClassNameFromAlign(align));\n    var hiddenClassName = prefixCls + '-hidden';\n\n    if (!visible) {\n      this.currentAlignClassName = null;\n    }\n\n    var sizeStyle = {};\n    if (stretch) {\n      // Stretch with target\n      if (stretch.indexOf('height') !== -1) {\n        sizeStyle.height = targetHeight;\n      } else if (stretch.indexOf('minHeight') !== -1) {\n        sizeStyle.minHeight = targetHeight;\n      }\n      if (stretch.indexOf('width') !== -1) {\n        sizeStyle.width = targetWidth;\n      } else if (stretch.indexOf('minWidth') !== -1) {\n        sizeStyle.minWidth = targetWidth;\n      }\n\n      // Delay force align to makes ui smooth\n      if (!stretchChecked) {\n        sizeStyle.visibility = 'hidden';\n        setTimeout(function () {\n          if (_this2.alignInstance) {\n            _this2.alignInstance.forceAlign();\n          }\n        }, 0);\n      }\n    }\n\n    var newStyle = _extends({}, sizeStyle, style, this.getZIndexStyle());\n\n    var popupInnerProps = {\n      className: className,\n      prefixCls: prefixCls,\n      ref: savePopupRef,\n      onMouseEnter: onMouseEnter,\n      onMouseLeave: onMouseLeave,\n      onMouseDown: onMouseDown,\n      onTouchStart: onTouchStart,\n      style: newStyle\n    };\n    if (destroyPopupOnHide) {\n      return React.createElement(\n        Animate,\n        {\n          component: '',\n          exclusive: true,\n          transitionAppear: true,\n          transitionName: this.getTransitionName()\n        },\n        visible ? React.createElement(\n          Align,\n          {\n            target: this.getAlignTarget(),\n            key: 'popup',\n            ref: this.saveAlignRef,\n            monitorWindowResize: true,\n            align: align,\n            onAlign: this.onAlign\n          },\n          React.createElement(\n            PopupInner,\n            _extends({\n              visible: true\n            }, popupInnerProps),\n            children\n          )\n        ) : null\n      );\n    }\n\n    return React.createElement(\n      Animate,\n      {\n        component: '',\n        exclusive: true,\n        transitionAppear: true,\n        transitionName: this.getTransitionName(),\n        showProp: 'xVisible'\n      },\n      React.createElement(\n        Align,\n        {\n          target: this.getAlignTarget(),\n          key: 'popup',\n          ref: this.saveAlignRef,\n          monitorWindowResize: true,\n          xVisible: visible,\n          childrenProps: { visible: 'xVisible' },\n          disabled: !visible,\n          align: align,\n          onAlign: this.onAlign\n        },\n        React.createElement(\n          PopupInner,\n          _extends({\n            hiddenClassName: hiddenClassName\n          }, popupInnerProps),\n          children\n        )\n      )\n    );\n  };\n\n  Popup.prototype.getZIndexStyle = function getZIndexStyle() {\n    var style = {};\n    var props = this.props;\n    if (props.zIndex !== undefined) {\n      style.zIndex = props.zIndex;\n    }\n    return style;\n  };\n\n  Popup.prototype.getMaskElement = function getMaskElement() {\n    var props = this.props;\n    var maskElement = void 0;\n    if (props.mask) {\n      var maskTransition = this.getMaskTransitionName();\n      maskElement = React.createElement(LazyRenderBox, {\n        style: this.getZIndexStyle(),\n        key: 'mask',\n        className: props.prefixCls + '-mask',\n        hiddenClassName: props.prefixCls + '-mask-hidden',\n        visible: props.visible\n      });\n      if (maskTransition) {\n        maskElement = React.createElement(\n          Animate,\n          {\n            key: 'mask',\n            showProp: 'visible',\n            transitionAppear: true,\n            component: '',\n            transitionName: maskTransition\n          },\n          maskElement\n        );\n      }\n    }\n    return maskElement;\n  };\n\n  Popup.prototype.render = function render() {\n    return React.createElement(\n      'div',\n      null,\n      this.getMaskElement(),\n      this.getPopupElement()\n    );\n  };\n\n  return Popup;\n}(Component);\n\nPopup.propTypes = {\n  visible: PropTypes.bool,\n  style: PropTypes.object,\n  getClassNameFromAlign: PropTypes.func,\n  onAlign: PropTypes.func,\n  getRootDomNode: PropTypes.func,\n  align: PropTypes.any,\n  destroyPopupOnHide: PropTypes.bool,\n  className: PropTypes.string,\n  prefixCls: PropTypes.string,\n  onMouseEnter: PropTypes.func,\n  onMouseLeave: PropTypes.func,\n  onMouseDown: PropTypes.func,\n  onTouchStart: PropTypes.func,\n  stretch: PropTypes.string,\n  children: PropTypes.node,\n  point: PropTypes.shape({\n    pageX: PropTypes.number,\n    pageY: PropTypes.number\n  })\n};\n\nvar _initialiseProps = function _initialiseProps() {\n  var _this3 = this;\n\n  this.onAlign = function (popupDomNode, align) {\n    var props = _this3.props;\n    var currentAlignClassName = props.getClassNameFromAlign(align);\n    // FIX: https://github.com/react-component/trigger/issues/56\n    // FIX: https://github.com/react-component/tooltip/issues/79\n    if (_this3.currentAlignClassName !== currentAlignClassName) {\n      _this3.currentAlignClassName = currentAlignClassName;\n      popupDomNode.className = _this3.getClassName(currentAlignClassName);\n    }\n    props.onAlign(popupDomNode, align);\n  };\n\n  this.setStretchSize = function () {\n    var _props2 = _this3.props,\n        stretch = _props2.stretch,\n        getRootDomNode = _props2.getRootDomNode,\n        visible = _props2.visible;\n    var _state2 = _this3.state,\n        stretchChecked = _state2.stretchChecked,\n        targetHeight = _state2.targetHeight,\n        targetWidth = _state2.targetWidth;\n\n\n    if (!stretch || !visible) {\n      if (stretchChecked) {\n        _this3.setState({ stretchChecked: false });\n      }\n      return;\n    }\n\n    var $ele = getRootDomNode();\n    if (!$ele) return;\n\n    var height = $ele.offsetHeight;\n    var width = $ele.offsetWidth;\n\n    if (targetHeight !== height || targetWidth !== width || !stretchChecked) {\n      _this3.setState({\n        stretchChecked: true,\n        targetHeight: height,\n        targetWidth: width\n      });\n    }\n  };\n\n  this.getTargetElement = function () {\n    return _this3.props.getRootDomNode();\n  };\n\n  this.getAlignTarget = function () {\n    var point = _this3.props.point;\n\n    if (point) {\n      return point;\n    }\n    return _this3.getTargetElement;\n  };\n};\n\nexport default Popup;","import _extends from 'babel-runtime/helpers/extends';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { findDOMNode, createPortal } from 'react-dom';\nimport { polyfill } from 'react-lifecycles-compat';\nimport contains from 'rc-util/es/Dom/contains';\nimport addEventListener from 'rc-util/es/Dom/addEventListener';\nimport ContainerRender from 'rc-util/es/ContainerRender';\nimport Portal from 'rc-util/es/Portal';\nimport classNames from 'classnames';\n\nimport { getAlignFromPlacement, getAlignPopupClassName } from './utils';\nimport Popup from './Popup';\n\nfunction noop() {}\n\nfunction returnEmptyString() {\n  return '';\n}\n\nfunction returnDocument() {\n  return window.document;\n}\n\nvar ALL_HANDLERS = ['onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur', 'onContextMenu'];\n\nvar IS_REACT_16 = !!createPortal;\n\nvar contextTypes = {\n  rcTrigger: PropTypes.shape({\n    onPopupMouseDown: PropTypes.func\n  })\n};\n\nvar Trigger = function (_React$Component) {\n  _inherits(Trigger, _React$Component);\n\n  function Trigger(props) {\n    _classCallCheck(this, Trigger);\n\n    var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));\n\n    _initialiseProps.call(_this);\n\n    var popupVisible = void 0;\n    if ('popupVisible' in props) {\n      popupVisible = !!props.popupVisible;\n    } else {\n      popupVisible = !!props.defaultPopupVisible;\n    }\n\n    _this.state = {\n      prevPopupVisible: popupVisible,\n      popupVisible: popupVisible\n    };\n\n    ALL_HANDLERS.forEach(function (h) {\n      _this['fire' + h] = function (e) {\n        _this.fireEvents(h, e);\n      };\n    });\n    return _this;\n  }\n\n  Trigger.prototype.getChildContext = function getChildContext() {\n    return {\n      rcTrigger: {\n        onPopupMouseDown: this.onPopupMouseDown\n      }\n    };\n  };\n\n  Trigger.prototype.componentDidMount = function componentDidMount() {\n    this.componentDidUpdate({}, {\n      popupVisible: this.state.popupVisible\n    });\n  };\n\n  Trigger.prototype.componentDidUpdate = function componentDidUpdate(_, prevState) {\n    var props = this.props;\n    var state = this.state;\n    var triggerAfterPopupVisibleChange = function triggerAfterPopupVisibleChange() {\n      if (prevState.popupVisible !== state.popupVisible) {\n        props.afterPopupVisibleChange(state.popupVisible);\n      }\n    };\n    if (!IS_REACT_16) {\n      this.renderComponent(null, triggerAfterPopupVisibleChange);\n    }\n\n    // We must listen to `mousedown` or `touchstart`, edge case:\n    // https://github.com/ant-design/ant-design/issues/5804\n    // https://github.com/react-component/calendar/issues/250\n    // https://github.com/react-component/trigger/issues/50\n    if (state.popupVisible) {\n      var currentDocument = void 0;\n      if (!this.clickOutsideHandler && (this.isClickToHide() || this.isContextMenuToShow())) {\n        currentDocument = props.getDocument();\n        this.clickOutsideHandler = addEventListener(currentDocument, 'mousedown', this.onDocumentClick);\n      }\n      // always hide on mobile\n      if (!this.touchOutsideHandler) {\n        currentDocument = currentDocument || props.getDocument();\n        this.touchOutsideHandler = addEventListener(currentDocument, 'touchstart', this.onDocumentClick);\n      }\n      // close popup when trigger type contains 'onContextMenu' and document is scrolling.\n      if (!this.contextMenuOutsideHandler1 && this.isContextMenuToShow()) {\n        currentDocument = currentDocument || props.getDocument();\n        this.contextMenuOutsideHandler1 = addEventListener(currentDocument, 'scroll', this.onContextMenuClose);\n      }\n      // close popup when trigger type contains 'onContextMenu' and window is blur.\n      if (!this.contextMenuOutsideHandler2 && this.isContextMenuToShow()) {\n        this.contextMenuOutsideHandler2 = addEventListener(window, 'blur', this.onContextMenuClose);\n      }\n      return;\n    }\n\n    this.clearOutsideHandler();\n  };\n\n  Trigger.prototype.componentWillUnmount = function componentWillUnmount() {\n    this.clearDelayTimer();\n    this.clearOutsideHandler();\n    clearTimeout(this.mouseDownTimeout);\n  };\n\n  Trigger.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var popupVisible = _ref.popupVisible;\n\n    var newState = {};\n\n    if (popupVisible !== undefined && prevState.popupVisible !== popupVisible) {\n      newState.popupVisible = popupVisible;\n      newState.prevPopupVisible = prevState.popupVisible;\n    }\n\n    return newState;\n  };\n\n  Trigger.prototype.getPopupDomNode = function getPopupDomNode() {\n    // for test\n    if (this._component && this._component.getPopupDomNode) {\n      return this._component.getPopupDomNode();\n    }\n    return null;\n  };\n\n  Trigger.prototype.getPopupAlign = function getPopupAlign() {\n    var props = this.props;\n    var popupPlacement = props.popupPlacement,\n        popupAlign = props.popupAlign,\n        builtinPlacements = props.builtinPlacements;\n\n    if (popupPlacement && builtinPlacements) {\n      return getAlignFromPlacement(builtinPlacements, popupPlacement, popupAlign);\n    }\n    return popupAlign;\n  };\n\n  /**\n   * @param popupVisible    Show or not the popup element\n   * @param event           SyntheticEvent, used for `pointAlign`\n   */\n  Trigger.prototype.setPopupVisible = function setPopupVisible(popupVisible, event) {\n    var alignPoint = this.props.alignPoint;\n    var prevPopupVisible = this.state.popupVisible;\n\n\n    this.clearDelayTimer();\n\n    if (prevPopupVisible !== popupVisible) {\n      if (!('popupVisible' in this.props)) {\n        this.setState({ popupVisible: popupVisible, prevPopupVisible: prevPopupVisible });\n      }\n      this.props.onPopupVisibleChange(popupVisible);\n    }\n\n    // Always record the point position since mouseEnterDelay will delay the show\n    if (alignPoint && event) {\n      this.setPoint(event);\n    }\n  };\n\n  Trigger.prototype.delaySetPopupVisible = function delaySetPopupVisible(visible, delayS, event) {\n    var _this2 = this;\n\n    var delay = delayS * 1000;\n    this.clearDelayTimer();\n    if (delay) {\n      var point = event ? { pageX: event.pageX, pageY: event.pageY } : null;\n      this.delayTimer = setTimeout(function () {\n        _this2.setPopupVisible(visible, point);\n        _this2.clearDelayTimer();\n      }, delay);\n    } else {\n      this.setPopupVisible(visible, event);\n    }\n  };\n\n  Trigger.prototype.clearDelayTimer = function clearDelayTimer() {\n    if (this.delayTimer) {\n      clearTimeout(this.delayTimer);\n      this.delayTimer = null;\n    }\n  };\n\n  Trigger.prototype.clearOutsideHandler = function clearOutsideHandler() {\n    if (this.clickOutsideHandler) {\n      this.clickOutsideHandler.remove();\n      this.clickOutsideHandler = null;\n    }\n\n    if (this.contextMenuOutsideHandler1) {\n      this.contextMenuOutsideHandler1.remove();\n      this.contextMenuOutsideHandler1 = null;\n    }\n\n    if (this.contextMenuOutsideHandler2) {\n      this.contextMenuOutsideHandler2.remove();\n      this.contextMenuOutsideHandler2 = null;\n    }\n\n    if (this.touchOutsideHandler) {\n      this.touchOutsideHandler.remove();\n      this.touchOutsideHandler = null;\n    }\n  };\n\n  Trigger.prototype.createTwoChains = function createTwoChains(event) {\n    var childPros = this.props.children.props;\n    var props = this.props;\n    if (childPros[event] && props[event]) {\n      return this['fire' + event];\n    }\n    return childPros[event] || props[event];\n  };\n\n  Trigger.prototype.isClickToShow = function isClickToShow() {\n    var _props = this.props,\n        action = _props.action,\n        showAction = _props.showAction;\n\n    return action.indexOf('click') !== -1 || showAction.indexOf('click') !== -1;\n  };\n\n  Trigger.prototype.isContextMenuToShow = function isContextMenuToShow() {\n    var _props2 = this.props,\n        action = _props2.action,\n        showAction = _props2.showAction;\n\n    return action.indexOf('contextMenu') !== -1 || showAction.indexOf('contextMenu') !== -1;\n  };\n\n  Trigger.prototype.isClickToHide = function isClickToHide() {\n    var _props3 = this.props,\n        action = _props3.action,\n        hideAction = _props3.hideAction;\n\n    return action.indexOf('click') !== -1 || hideAction.indexOf('click') !== -1;\n  };\n\n  Trigger.prototype.isMouseEnterToShow = function isMouseEnterToShow() {\n    var _props4 = this.props,\n        action = _props4.action,\n        showAction = _props4.showAction;\n\n    return action.indexOf('hover') !== -1 || showAction.indexOf('mouseEnter') !== -1;\n  };\n\n  Trigger.prototype.isMouseLeaveToHide = function isMouseLeaveToHide() {\n    var _props5 = this.props,\n        action = _props5.action,\n        hideAction = _props5.hideAction;\n\n    return action.indexOf('hover') !== -1 || hideAction.indexOf('mouseLeave') !== -1;\n  };\n\n  Trigger.prototype.isFocusToShow = function isFocusToShow() {\n    var _props6 = this.props,\n        action = _props6.action,\n        showAction = _props6.showAction;\n\n    return action.indexOf('focus') !== -1 || showAction.indexOf('focus') !== -1;\n  };\n\n  Trigger.prototype.isBlurToHide = function isBlurToHide() {\n    var _props7 = this.props,\n        action = _props7.action,\n        hideAction = _props7.hideAction;\n\n    return action.indexOf('focus') !== -1 || hideAction.indexOf('blur') !== -1;\n  };\n\n  Trigger.prototype.forcePopupAlign = function forcePopupAlign() {\n    if (this.state.popupVisible && this._component && this._component.alignInstance) {\n      this._component.alignInstance.forceAlign();\n    }\n  };\n\n  Trigger.prototype.fireEvents = function fireEvents(type, e) {\n    var childCallback = this.props.children.props[type];\n    if (childCallback) {\n      childCallback(e);\n    }\n    var callback = this.props[type];\n    if (callback) {\n      callback(e);\n    }\n  };\n\n  Trigger.prototype.close = function close() {\n    this.setPopupVisible(false);\n  };\n\n  Trigger.prototype.render = function render() {\n    var _this3 = this;\n\n    var popupVisible = this.state.popupVisible;\n    var _props8 = this.props,\n        children = _props8.children,\n        forceRender = _props8.forceRender,\n        alignPoint = _props8.alignPoint,\n        className = _props8.className;\n\n    var child = React.Children.only(children);\n    var newChildProps = { key: 'trigger' };\n\n    if (this.isContextMenuToShow()) {\n      newChildProps.onContextMenu = this.onContextMenu;\n    } else {\n      newChildProps.onContextMenu = this.createTwoChains('onContextMenu');\n    }\n\n    if (this.isClickToHide() || this.isClickToShow()) {\n      newChildProps.onClick = this.onClick;\n      newChildProps.onMouseDown = this.onMouseDown;\n      newChildProps.onTouchStart = this.onTouchStart;\n    } else {\n      newChildProps.onClick = this.createTwoChains('onClick');\n      newChildProps.onMouseDown = this.createTwoChains('onMouseDown');\n      newChildProps.onTouchStart = this.createTwoChains('onTouchStart');\n    }\n    if (this.isMouseEnterToShow()) {\n      newChildProps.onMouseEnter = this.onMouseEnter;\n      if (alignPoint) {\n        newChildProps.onMouseMove = this.onMouseMove;\n      }\n    } else {\n      newChildProps.onMouseEnter = this.createTwoChains('onMouseEnter');\n    }\n    if (this.isMouseLeaveToHide()) {\n      newChildProps.onMouseLeave = this.onMouseLeave;\n    } else {\n      newChildProps.onMouseLeave = this.createTwoChains('onMouseLeave');\n    }\n    if (this.isFocusToShow() || this.isBlurToHide()) {\n      newChildProps.onFocus = this.onFocus;\n      newChildProps.onBlur = this.onBlur;\n    } else {\n      newChildProps.onFocus = this.createTwoChains('onFocus');\n      newChildProps.onBlur = this.createTwoChains('onBlur');\n    }\n\n    var childrenClassName = classNames(child && child.props && child.props.className, className);\n    if (childrenClassName) {\n      newChildProps.className = childrenClassName;\n    }\n    var trigger = React.cloneElement(child, newChildProps);\n\n    if (!IS_REACT_16) {\n      return React.createElement(\n        ContainerRender,\n        {\n          parent: this,\n          visible: popupVisible,\n          autoMount: false,\n          forceRender: forceRender,\n          getComponent: this.getComponent,\n          getContainer: this.getContainer\n        },\n        function (_ref2) {\n          var renderComponent = _ref2.renderComponent;\n\n          _this3.renderComponent = renderComponent;\n          return trigger;\n        }\n      );\n    }\n\n    var portal = void 0;\n    // prevent unmounting after it's rendered\n    if (popupVisible || this._component || forceRender) {\n      portal = React.createElement(\n        Portal,\n        { key: 'portal', getContainer: this.getContainer, didUpdate: this.handlePortalUpdate },\n        this.getComponent()\n      );\n    }\n\n    return [trigger, portal];\n  };\n\n  return Trigger;\n}(React.Component);\n\nTrigger.propTypes = {\n  children: PropTypes.any,\n  action: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),\n  showAction: PropTypes.any,\n  hideAction: PropTypes.any,\n  getPopupClassNameFromAlign: PropTypes.any,\n  onPopupVisibleChange: PropTypes.func,\n  afterPopupVisibleChange: PropTypes.func,\n  popup: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired,\n  popupStyle: PropTypes.object,\n  prefixCls: PropTypes.string,\n  popupClassName: PropTypes.string,\n  className: PropTypes.string,\n  popupPlacement: PropTypes.string,\n  builtinPlacements: PropTypes.object,\n  popupTransitionName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  popupAnimation: PropTypes.any,\n  mouseEnterDelay: PropTypes.number,\n  mouseLeaveDelay: PropTypes.number,\n  zIndex: PropTypes.number,\n  focusDelay: PropTypes.number,\n  blurDelay: PropTypes.number,\n  getPopupContainer: PropTypes.func,\n  getDocument: PropTypes.func,\n  forceRender: PropTypes.bool,\n  destroyPopupOnHide: PropTypes.bool,\n  mask: PropTypes.bool,\n  maskClosable: PropTypes.bool,\n  onPopupAlign: PropTypes.func,\n  popupAlign: PropTypes.object,\n  popupVisible: PropTypes.bool,\n  defaultPopupVisible: PropTypes.bool,\n  maskTransitionName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  maskAnimation: PropTypes.string,\n  stretch: PropTypes.string,\n  alignPoint: PropTypes.bool // Maybe we can support user pass position in the future\n};\nTrigger.contextTypes = contextTypes;\nTrigger.childContextTypes = contextTypes;\nTrigger.defaultProps = {\n  prefixCls: 'rc-trigger-popup',\n  getPopupClassNameFromAlign: returnEmptyString,\n  getDocument: returnDocument,\n  onPopupVisibleChange: noop,\n  afterPopupVisibleChange: noop,\n  onPopupAlign: noop,\n  popupClassName: '',\n  mouseEnterDelay: 0,\n  mouseLeaveDelay: 0.1,\n  focusDelay: 0,\n  blurDelay: 0.15,\n  popupStyle: {},\n  destroyPopupOnHide: false,\n  popupAlign: {},\n  defaultPopupVisible: false,\n  mask: false,\n  maskClosable: true,\n  action: [],\n  showAction: [],\n  hideAction: []\n};\n\nvar _initialiseProps = function _initialiseProps() {\n  var _this4 = this;\n\n  this.onMouseEnter = function (e) {\n    var mouseEnterDelay = _this4.props.mouseEnterDelay;\n\n    _this4.fireEvents('onMouseEnter', e);\n    _this4.delaySetPopupVisible(true, mouseEnterDelay, mouseEnterDelay ? null : e);\n  };\n\n  this.onMouseMove = function (e) {\n    _this4.fireEvents('onMouseMove', e);\n    _this4.setPoint(e);\n  };\n\n  this.onMouseLeave = function (e) {\n    _this4.fireEvents('onMouseLeave', e);\n    _this4.delaySetPopupVisible(false, _this4.props.mouseLeaveDelay);\n  };\n\n  this.onPopupMouseEnter = function () {\n    _this4.clearDelayTimer();\n  };\n\n  this.onPopupMouseLeave = function (e) {\n    // https://github.com/react-component/trigger/pull/13\n    // react bug?\n    if (e.relatedTarget && !e.relatedTarget.setTimeout && _this4._component && _this4._component.getPopupDomNode && contains(_this4._component.getPopupDomNode(), e.relatedTarget)) {\n      return;\n    }\n    _this4.delaySetPopupVisible(false, _this4.props.mouseLeaveDelay);\n  };\n\n  this.onFocus = function (e) {\n    _this4.fireEvents('onFocus', e);\n    // incase focusin and focusout\n    _this4.clearDelayTimer();\n    if (_this4.isFocusToShow()) {\n      _this4.focusTime = Date.now();\n      _this4.delaySetPopupVisible(true, _this4.props.focusDelay);\n    }\n  };\n\n  this.onMouseDown = function (e) {\n    _this4.fireEvents('onMouseDown', e);\n    _this4.preClickTime = Date.now();\n  };\n\n  this.onTouchStart = function (e) {\n    _this4.fireEvents('onTouchStart', e);\n    _this4.preTouchTime = Date.now();\n  };\n\n  this.onBlur = function (e) {\n    _this4.fireEvents('onBlur', e);\n    _this4.clearDelayTimer();\n    if (_this4.isBlurToHide()) {\n      _this4.delaySetPopupVisible(false, _this4.props.blurDelay);\n    }\n  };\n\n  this.onContextMenu = function (e) {\n    e.preventDefault();\n    _this4.fireEvents('onContextMenu', e);\n    _this4.setPopupVisible(true, e);\n  };\n\n  this.onContextMenuClose = function () {\n    if (_this4.isContextMenuToShow()) {\n      _this4.close();\n    }\n  };\n\n  this.onClick = function (event) {\n    _this4.fireEvents('onClick', event);\n    // focus will trigger click\n    if (_this4.focusTime) {\n      var preTime = void 0;\n      if (_this4.preClickTime && _this4.preTouchTime) {\n        preTime = Math.min(_this4.preClickTime, _this4.preTouchTime);\n      } else if (_this4.preClickTime) {\n        preTime = _this4.preClickTime;\n      } else if (_this4.preTouchTime) {\n        preTime = _this4.preTouchTime;\n      }\n      if (Math.abs(preTime - _this4.focusTime) < 20) {\n        return;\n      }\n      _this4.focusTime = 0;\n    }\n    _this4.preClickTime = 0;\n    _this4.preTouchTime = 0;\n\n    // Only prevent default when all the action is click.\n    // https://github.com/ant-design/ant-design/issues/17043\n    // https://github.com/ant-design/ant-design/issues/17291\n    if (_this4.isClickToShow() && (_this4.isClickToHide() || _this4.isBlurToHide()) && event && event.preventDefault) {\n      event.preventDefault();\n    }\n    var nextVisible = !_this4.state.popupVisible;\n    if (_this4.isClickToHide() && !nextVisible || nextVisible && _this4.isClickToShow()) {\n      _this4.setPopupVisible(!_this4.state.popupVisible, event);\n    }\n  };\n\n  this.onPopupMouseDown = function () {\n    var _context$rcTrigger = _this4.context.rcTrigger,\n        rcTrigger = _context$rcTrigger === undefined ? {} : _context$rcTrigger;\n\n    _this4.hasPopupMouseDown = true;\n\n    clearTimeout(_this4.mouseDownTimeout);\n    _this4.mouseDownTimeout = setTimeout(function () {\n      _this4.hasPopupMouseDown = false;\n    }, 0);\n\n    if (rcTrigger.onPopupMouseDown) {\n      rcTrigger.onPopupMouseDown.apply(rcTrigger, arguments);\n    }\n  };\n\n  this.onDocumentClick = function (event) {\n    if (_this4.props.mask && !_this4.props.maskClosable) {\n      return;\n    }\n\n    var target = event.target;\n    var root = findDOMNode(_this4);\n    if (!contains(root, target) && !_this4.hasPopupMouseDown) {\n      _this4.close();\n    }\n  };\n\n  this.getRootDomNode = function () {\n    return findDOMNode(_this4);\n  };\n\n  this.getPopupClassNameFromAlign = function (align) {\n    var className = [];\n    var _props9 = _this4.props,\n        popupPlacement = _props9.popupPlacement,\n        builtinPlacements = _props9.builtinPlacements,\n        prefixCls = _props9.prefixCls,\n        alignPoint = _props9.alignPoint,\n        getPopupClassNameFromAlign = _props9.getPopupClassNameFromAlign;\n\n    if (popupPlacement && builtinPlacements) {\n      className.push(getAlignPopupClassName(builtinPlacements, prefixCls, align, alignPoint));\n    }\n    if (getPopupClassNameFromAlign) {\n      className.push(getPopupClassNameFromAlign(align));\n    }\n    return className.join(' ');\n  };\n\n  this.getComponent = function () {\n    var _props10 = _this4.props,\n        prefixCls = _props10.prefixCls,\n        destroyPopupOnHide = _props10.destroyPopupOnHide,\n        popupClassName = _props10.popupClassName,\n        action = _props10.action,\n        onPopupAlign = _props10.onPopupAlign,\n        popupAnimation = _props10.popupAnimation,\n        popupTransitionName = _props10.popupTransitionName,\n        popupStyle = _props10.popupStyle,\n        mask = _props10.mask,\n        maskAnimation = _props10.maskAnimation,\n        maskTransitionName = _props10.maskTransitionName,\n        zIndex = _props10.zIndex,\n        popup = _props10.popup,\n        stretch = _props10.stretch,\n        alignPoint = _props10.alignPoint;\n    var _state = _this4.state,\n        popupVisible = _state.popupVisible,\n        point = _state.point;\n\n\n    var align = _this4.getPopupAlign();\n\n    var mouseProps = {};\n    if (_this4.isMouseEnterToShow()) {\n      mouseProps.onMouseEnter = _this4.onPopupMouseEnter;\n    }\n    if (_this4.isMouseLeaveToHide()) {\n      mouseProps.onMouseLeave = _this4.onPopupMouseLeave;\n    }\n\n    mouseProps.onMouseDown = _this4.onPopupMouseDown;\n    mouseProps.onTouchStart = _this4.onPopupMouseDown;\n\n    return React.createElement(\n      Popup,\n      _extends({\n        prefixCls: prefixCls,\n        destroyPopupOnHide: destroyPopupOnHide,\n        visible: popupVisible,\n        point: alignPoint && point,\n        className: popupClassName,\n        action: action,\n        align: align,\n        onAlign: onPopupAlign,\n        animation: popupAnimation,\n        getClassNameFromAlign: _this4.getPopupClassNameFromAlign\n      }, mouseProps, {\n        stretch: stretch,\n        getRootDomNode: _this4.getRootDomNode,\n        style: popupStyle,\n        mask: mask,\n        zIndex: zIndex,\n        transitionName: popupTransitionName,\n        maskAnimation: maskAnimation,\n        maskTransitionName: maskTransitionName,\n        ref: _this4.savePopup\n      }),\n      typeof popup === 'function' ? popup() : popup\n    );\n  };\n\n  this.getContainer = function () {\n    var props = _this4.props;\n\n    var popupContainer = document.createElement('div');\n    // Make sure default popup container will never cause scrollbar appearing\n    // https://github.com/react-component/trigger/issues/41\n    popupContainer.style.position = 'absolute';\n    popupContainer.style.top = '0';\n    popupContainer.style.left = '0';\n    popupContainer.style.width = '100%';\n    var mountNode = props.getPopupContainer ? props.getPopupContainer(findDOMNode(_this4)) : props.getDocument().body;\n    mountNode.appendChild(popupContainer);\n    return popupContainer;\n  };\n\n  this.setPoint = function (point) {\n    var alignPoint = _this4.props.alignPoint;\n\n    if (!alignPoint || !point) return;\n\n    _this4.setState({\n      point: {\n        pageX: point.pageX,\n        pageY: point.pageY\n      }\n    });\n  };\n\n  this.handlePortalUpdate = function () {\n    if (_this4.state.prevPopupVisible !== _this4.state.popupVisible) {\n      _this4.props.afterPopupVisibleChange(_this4.state.popupVisible);\n    }\n  };\n\n  this.savePopup = function (node) {\n    _this4._component = node;\n  };\n};\n\npolyfill(Trigger);\n\nexport default Trigger;","var autoAdjustOverflow = {\n  adjustX: 1,\n  adjustY: 1\n};\n\nvar targetOffset = [0, 0];\n\nexport var placements = {\n  left: {\n    points: ['cr', 'cl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  },\n  right: {\n    points: ['cl', 'cr'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  top: {\n    points: ['bc', 'tc'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  bottom: {\n    points: ['tc', 'bc'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  topLeft: {\n    points: ['bl', 'tl'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  leftTop: {\n    points: ['tr', 'tl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  },\n  topRight: {\n    points: ['br', 'tr'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  rightTop: {\n    points: ['tl', 'tr'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  bottomRight: {\n    points: ['tr', 'br'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  rightBottom: {\n    points: ['bl', 'br'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  bottomLeft: {\n    points: ['tl', 'bl'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  leftBottom: {\n    points: ['br', 'bl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  }\n};\n\nexport default placements;","import _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\n\nvar Content = function (_React$Component) {\n  _inherits(Content, _React$Component);\n\n  function Content() {\n    _classCallCheck(this, Content);\n\n    return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n  }\n\n  Content.prototype.componentDidUpdate = function componentDidUpdate() {\n    var trigger = this.props.trigger;\n\n    if (trigger) {\n      trigger.forcePopupAlign();\n    }\n  };\n\n  Content.prototype.render = function render() {\n    var _props = this.props,\n        overlay = _props.overlay,\n        prefixCls = _props.prefixCls,\n        id = _props.id;\n\n    return React.createElement(\n      'div',\n      { className: prefixCls + '-inner', id: id, role: 'tooltip' },\n      typeof overlay === 'function' ? overlay() : overlay\n    );\n  };\n\n  return Content;\n}(React.Component);\n\nContent.propTypes = {\n  prefixCls: PropTypes.string,\n  overlay: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired,\n  id: PropTypes.string,\n  trigger: PropTypes.any\n};\nexport default Content;","import _extends from 'babel-runtime/helpers/extends';\nimport _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Trigger from 'rc-trigger';\nimport { placements } from './placements';\nimport Content from './Content';\n\nvar Tooltip = function (_Component) {\n  _inherits(Tooltip, _Component);\n\n  function Tooltip() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Tooltip);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.getPopupElement = function () {\n      var _this$props = _this.props,\n          arrowContent = _this$props.arrowContent,\n          overlay = _this$props.overlay,\n          prefixCls = _this$props.prefixCls,\n          id = _this$props.id;\n\n      return [React.createElement(\n        'div',\n        { className: prefixCls + '-arrow', key: 'arrow' },\n        arrowContent\n      ), React.createElement(Content, {\n        key: 'content',\n        trigger: _this.trigger,\n        prefixCls: prefixCls,\n        id: id,\n        overlay: overlay\n      })];\n    }, _this.saveTrigger = function (node) {\n      _this.trigger = node;\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  Tooltip.prototype.getPopupDomNode = function getPopupDomNode() {\n    return this.trigger.getPopupDomNode();\n  };\n\n  Tooltip.prototype.render = function render() {\n    var _props = this.props,\n        overlayClassName = _props.overlayClassName,\n        trigger = _props.trigger,\n        mouseEnterDelay = _props.mouseEnterDelay,\n        mouseLeaveDelay = _props.mouseLeaveDelay,\n        overlayStyle = _props.overlayStyle,\n        prefixCls = _props.prefixCls,\n        children = _props.children,\n        onVisibleChange = _props.onVisibleChange,\n        afterVisibleChange = _props.afterVisibleChange,\n        transitionName = _props.transitionName,\n        animation = _props.animation,\n        placement = _props.placement,\n        align = _props.align,\n        destroyTooltipOnHide = _props.destroyTooltipOnHide,\n        defaultVisible = _props.defaultVisible,\n        getTooltipContainer = _props.getTooltipContainer,\n        restProps = _objectWithoutProperties(_props, ['overlayClassName', 'trigger', 'mouseEnterDelay', 'mouseLeaveDelay', 'overlayStyle', 'prefixCls', 'children', 'onVisibleChange', 'afterVisibleChange', 'transitionName', 'animation', 'placement', 'align', 'destroyTooltipOnHide', 'defaultVisible', 'getTooltipContainer']);\n\n    var extraProps = _extends({}, restProps);\n    if ('visible' in this.props) {\n      extraProps.popupVisible = this.props.visible;\n    }\n    return React.createElement(\n      Trigger,\n      _extends({\n        popupClassName: overlayClassName,\n        ref: this.saveTrigger,\n        prefixCls: prefixCls,\n        popup: this.getPopupElement,\n        action: trigger,\n        builtinPlacements: placements,\n        popupPlacement: placement,\n        popupAlign: align,\n        getPopupContainer: getTooltipContainer,\n        onPopupVisibleChange: onVisibleChange,\n        afterPopupVisibleChange: afterVisibleChange,\n        popupTransitionName: transitionName,\n        popupAnimation: animation,\n        defaultPopupVisible: defaultVisible,\n        destroyPopupOnHide: destroyTooltipOnHide,\n        mouseLeaveDelay: mouseLeaveDelay,\n        popupStyle: overlayStyle,\n        mouseEnterDelay: mouseEnterDelay\n      }, extraProps),\n      children\n    );\n  };\n\n  return Tooltip;\n}(Component);\n\nTooltip.propTypes = {\n  trigger: PropTypes.any,\n  children: PropTypes.any,\n  defaultVisible: PropTypes.bool,\n  visible: PropTypes.bool,\n  placement: PropTypes.string,\n  transitionName: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n  animation: PropTypes.any,\n  onVisibleChange: PropTypes.func,\n  afterVisibleChange: PropTypes.func,\n  overlay: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired,\n  overlayStyle: PropTypes.object,\n  overlayClassName: PropTypes.string,\n  prefixCls: PropTypes.string,\n  mouseEnterDelay: PropTypes.number,\n  mouseLeaveDelay: PropTypes.number,\n  getTooltipContainer: PropTypes.func,\n  destroyTooltipOnHide: PropTypes.bool,\n  align: PropTypes.object,\n  arrowContent: PropTypes.any,\n  id: PropTypes.string\n};\nTooltip.defaultProps = {\n  prefixCls: 'rc-tooltip',\n  mouseEnterDelay: 0,\n  destroyTooltipOnHide: false,\n  mouseLeaveDelay: 0.1,\n  align: {},\n  placement: 'right',\n  trigger: ['hover'],\n  arrowContent: null\n};\n\n\nexport default Tooltip;","import Tooltip from './Tooltip';\n\nexport default Tooltip;","import Slider from './Slider';\nimport Range from './Range';\nimport Handle from './Handle';\nimport createSliderWithTooltip from './createSliderWithTooltip';\n\nSlider.Range = Range;\nSlider.Handle = Handle;\nSlider.createSliderWithTooltip = createSliderWithTooltip;\nexport default Slider;\nexport { Range, Handle, createSliderWithTooltip };","import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';\nimport _defineProperty from 'babel-runtime/helpers/defineProperty';\nimport _extends from 'babel-runtime/helpers/extends';\nimport _classCallCheck from 'babel-runtime/helpers/classCallCheck';\nimport _createClass from 'babel-runtime/helpers/createClass';\nimport _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';\nimport _inherits from 'babel-runtime/helpers/inherits';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport Tooltip from 'rc-tooltip';\nimport Handle from './Handle';\n\nexport default function createSliderWithTooltip(Component) {\n  var _class, _temp2;\n\n  return _temp2 = _class = function (_React$Component) {\n    _inherits(ComponentWrapper, _React$Component);\n\n    function ComponentWrapper() {\n      var _ref;\n\n      var _temp, _this, _ret;\n\n      _classCallCheck(this, ComponentWrapper);\n\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = ComponentWrapper.__proto__ || Object.getPrototypeOf(ComponentWrapper)).call.apply(_ref, [this].concat(args))), _this), _this.state = {\n        visibles: {}\n      }, _this.handleTooltipVisibleChange = function (index, visible) {\n        _this.setState(function (prevState) {\n          return {\n            visibles: _extends({}, prevState.visibles, _defineProperty({}, index, visible))\n          };\n        });\n      }, _this.handleWithTooltip = function (_ref2) {\n        var value = _ref2.value,\n            dragging = _ref2.dragging,\n            index = _ref2.index,\n            disabled = _ref2.disabled,\n            restProps = _objectWithoutProperties(_ref2, ['value', 'dragging', 'index', 'disabled']);\n\n        var _this$props = _this.props,\n            tipFormatter = _this$props.tipFormatter,\n            tipProps = _this$props.tipProps,\n            handleStyle = _this$props.handleStyle;\n\n        var _tipProps$prefixCls = tipProps.prefixCls,\n            prefixCls = _tipProps$prefixCls === undefined ? 'rc-slider-tooltip' : _tipProps$prefixCls,\n            _tipProps$overlay = tipProps.overlay,\n            overlay = _tipProps$overlay === undefined ? tipFormatter(value) : _tipProps$overlay,\n            _tipProps$placement = tipProps.placement,\n            placement = _tipProps$placement === undefined ? 'top' : _tipProps$placement,\n            _tipProps$visible = tipProps.visible,\n            visible = _tipProps$visible === undefined ? false : _tipProps$visible,\n            restTooltipProps = _objectWithoutProperties(tipProps, ['prefixCls', 'overlay', 'placement', 'visible']);\n\n        var handleStyleWithIndex = void 0;\n        if (Array.isArray(handleStyle)) {\n          handleStyleWithIndex = handleStyle[index] || handleStyle[0];\n        } else {\n          handleStyleWithIndex = handleStyle;\n        }\n\n        return React.createElement(\n          Tooltip,\n          _extends({}, restTooltipProps, {\n            prefixCls: prefixCls,\n            overlay: overlay,\n            placement: placement,\n            visible: !disabled && (_this.state.visibles[index] || dragging) || visible,\n            key: index\n          }),\n          React.createElement(Handle, _extends({}, restProps, {\n            style: _extends({}, handleStyleWithIndex),\n            value: value,\n            onMouseEnter: function onMouseEnter() {\n              return _this.handleTooltipVisibleChange(index, true);\n            },\n            onMouseLeave: function onMouseLeave() {\n              return _this.handleTooltipVisibleChange(index, false);\n            }\n          }))\n        );\n      }, _temp), _possibleConstructorReturn(_this, _ret);\n    }\n\n    _createClass(ComponentWrapper, [{\n      key: 'render',\n      value: function render() {\n        return React.createElement(Component, _extends({}, this.props, { handle: this.handleWithTooltip }));\n      }\n    }]);\n\n    return ComponentWrapper;\n  }(React.Component), _class.propTypes = {\n    tipFormatter: PropTypes.func,\n    handleStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.arrayOf(PropTypes.object)]),\n    tipProps: PropTypes.object\n  }, _class.defaultProps = {\n    tipFormatter: function tipFormatter(value) {\n      return value;\n    },\n\n    handleStyle: [{}],\n    tipProps: {}\n  }, _temp2;\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\nimport Slider from 'rc-slider';\n\nclass SoundButton extends React.Component{\n  constructor(){\n    super();\n  }\n\n  render(){\n\n    return (<StripButton\n              onClick={() => this.props.onClick(\"SoundButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"sound\"\n              title=\"Sound\"\n              icon=\"fa-volume-up\"\n              >\n        <ul className=\"sound-button\">\n          <li>\n          <span className=\"spanLabel\">Volume:</span>\n          <div className=\"volume\">\n            <Slider min={0} max={10}\n             value={this.props.volume}\n             onChange={this.props.onVolumeChanged} />\n          </div>\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nSoundButton.propTypes = {\n  volume: PropTypes.number,\n  onCLick: PropTypes.func,\n  onVolumeChanged: PropTypes.func\n}\n\nexport default SoundButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\n\nclass PlayPauseButton extends React.Component{\n  constructor(){\n    super();\n  }\n  _onVisibilityOptionChange(field){\n    const newVisibility = Object.assign({}, this.props.visibility);\n    newVisibility[field] = !newVisibility[field];\n    this.props.onVisibilityChanged(newVisibility);\n  }\n  render(){\n    //if(!this.props.canPlay){return null;}\n    const title = this.props.isPlaying ? 'Pause' :\n      (this.props.canRewind ? 'Resume' : 'Play');\n    let playIcon = this.props.isPlaying ? \"fa-pause\" : \"fa-play\";\n    let backIcon = \"fa-backward\";\n    let rewindButton = null;\n\n    if(!this.props.canPlay){\n      playIcon = 'fa-spinner fa-spin';\n    }\n    return (\n      <li className=\"play-buttons\">\n        <ul>\n          <StripButton\n                onClick={this.props.onRestart}\n                hasDropDown={false}\n                title={'Restart'}\n                icon=\"fa-backward\"\n                disabled={!this.props.canRewind}\n                >\n          </StripButton>\n          <StripButton\n                  onClick={this.props.onPlayPause}\n                  hasDropDown={false}\n                  title={title}\n                  icon={playIcon}>\n          </StripButton>\n        </ul>\n      </li>);\n  }\n}\n\nPlayPauseButton.propTypes = {\n  isPlaying: PropTypes.bool,\n  canPlay: PropTypes.bool,\n  canRewind: PropTypes.bool,\n  onPlayPause: PropTypes.func,\n  onRestart: PropTypes.func,\n}\n\nexport default PlayPauseButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\n\nclass TempoButton extends React.Component{\n  constructor(){\n    super();\n    this._onChange = this._onChange.bind(this);\n  }\n\n  _onChange(bpm){\n     this.props.onChange(bpm);\n  }\n\n  render(){\n    return (<StripButton\n              onClick={() => this.props.onClick(\"TempoButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"tempo\"\n              title=\"BPM\"\n              iconText={this.props.currentBpm.toString()}\n              >\n        <ul className=\"tempo-selection\">\n          <li>\n            <span className=\"spanLabel\">Pick a Tempo:</span>\n            <div>\n              {this.props.availableBpms.map((bpm)=>{\n                const className = 'tempo-button ' + (bpm === this.props.currentBpm ? 'active': '');\n                return <a key={\"tempo-\" + bpm.toString()} href=\"#\" className={className} onClick={()=>this.props.onChange(bpm)}>\n                  <div className=\"tempo-button-inner\"> {bpm}</div>\n                </a>\n              })}\n            </div>\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nTempoButton.propTypes = {\n  currentBpm: PropTypes.number,\n  availableBpms: PropTypes.array,\n  onChange: PropTypes.func,\n}\n\nexport default TempoButton;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass KeySelector extends React.Component{\n  constructor(){\n    super();\n    this.state = {};\n  }\n  componentDidMount(){\n\n  }\n  componentWillUnmount(){\n\n  }\n\n  render(){\n    const currentIsOriginalKey = this.props.originalKey.name === this.props.currentKey.name;\n    const originalKeyClassName = 'key-button ' + (currentIsOriginalKey ? 'active': '');\n\n    return (<div className=\"key-selection\">\n      <div className=\"original-key\">\n        <span className=\"spanLabel\">Original Key</span>\n          return <a key={\"key-\" + this.props.originalKey.name} href=\"#\"\n            className={originalKeyClassName}\n            onClick={()=>this.props.onChange(this.props.originalKey)}>\n          <div className=\"key-button-inner\"> {this.props.originalKey.name}</div>\n        </a>\n      <div>\n      </div>\n        <a className=\"spanLabel\" id=\"adgc-link\" href=\"/articles/bass-guitar-adgc-tuning\" target=\"_blank\">ADGC Tuning</a>\n        <label className=\"switch\">\n          <input type=\"checkbox\" checked={currentIsOriginalKey && this.props.adgcTuning}\n            onChange={this.props.onSwitchTuning}/>\n          <span className=\"slider round\"></span>\n        </label>\n      </div>\n      <div>\n        <span className=\"spanLabel\">Alternative keys:</span>\n        <div>\n        {this.props.availableKeys\n          .filter(key=>key.name !== this.props.originalKey.name)\n          .map((key)=>{\n          const className = 'key-button ' + (key.name === this.props.currentKey.name ? 'active': '');\n          return <a key={\"key-\" + key.name} href=\"#\" className={className} onClick={()=>this.props.onChange(key)}>\n            <div className=\"key-button-inner\"> {key.name}</div>\n          </a>\n        })}\n        </div>\n      </div>\n    </div>);\n  }\n}\n\nKeySelector.displayName = 'KeySelector';\nKeySelector.propTypes = {\n  originalKey: PropTypes.object,\n  currentKey: PropTypes.object,\n  availableKeys: PropTypes.array,\n  adgcTuning: PropTypes.bool,\n  onChange: PropTypes.func,\n  onSwitchTuning: PropTypes.func\n}\n\nexport default KeySelector;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\nimport KeySelector from './../shared/keySelector.jsx';\n\nclass KeyButton extends React.Component{\n  constructor(){\n    super();\n    this._onChange = this._onChange.bind(this);\n  }\n\n  _onChange(key){\n     this.props.onChange(key);\n  }\n\n  render(){\n\n    return (<StripButton\n              onClick={() => this.props.onClick(\"KeyButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"key\"\n              title=\"Transpose\"\n              iconText={this.props.currentKey.name}\n              >\n        <ul>\n          <li>\n          <KeySelector\n            originalKey={this.props.originalKey}\n            currentKey={this.props.currentKey}\n            availableKeys={this.props.availableKeys}\n            onChange={this.props.onChange}\n            onSwitchTuning={this.props.onSwitchTuning}\n            adgcTuning={this.props.adgcTuning}\n            />\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nKeyButton.propTypes = {\n  originalKey: PropTypes.object,\n  currentKey: PropTypes.object,\n  availableKeys: PropTypes.array,\n  onChange: PropTypes.func,\n  onSwitchTuning: PropTypes.func,\n  adgcTuning: PropTypes.bool,\n}\n\nexport default KeyButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\n\nconst repeatsOmitted = [\n  \"To make looping possibe, pickup notes have been removed and repeats are not played.\",\n  \"You can pickup the pickup notes in the downloadable score.\"];\n\nconst texts = {\n  repeatsOmitted\n};\n\nclass InfoButton extends React.Component{\n  constructor(){\n    super();\n  }\n\n  render(){\n    const infoTextLines = this.props.info.map(i => texts[i]);\n    const infoText = infoTextLines.map((tl, indexTl) =>\n      tl.map((tl, index) => <p key={`${indexTl}-${index}`}>{tl}</p>));\n\n    return (<StripButton\n              onClick={() => this.props.onClick(\"InfoButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"info\"\n              title=\"Info\"\n              icon=\"fa-info-circle\"\n              >\n        <ul className=\"info-section\">\n          <li>\n          {infoText}\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nInfoButton.propTypes = {\n  onCLick: PropTypes.func,\n  info: PropTypes.array\n}\n\nexport default InfoButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StripButton from './stripButton.jsx';\nimport KeySelector from './../shared/keySelector.jsx';\n\nclass DownloadButton extends React.Component{\n  constructor(){\n    super();\n    this._onKeyOverride = this._onKeyOverride.bind(this);\n    this._onShowTabsOverride = this._onShowTabsOverride.bind(this);\n    this._onOpenPage = this._onOpenPage.bind(this);\n    this._onOpenDownloadUrl = this._onOpenDownloadUrl.bind(this);\n    this._onSwitchTuning = this._onSwitchTuning.bind(this);\n    this.state = {showTabs: null, keyOverride: null, adgcTuning: false};\n  }\n  _onSwitchTuning(){\n    this.setState({adgcTuning: !this.state.adgcTuning});\n  }\n  _onKeyOverride(keyOverride){\n    if(keyOverride.name !== this.props.originalKey.name){\n      this.setState({ adgcTuning: false });\n    }\n    this.setState({ keyOverride });\n  }\n  _onShowTabsOverride(showTabs){\n    this.setState({ showTabs });\n  }\n  _openScoreUrl(path){\n    let url = this.props.contentUrl.replace('content.json', path);\n    const showTabs = this.state.showTabs != null ? this.state.showTabs : this.props.visibility.tablature;\n    const key = this.state.keyOverride != null ? this.state.keyOverride : this.props.currentKey;\n    const showTabsParam = showTabs ? 'true' : 'false';\n    url += '?show_tabs=' + showTabsParam + '&key=' + key.name + '&adgc=' + this.state.adgcTuning;\n    window.open(url, \"_blank\");\n  }\n  _onOpenPage(){\n    this._openScoreUrl('score');\n  }\n  _onOpenDownloadUrl(){\n    this._openScoreUrl('download');\n  }\n  render(){\n    let currentKey = this.state.keyOverride != null ? this.state.keyOverride : this.props.currentKey;\n    let showTabs = this.state.showTabs != null ? this.state.showTabs : this.props.visibility.tablature;\n    return (<StripButton\n              onClick={() => this.props.onClick(\"DownloadButton\")}\n              isOpen={this.props.isOpen}\n              dropDownClassName=\"download\"\n              title=\"Score\"\n              icon=\"fa-download\"\n              >\n        <ul className=\"download\">\n          <li>\n            <KeySelector\n              originalKey={this.props.originalKey}\n              currentKey={currentKey}\n              availableKeys={this.props.availableKeys}\n              onChange={this._onKeyOverride}\n              onSwitchTuning={this._onSwitchTuning}\n              adgcTuning={this.props.adgcTuning}\n              />\n          </li>\n          <li>\n            <div className=\"check-tabs\">\n              <span className=\"spanLabel\">Include Tablature:</span>\n              <label className=\"switch\">\n                <input type=\"checkbox\" checked={showTabs}\n                   onChange={()=>this._onShowTabsOverride(!showTabs)}/>\n                <span className=\"slider round\"></span>\n              </label>\n            </div>\n            <div className=\"buttons\">\n              <button className=\"btnYellow\" onClick={this._onOpenPage}>\n                Open in new page\n              </button>\n              <button className=\"btnYellow\" onClick={this._onOpenDownloadUrl}>\n                Download as PDF\n              </button>\n            </div>\n          </li>\n        </ul>\n      </StripButton>);\n  }\n}\n\nDownloadButton.propTypes = {\n  originalKey: PropTypes.object,\n  availableKeys: PropTypes.array,\n  currentKey: PropTypes.shape({name}),\n  onCLick: PropTypes.func\n}\n\nexport default DownloadButton;","import React from 'react';\n\nclass DonateButton extends React.Component{\n  constructor(){\n    super();\n  }\n\n  render(){\n    return (<li className={'borderRight dropup'} style={{'position': 'relative', 'top': '-10px'}} >\n      <a className=\"dropdown-toggle\" onClick={this._onClick}>\n        <form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\" target=\"_top\">\n          <input type=\"hidden\" name=\"cmd\" value=\"_s-xclick\" />\n          <input type=\"hidden\" name=\"hosted_button_id\" value=\"GPFS43CT5W3VG\" />\n          <input type=\"image\" src=\"https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif\" border=\"0\" name=\"submit\" title=\"PayPal - The safer, easier way to pay online!\" alt=\"Donate with PayPal button\" />\n          <img alt=\"\" border=\"0\" src=\"https://www.paypal.com/en_US/i/scr/pixel.gif\" width=\"1\" height=\"1\" />\n        </form>\n      </a>\n\n    </li>);\n  }\n}\n\nDonateButton.propTypes = {\n}\n\nexport default DonateButton;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport VisibilityButton from './buttons/visibility.jsx';\nimport LoopButton from './buttons/loop.jsx';\nimport SoundButton from './buttons/sound.jsx';\nimport PlayPauseButton from './buttons/playPause.jsx';\nimport TempoButton from './buttons/tempo.jsx';\nimport KeyButton from './buttons/key.jsx';\nimport InfoButton from './buttons/info.jsx';\nimport DownloadButton from './buttons/download.jsx';\nimport DonateButton from './buttons/donate.jsx';\n\nclass ButtonStrip extends React.Component {\n\n  constructor(){\n    super();\n    this._onButtonClick = this._onButtonClick.bind(this);\n  }\n  _isOpen(type){\n    return this.props.openButton === type;\n  }\n  _onButtonClick(buttonType){\n    this.props.onButtonClick(buttonType, this._isOpen(buttonType));\n  }\n  render() {\n    let buttons = null;\n    if(this.props.score){\n      const infoButton = this.props.info && this.props.info.length ?\n          <InfoButton\n            onClick={this._onButtonClick}\n            isOpen={this._isOpen(\"InfoButton\")}\n            info={this.props.info}\n          /> : null;\n      buttons = (\n        <ul>\n          <DonateButton />\n          {infoButton}\n          <VisibilityButton\n              onClick={this._onButtonClick}\n              isOpen={this._isOpen(\"VisibilityButton\")}\n              visibility={this.props.visibility}\n              onVisibilityChanged={this.props.onVisibilityChanged}\n              />\n            <LoopButton\n              onClick={this._onButtonClick} isOpen={this._isOpen(\"LoopButton\")}\n              score={this.props.score}\n              fromBar={this.props.fromBar}\n              toBar={this.props.toBar}\n              onLoopChanged={this.props.onLoopChanged}\n              pauseOption={this.props.pauseOption}\n              onPauseOptionChanged={this.props.onPauseOptionChanged}\n              />\n            <TempoButton\n              onClick={this._onButtonClick} isOpen={this._isOpen(\"TempoButton\")}\n              currentBpm={this.props.currentBpm}\n              availableBpms={this.props.score.data.availableBpms}\n              onChange={this.props.onBpmChanged} />\n\n            <KeyButton\n              onClick={this._onButtonClick} isOpen={this._isOpen(\"KeyButton\")}\n              currentKey={this.props.currentKey}\n              originalKey={this.props.originalKey}\n              availableKeys={this.props.score.data.availableKeys}\n              adgcTuning={this.props.adgcTuning}\n              onChange={this.props.onKeyChanged}\n              onSwitchTuning={this.props.onSwitchTuning}/>\n            <SoundButton\n              isOpen={this._isOpen(\"SoundButton\")}\n              onClick={this._onButtonClick}\n              volume={this.props.soundVolume}\n              onVolumeChanged={this.props.onVolumeChanged}\n            />\n            <DownloadButton\n              isOpen={this._isOpen(\"DownloadButton\")}\n              onClick={this._onButtonClick}\n              currentKey={this.props.currentKey}\n              originalKey={this.props.originalKey}\n              availableKeys={this.props.score.data.availableKeys}\n              visibility={this.props.visibility}\n              contentUrl={this.props.contentUrl}\n            />\n\n            <PlayPauseButton\n              isPlaying={this.props.isPlaying}\n              canPlay={this.props.canPlay}\n              onPlayPause={this.props.onPlayPause}\n              onRestart={this.props.onRestart}\n              canRewind={this.props.canRewind}\n              />\n          </ul>\n        );\n    }\n    //<LoopButton />\n    //<TempoButton />\n    //<TransposeButton />\n    //<VideoButton />\n    //<DownloadButton />\n    //<PlayPauseButton />\n    return (<div className=\"playerActionwrap\">\n          {buttons}\n        </div>)\n  }\n}\n\n\nButtonStrip.displayName = 'ButtonStrip';\nButtonStrip.propTypes = {\n  info: PropTypes.array,\n  score: PropTypes.shape(),\n  openButton: PropTypes.string,\n  onButtonClick: PropTypes.func,\n  fromBar: PropTypes.shape(),\n  toBar: PropTypes.shape(),\n  pauseOption: PropTypes.string,\n  visibility: PropTypes.shape(),\n  isPlaying: PropTypes.bool,\n  canPlay: PropTypes.bool,\n  canRewind: PropTypes.bool,\n  currentBpm: PropTypes.number,\n  availableBpms: PropTypes.array,\n  currentKey: PropTypes.object,\n  originalKey: PropTypes.object,\n  adgcTuning: PropTypes.bool,\n  availableKeys: PropTypes.array,\n  soundVolume: PropTypes.number,\n  onPlayPause: PropTypes.func,\n  onRestart: PropTypes.func,\n  onLoopChanged: PropTypes.func.isRequired,\n  onPauseOptionChanged: PropTypes.func.isRequired,\n  onVisibilityChanged: PropTypes.func.isRequired,\n  onBpmChanged: PropTypes.func.isRequired,\n  onKeyChanged: PropTypes.func.isRequired,\n  onSwitchTuning: PropTypes.func.isRequired,\n  onVolumeChanged: PropTypes.func.isRequired\n}\n\nexport default ButtonStrip;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nlet frameCounter = 0;\nfunction seek(videoElement, positionMs){\n  videoElement.currentTime = positionMs / 1000;\n  videoElement.play();\n}\nfunction loopVideo(that){\n  const videoElement = document.getElementById(that.props.videoElementId);\n  if(that.props.playing && videoElement.paused){\n    videoElement.play();\n  }\n  window.requestAnimationFrame((/*time*/)=>{\n    if(++frameCounter % 2 === 0){\n      frameCounter = 0;\n      const time = videoElement.currentTime * 1000;\n      if((time > that.props.to) || (time < that.props.from)){\n        seek(videoElement, that.props.from)\n      }\n    }\n    loopVideo(that);\n  });\n}\n\nclass VideoControl extends React.Component{\n  componentDidMount(){\n    if(this.props.loop){\n      loopVideo(this);\n    }\n  }\n  render(){\n    //style={{position:'relative', left:1000}}\n    return (<video id={this.props.videoElementId} controls >\n      {this.props.sources.map(s => <source key={s.type} src={s.src} type={s.type} />)}\n    </video>);\n  }\n}\n\nVideoControl.displayName = 'VideoControl';\nVideoControl.propTypes = {\n  sources: PropTypes.array.isRequired,\n  from: PropTypes.number.isRequired,\n  to: PropTypes.number.isRequired,\n  videoElementId: PropTypes.string.isRequired,\n  loop: PropTypes.bool.isRequired,\n}\nexport default VideoControl;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass BarControl extends React.Component{\n  constructor(){\n    super();\n    this.state = {currentBar: null};\n  }\n  componentDidMount(){\n    this.props.timer.addHandler(this);\n  }\n  componentWillUnmount(){\n    this.props.timer.removeHandler(this);\n  }\n  onTimeChange({currentBar}){\n    this.setState({currentBar: currentBar})\n  }\n\n  render(){\n    return (<div className={'bar-control'} >\n      {this.state.currentBar ? this.state.currentBar.name : \"\"}\n    </div>);\n  }\n}\n\nBarControl.displayName = 'BarControl';\nBarControl.propTypes = {\n  timer: PropTypes.object,\n}\nexport default BarControl;","import React from 'react';\nimport PropTypes from 'prop-types';\n\nclass CenterControl extends React.Component{\n  constructor(){\n    super();\n  }\n\n  componentDidMount(){\n\n  }\n\n  render(){\n    if(!this.props.visible){\n      return null;\n    }\n    let content = null;\n    content = (<div className={'play-button'} >\n      <i className=\"fa fa-play\" ></i>\n    </div>);\n\n    if(this.props.isLoading){\n      content = (<div className={'loading-indicator'}>\n        <i className='fa fa-spinner fa-spin'></i>\n      </div>)\n    }\n\n    if(!this.props.isPlaying){\n      const onClick  = (e) => {this.props.onClick(e); e.preventDefault(); e.stopPropagation();}\n      return (\n      <div>\n        <div className={'center-control-overlay'}> </div>\n        <div style={{'cursor': 'pointer'}} className={'center-control'} onClick={onClick}>\n          {content}\n        </div>\n      </div>)\n    }else{\n      return null;\n    }\n  }\n}\n\nCenterControl.displayName = 'CenterControl';\nCenterControl.propTypes = {\n  isPlaying: PropTypes.bool,\n  onClick: PropTypes.func\n}\nexport default CenterControl;","const fingerState = require('../fretboard/fingerState.js');\nlet audioContext = null;\nlet playingNotes = [];\n\nconst notes = ['A0', 'Bb0', 'B0',\n  'C1', 'Db1', 'D1', 'Eb1', 'E1', 'F1', 'Gb1', 'G1', 'Ab1', 'A1', 'Bb1', 'B1',\n  'C2', 'Db2', 'D2', 'Eb2', 'E2', 'F2', 'Gb2', 'G2', 'Ab2', 'A2', 'Bb2', 'B2',\n  'C3', 'Db3', 'D3', 'Eb3', 'E3', 'F3', 'Gb3', 'G3', 'Ab3', 'A3', 'Bb3', 'B3',\n  'C4', 'Db4', 'D4', 'Eb4', 'E4', 'F4', 'Gb4', 'G4', 'Ab4', 'A4', 'Bb4', 'B4',\n  'C5', 'Db5', 'D5', 'Eb5', 'E5', 'F5', 'Gb5', 'G5', 'Ab5', 'A5', 'Bb5', 'B5',\n  'C6', 'Db6', 'D6', 'Eb6', 'E6', 'F6', 'Gb6', 'G6', 'Ab6', 'A6', 'Bb6', 'B6',\n  'C7', 'Db7', 'D7', 'Eb7', 'E7', 'F7', 'Gb7', 'G7', 'Ab7', 'A7', 'Bb7', 'B7',\n  'C8'\n];\n\nfunction getNotePosition(notes, note){\n  return notes.indexOf(note);\n};\n\n\nconst openStringNotes = {\n  EADG: {\n    1: getNotePosition(notes, 'G2'),\n    2: getNotePosition(notes, 'D2'),\n    3: getNotePosition(notes, 'A1'),\n    4: getNotePosition(notes, 'E1'),\n  },\n  ADGC: {\n    1: getNotePosition(notes, 'C3'),\n    2: getNotePosition(notes, 'G2'),\n    3: getNotePosition(notes, 'D2'),\n    4: getNotePosition(notes, 'A1'),\n  }\n}\n\n\nfunction playNote(instrument, scoreNote, currentTime, absoluteTime, tempoFactor, offset, volume){\n  if(scoreNote.note){\n    //rests are completely silent.\n    const atDiff = scoreNote.at - currentTime;\n    const at = (absoluteTime + (atDiff * tempoFactor)) + offset;\n    const duration = (scoreNote.to - scoreNote.at) / tempoFactor;\n\n    const instrumentNote = instrument.play(scoreNote.note, at / 1000, {gain: volume / 10});\n    instrumentNote.stop((at + duration) / 1000) ;\n  }\n}\n\nclass SoundPlayer {\n  constructor(audioContext, instrument, timer, score, tuning, volume){\n    this.audioContext = audioContext;\n    this.instrument = instrument;\n    this.onPrepare = this.onPrepare.bind(this);\n    this.timer = timer;\n    this.timer.addHandler(this);\n\n    //this.fingerState = fingerState.init(score);\n    this.score = score;\n    this.tuning = tuning;\n    this.lastTime = -1;\n    this.currentNoteIndex = 0;\n    this.volume=volume;\n  }\n  destroy(){\n    this.timer.removeHandler(this);\n  }\n\n  setTuning(tuning){this.tuning = tuning;}\n  setVolume(volume){this.volume = volume;}\n\n  onTimerStarted(){\n    this.scoreNotes = this.score.getFretboardMovement().rightHand.map((f)=>{\n      let openStringNoteIndex = openStringNotes[this.tuning][f.string];\n      const note =  notes[openStringNoteIndex + f.fret];\n      return {note, at: f.at, to: f.to, string: f.string, fret: f.fret};\n    });\n    this.currentNoteIndex = 0;\n    //instead, let's calculate the new set of commands\n    //and exevute them in the onprepare fphase\n    //this.fingerState = fingerState.init(this.score);\n  }\n\n  onPrepare({time, absoluteTime, offset, absoluteOffset}){\n    if(!this.scoreNotes){ return; }\n    if(time < this.lastTime){\n      this.currentNoteIndex = 0;\n      //beginning of loop, reinit\n      //this.fingerState = fingerState.init(this.score);\n    }\n    this.lastTime = time;\n    let currentNote = this.scoreNotes[this.currentNoteIndex];\n    while(currentNote && currentNote.at <= time){\n      if(currentNote.to > time){\n        playNote(this.instrument, currentNote, time, absoluteTime, this.timer.tempoFactor, absoluteOffset, this.volume);\n      }//else, we are before the start of the loop\n      this.currentNoteIndex ++;\n      if(this.currentNoteIndex >= this.scoreNotes.length){\n        currentNote = null\n      }else{\n        currentNote = this.scoreNotes[this.currentNoteIndex];\n      }\n    }\n    // this.lastTime = time;\n    // this.fingerState = fingerState.getAt(this.fingerState, time);\n    // if(this.fingerState.changed){\n    //   fingerStateUpdate(this.instrument, this.fingerState, absoluteTime, absoluteOffset);\n    // }\n  }\n\n  onFactorChanged(factor){\n    //cancel all pending notes\n    playingNotes.forEach(n => n.playing.stop());\n    playingNotes = [];\n  }\n  playASilentNote(){\n    this.instrument.play(\"C4\", 0, {gain: 0});\n  }\n}\n\n\nexport default SoundPlayer;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport request from 'browser-request';\nimport FretboardWrapper from \"./fretboardWrapper.jsx\";\nimport ScoreWrapper from './scoreWrapper.jsx';\nimport InfoTrack from './infoTrack.jsx';\nimport ButtonStrip from './buttonStrip.jsx';\nimport VideoControl from './videoControl.jsx';\nimport BarControl from './barControl.jsx';\nimport CenterControl from './centerControl.jsx';\n\nimport Timer from '../helpers/timer.js';\nimport SoundPlayer from '../helpers/soundPlayer.js';\n\nconst VIDEO_ELEMENT_ID = 'study-video';\nconst SoundFont = require('soundfont-player');\nlet instrument;\nlet audioContext = window.AudioContext ? new window.AudioContext() : new window.webkitAudioContext();\nconst fontName = 'MusyngKite'; //'FluidR3_GM'\n\nfunction nameToUrl(name, soundFont, format){\n  return `/soundfonts/mk_${name}-${format||'mp3'}.js`;\n}\n\nlet titleElement;\nfunction updatePageTitle(key){\n  if(!titleElement){\n    titleElement = document.getElementById('title');\n  }\n  const keyNote = key.substr(0,1)\n  titleElement.innerText=titleElement.dataset.contentTemplate.replace(\"<KEY>\", key)\n}\nlet pauseDuration = 0;\nlet playedOnce = false;\n\n\nfunction loadData(contentUrl, cb){\n  request({url: contentUrl, json: true}, function(err, response, body) {\n    if(err){\n      cb(err);\n    }else{\n      cb(null, body);\n    }\n  })\n}\n\nfunction barDurationToBpm(barDuration, beatsPerBar){\n  return 60000 / (barDuration / beatsPerBar);\n}\n\nfunction bpmToFactor(originalBpm, wantedBpm){\n  return  wantedBpm / originalBpm;\n}\n\nfunction getStoredConfig(partId, bars){\n  if (typeof(Storage) !== \"undefined\") {\n    const config = localStorage[partId + '-loopConfig'];\n    if(config){\n      try{\n        const {fromBar: fromBarIndex, toBar: toBarIndex\n          , pauseOption, bpm, key, adgcTuning, soundVolume} = JSON.parse(config);\n        if(fromBarIndex >= 0 && fromBarIndex < bars.length\n          && toBarIndex >= 0 && toBarIndex < bars.length){\n          return {\n            fromBar: bars[fromBarIndex], toBar: bars[toBarIndex],\n            pauseOption, bpm, key, adgcTuning, soundVolume\n          };\n        }else{\n          //indexes dont seem to be valid\n          delete localStorage[partId + '-loopConfig'];\n        }\n\n      }catch(e){\n        //loopConfig seem broken\n        delete localStorage[partId + '-loopConfig'];\n      }\n    }\n  }\n  return {\n    //initial state\n    fromBar: bars[0], toBar: bars[bars.length -1], pauseOption: 'none', adgcTuning: false, soundVolume: 10\n  };\n}\n\nfunction storeConfig(partId, barRange){\n  if (typeof(Storage) !== \"undefined\") {\n    localStorage[partId + '-loopConfig'] = JSON.stringify(barRange);\n  }\n}\n\nfunction getPauseFactor(option){\n  return {\n      \"none\":0,\n      \"eight\": 0.125,\n      \"quarter\": 0.25,\n      \"half\": 0.5}[option] || 0;\n}\n\nfunction log_analytics(){\n  if(typeof gtag !== 'undefined'){\n    gtag.apply(null, arguments)\n  } else{\n    console.log.apply(null, arguments)\n  }\n}\n\nclass Score {\n  constructor(data){\n    this.data = data;\n  }\n\n  setKey(key){\n    this.currentKeyData = this.data.keys[key.name];\n    this.key = key;\n    if(key.name === this.data.originalKey.name){\n      this.adgcKeyData = this.data.adgcKeys[this.data.originalKey.name];\n    }\n  }\n\n  getKey(){\n    return this.key;\n  }\n\n  getBars(){\n    if(this.useAdgcTuning){\n      return this.adgcKeyData.bars;\n    }\n    return this.currentKeyData.bars;\n  }\n\n  getFretboardMovement(){\n    if(this.useAdgcTuning){\n      return this.adgcKeyData.fretboardMovement;\n    }\n    else{\n      return this.currentKeyData.fretboardMovement;\n    }\n  }\n\n  getTabScore(){\n    if(this.useAdgcTuning){\n      return this.adgcKeyData.tabScore;\n    }\n    return this.currentKeyData.tabScore;\n  }\n}\n\nclass Content extends React.Component{\n  constructor(){\n    super();\n    ['_onFretboardTabClick', '_onScoreTabClick',\n      '_fretboardTabActive', '_scoreTabActive',\n      '_onLoopChanged', '_onPauseOptionChanged',\n      '_onVisibilityChanged', '_onPlayPause', '_onRestart',\n      '_onButtonBarButtonClick', '_onContentClick',\n      '_onBpmChanged', '_onKeyChanged', '_onSwitchTuning',\n      '_onVolumeChanged']\n      .map((name)=>{\n        const fn = this[name];\n        this[name]=function(){\n          let action = name;\n          if(name === '_onButtonBarButtonClick')\n          {\n            action = arguments[0];\n          }\n          log_analytics('event', action, {\n            event_category: 'study',\n            event_label: this.state.data.partId\n          });\n          fn.apply(this, arguments);\n        }.bind(this);\n        return name;\n      });\n    this.state = {\n      showTabs: true,\n      openButton: null,\n      visibility: {\n        fretboard: true,\n        tablature: true\n      },\n      adgcTuning: false,\n      centerControlVisible: true\n    };\n  }\n  componentDidMount(){\n    loadData(this.props.contentUrl, (err, data)=>{\n      const score = new Score(data);\n      score.setKey(data.defaultKey);\n      let soundPlayer = null;\n      let {fromBar, toBar, pauseOption, bpm, key, adgcTuning, soundVolume}\n        = getStoredConfig(data.partId, score.getBars());\n      if(typeof soundVolume === \"undefined\"){\n        soundVolume = 10;\n      }\n      if(key && data.keys[key.name]){\n        score.setKey(key);\n        score.useAdgcTuning= adgcTuning;\n      }\n      updatePageTitle(score.key.name);\n      const pauseBarFactor =  getPauseFactor(pauseOption);\n      SoundFont.instrument(audioContext, 'acoustic_bass', { nameToUrl, soundfont: fontName }).then((i) => {\n        if(soundPlayer){\n          soundPlayer.instrument = i;\n        }\n        //instrument = i;\n        this.setState({canPlay: true, score: score});\n      });\n      if(!err){\n        const timer = new Timer({audioContext, score,\n            fromBar: fromBar, toBar: toBar,\n            barDuration: data.barDuration, pauseBarFactor: pauseBarFactor,\n            tempoFactor: 1});\n        soundPlayer = new SoundPlayer(\n          audioContext, instrument, timer, score, adgcTuning ? 'ADGC': 'EADG', soundVolume);\n        this.setState({\n          data: data,\n          fromBar: fromBar, //first bar\n          toBar: toBar, //last bar\n          pauseOption: pauseOption,\n          isPlaying: false,\n          canPlay: false,\n          showTabs: false,\n          timer,\n          soundPlayer,\n          currentBpm: bpm || data.defaultBpm,\n          score,\n          adgcTuning,\n          soundVolume\n        });\n      }\n    });\n  }\n  _getContent(){\n    const {state} = this;\n    let scoreComponent = <div>loading...</div>;\n    let fretboardComponent = <div>loading...</div>;\n    let infoTrackComponent = null;\n    let barControlComponent = null;\n    if(state.score){\n      barControlComponent = <BarControl timer={state.timer}/>;\n      if(state.visibility.fretboard){\n        fretboardComponent = <FretboardWrapper\n        score={state.score}\n        timer={state.timer} />;\n      }else{\n        fretboardComponent = null;\n      }\n\n      scoreComponent = <ScoreWrapper\n        bars={state.score.getBars()}\n        fromBar={state.fromBar}\n        toBar={state.toBar}\n        tabTuning={state.score.getTabScore().tuning}\n        tabKey={state.score.getTabScore().key}\n        timeSig={state.data.timeSig || `${state.data.beatsPerBar}/4`}\n        notes={state.score.getFretboardMovement().rightHand}\n        beatsPerBar={state.data.beatsPerBar}\n        showNotation={true}\n        showTabs={state.visibility.tablature}\n        timer={state.timer}\n        adgcTuning={state.adgcTuning}\n        fullBarDuration={state.data.barDuration}\n        />\n      // Implement later\n      // infoTrackComponent = <InfoTrack\n      //   score={state.score}\n      //   timer={state.timer}\n      //   />;\n    }\n\n    return (<div className=\"study-content\" >\n      {infoTrackComponent}\n      <div className={'fretboard'}>\n        {fretboardComponent}\n      </div>\n      <div className={'score'} >\n        {scoreComponent}\n        {barControlComponent}\n      </div>\n    </div>);\n  }\n  _onFretboardTabClick(ev){\n    this.setState({currentTab: 'fretboard'});\n    ev.preventDefault();\n  }\n  _onScoreTabClick(ev){\n    this.setState({currentTab: 'score'});\n    ev.preventDefault();\n  }\n  _fretboardTabActive(){\n    return this.state.currentTab === 'fretboard';\n  }\n  _scoreTabActive(){\n    return this.state.currentTab === 'score';\n  }\n  _onButtonBarButtonClick(buttonType, open){\n    if(open){\n      this.setState({openButton: null});\n    }else{\n      this.setState({openButton: buttonType});\n    }\n  }\n  _onContentClick(e){\n    e.preventDefault();\n    if(this.state.openButton){\n      this.setState({openButton :null});\n    }else if(this.state.isPlaying){\n      this._onPlayPause();\n    }else{\n      if(this.state.data){\n        //not playing and no open button, data loaded, toggle the center control\n        this.setState({centerControlVisible: !this.state.centerControlVisible});\n      }\n    }\n    if(this.state.isPlaying){\n      document.body.classList.remove('hide-bars');\n      setTimeout(()=>{\n        if(this.state.isPlaying && !this.state.openButton){\n          document.body.classList.add('hide-bars');\n        }\n      }, 5000);\n    }\n\n  }\n  _onLoopChanged(changes)\n  {\n    const fromBar = changes.fromBar;\n    const toBar = changes.toBar;\n    if(fromBar && !toBar){\n      let nextToBar = this.state.toBar;\n\n      let availableBars = this.state.score.getBars();\n      //from can be bigger than to, so set toBar to current difference\n      if(fromBar.number >= this.state.toBar.number){\n        const barDiff = this.state.toBar.number - this.state.fromBar.number;\n        nextToBar = availableBars.find(b => b.number == fromBar.number + barDiff)\n          || availableBars[availableBars.length - 1];\n      }\n      this.setState({fromBar: fromBar, toBar: nextToBar}, this._storeStateAndRestarTimer);\n    }else{\n      this.setState(changes, this._storeStateAndRestarTimer);\n    }\n  }\n\n  _onPauseOptionChanged(option){\n    this.setState({pauseOption: option}, this._storeStateAndRestarTimer);\n  }\n\n  _onVisibilityChanged(visibility){\n    this.setState({visibility})\n  }\n  _startPlaying(){\n    document.body.classList.add('hide-bars')\n    this._startTimer();\n    this.setState({isPlaying: true, openButton: null});\n  }\n  _resumePlaying(){\n    document.body.classList.add('hide-bars')\n    this.state.timer.resume();\n    this.setState({isPlaying: true, openButton: null});\n  }\n  _stopPlaying(){\n    document.body.classList.remove('hide-bars')\n    this._stopTimer()\n    this.setState({isPlaying: false, openButton: null});\n  }\n  _onPlayPause(){\n    if(!this.state.canPlay){\n      return;\n    }\n    const startOrStop = () => {\n      if(this.state.timer.isPlaying){\n        this._stopPlaying();\n      }else{\n        if(this.state.timer && this.state.timer.canResume()){\n          this._resumePlaying();\n        }else{\n          this._startPlaying();\n        }\n      }\n    }\n\n    if(!playedOnce){\n      playedOnce = true;\n      //activate sound on iOS on use event.\n      this.state.soundPlayer.playASilentNote();\n      setTimeout(()=>{\n        startOrStop();\n      }, 250);\n    }else{\n      startOrStop();\n    }\n  }\n\n  _onRestart(){\n    this._startPlaying();\n  }\n  _onBpmChanged(bpm){\n    this.setState({currentBpm: bpm}, this._storeState);\n    const originalBpm = barDurationToBpm(this.state.data.barDuration, this.state.data.beatsPerBar)\n    this.state.timer.setTempoFactor(bpmToFactor(originalBpm, bpm));\n  }\n  _onKeyChanged(key){\n    updatePageTitle(key.name);\n    this.state.score.setKey(key);\n\n    const adgcTuning = this.state.data.originalKey.name === key.name ?\n        this.state.adgcTuning : false;\n    this.state.score.useAdgcTuning=adgcTuning;\n    this.state.soundPlayer.setTuning(adgcTuning ? 'ADGC' : 'EADG');\n    this.setState({adgcTuning}, ()=>{\n      this._storeStateAndRestarTimer();\n    });\n  }\n  _onSwitchTuning(){\n    if(this.state.data.originalKey.name === this.state.score.key.name){\n      const newAdgcTuning = !this.state.adgcTuning;\n      this.state.score.useAdgcTuning = newAdgcTuning;\n      this.state.soundPlayer.setTuning(newAdgcTuning ? 'ADGC' : 'EADG');\n      this.setState({adgcTuning: newAdgcTuning},()=>{\n        this._storeStateAndRestarTimer();\n      });\n    }\n  }\n  _onVolumeChanged(volume){\n    if(this.state.soundPlayer){\n      this.state.soundPlayer.setVolume(volume);\n    }\n    this.setState({soundVolume: volume});\n    this._storeState();\n  }\n  _storeStateAndRestarTimer(){\n    this._storeState();\n    this._restartTimer();\n  }\n  _storeState(){\n    storeConfig(this.state.data.partId, {\n      fromBar: this.state.fromBar.number -1,\n      toBar: this.state.toBar.number -1,\n      pauseOption: this.state.pauseOption,\n      key: this.state.score.key,\n      adgcTuning: this.state.adgcTuning,\n      bpm: this.state.currentBpm,\n      soundVolume: this.state.soundVolume\n    });\n  }\n  _restartTimer(){\n    if(this.state.timer.isPlaying){\n      this._stopTimer();\n      this._startTimer();\n    }\n  }\n  _startTimer(){\n    const originalBpm = barDurationToBpm(this.state.data.barDuration, this.state.data.beatsPerBar)\n    const pauseBarFactor =  getPauseFactor(this.state.pauseOption);\n    this.state.timer.configure({\n      fromBar: this.state.fromBar,\n      toBar: this.state.toBar,\n      barDuration: this.state.data.barDuration,\n      pauseBarFactor,\n      tempoFactor: bpmToFactor(originalBpm, this.state.currentBpm),\n      beatsPerBar: this.state.data.beatsPerBar\n    })\n    this.state.timer.start();\n  }\n  _stopTimer(){\n    this.state.timer.stop();\n  }\n  render(){\n    let content = this._getContent();\n    let video = null;\n    if(this.state.data && this.state.data.video && this.state.data.video.sources){\n      let videoStart = this.state.fromBar ? this.state.fromBar.start : 0;\n      let videoEnd = this.state.toBar ? this.state.toBar.end : 0;\n      video = (<VideoControl\n          playing={this.state.isPlaying}\n          sources={this.state.data.video.sources}\n          from={videoStart} to= {videoEnd}\n          videoElementId={VIDEO_ELEMENT_ID}\n          loop={!this.state.data.disableVideo}\n          />);\n    }\n    return (<div style={{\"height\": \"100%\"}} onClick={this._onContentClick}>\n      {content}\n      <CenterControl\n        isPlaying={this.state.isPlaying}\n        isLoading={!this.state.data || !this.state.canPlay}\n        onClick={this._onPlayPause}\n        visible={this.state.centerControlVisible}\n         />\n        }\n        }\n      <div onClick={(e) => {e.stopPropagation();}}>\n        <ButtonStrip\n           //prevent clicks to bubbleup\n          info={this.state.data ? this.state.data.info : null}\n          openButton={this.state.openButton}\n          onButtonClick={this._onButtonBarButtonClick}\n          score={this.state.score}\n          fromBar={this.state.fromBar}\n          toBar={this.state.toBar}\n          pauseOption = {this.state.pauseOption}\n          visibility = {this.state.visibility}\n          isPlaying = {this.state.isPlaying}\n          canPlay = {this.state.canPlay}\n          currentBpm={this.state.currentBpm}\n          currentKey={this.state.score ? this.state.score.getKey(): {}}\n          originalKey={this.state.data? this.state.data.originalKey: {}}\n          adgcTuning={this.state.adgcTuning}\n          soundVolume={this.state.soundVolume}\n          onSwitchTuning={this._onSwitchTuning}\n          onLoopChanged={this._onLoopChanged}\n          onPauseOptionChanged={this._onPauseOptionChanged}\n          onVisibilityChanged={this._onVisibilityChanged}\n          onPlayPause={this._onPlayPause}\n          onRestart={this._onRestart}\n          onBpmChanged={this._onBpmChanged}\n          onKeyChanged={this._onKeyChanged}\n          onVolumeChanged={this._onVolumeChanged}\n          contentUrl={this.props.contentUrl}\n          canRewind={this.state.timer ? this.state.timer.canRewind() : false}\n        />\n      </div>\n      </div>\n      );\n  }\n}\n\nContent.DisplayName = 'Content';\nContent.propTypes = {\n   contentUrl: PropTypes.string\n}\n\nexport default Content;\n","// Brunch automatically concatenates all files in your\n// watched paths. Those paths can be configured at\n// config.paths.watched in \"brunch-config.js\".\n//\n// However, those files will only be executed if\n// explicitly imported. The only exception are files\n// in vendor, which are never wrapped in imports and\n// therefore are always executed.\n\n// Import dependencies\n//\n// If you no longer want to use a dependency, remember\n// to also remove its path from \"config.paths.watched\".\nimport css from '../css/app.css';\nimport \"phoenix_html\"\nimport { createRoot } from 'react-dom/client'\nimport Content from './components/content.jsx'\nimport React from 'react'\n\nglobal.React = React;\nglobal.Vex = require('vexflow').default;\nglobal.Artist = require('./vextab/artist.js');\nglobal.VexTab = require('./vextab/vextab.js');\n\n// Import local files\n//\n// Local files can be imported directly using relative\n// paths \"./socket\" or full ones \"web/static/js/socket\".\n\n// import socket from \"./socket\"\n\nwindow.addEventListener('load', ()=>{\n  const studyConainer = document.getElementById('study-container');\n  if(studyConainer){\n    const contentUrl = studyConainer.getAttribute('data-content-url');\n    if(contentUrl){\n      const root = createRoot(studyConainer);\n      root.render(<Content contentUrl={contentUrl}/>);\n    }\n  }\n});","require('../../modules/es6.object.get-own-property-descriptor');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function getOwnPropertyDescriptor(it, key) {\n  return $Object.getOwnPropertyDescriptor(it, key);\n};\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","var midimessage = require('midimessage')\n\nmodule.exports = function (player) {\n  /**\n  * Connect a player to a midi input\n  *\n  * The options accepts:\n  *\n  * - channel: the channel to listen to. Listen to all channels by default.\n  *\n  * @param {MIDIInput} input\n  * @param {Object} options - (Optional)\n  * @return {SamplePlayer} the player\n  * @example\n  * var piano = player(...)\n  * window.navigator.requestMIDIAccess().then(function (midiAccess) {\n  *   midiAccess.inputs.forEach(function (midiInput) {\n  *     piano.listenToMidi(midiInput)\n  *   })\n  * })\n  */\n  player.listenToMidi = function (input, options) {\n    var started = {}\n    var opts = options || {}\n    var gain = opts.gain || function (vel) { return vel / 127 }\n\n    input.onmidimessage = function (msg) {\n      var mm = msg.messageType ? msg : midimessage(msg)\n      if (mm.messageType === 'noteon' && mm.velocity === 0) {\n        mm.messageType = 'noteoff'\n      }\n      if (opts.channel && mm.channel !== opts.channel) return\n\n      switch (mm.messageType) {\n        case 'noteon':\n          started[mm.key] = player.play(mm.key, 0, { gain: gain(mm.velocity) })\n          break\n        case 'noteoff':\n          if (started[mm.key]) {\n            started[mm.key].stop()\n            delete started[mm.key]\n          }\n          break\n      }\n    }\n    return player\n  }\n  return player\n}\n","require('../../modules/es6.string.iterator');\nrequire('../../modules/web.dom.iterable');\nmodule.exports = require('../../modules/_wks-ext').f('iterator');\n","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n","module.exports = { \"default\": require(\"core-js/library/fn/object/get-own-property-descriptor\"), __esModule: true };","exports.f = require('./_wks');\n","require('../../modules/es6.string.iterator');\nrequire('../../modules/es6.array.from');\nmodule.exports = require('../../modules/_core').Array.from;\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","'use strict'\n\nvar parser = require('note-parser')\n\n/**\n * Create a Soundfont object\n *\n * @param {AudioContext} context - the [audio context](https://developer.mozilla.org/en/docs/Web/API/AudioContext)\n * @param {Function} nameToUrl - (Optional) a function that maps the sound font name to the url\n * @return {Soundfont} a soundfont object\n */\nfunction Soundfont (ctx, nameToUrl) {\n  console.warn('new Soundfont() is deprected')\n  console.log('Please use Soundfont.instrument() instead of new Soundfont().instrument()')\n  if (!(this instanceof Soundfont)) return new Soundfont(ctx)\n\n  this.nameToUrl = nameToUrl || Soundfont.nameToUrl\n  this.ctx = ctx\n  this.instruments = {}\n  this.promises = []\n}\n\nSoundfont.prototype.onready = function (callback) {\n  console.warn('deprecated API')\n  console.log('Please use Promise.all(Soundfont.instrument(), Soundfont.instrument()).then() instead of new Soundfont().onready()')\n  Promise.all(this.promises).then(callback)\n}\n\nSoundfont.prototype.instrument = function (name, options) {\n  console.warn('new Soundfont().instrument() is deprecated.')\n  console.log('Please use Soundfont.instrument() instead.')\n  var ctx = this.ctx\n  name = name || 'default'\n  if (name in this.instruments) return this.instruments[name]\n  var inst = {name: name, play: oscillatorPlayer(ctx, options)}\n  this.instruments[name] = inst\n  if (name !== 'default') {\n    var promise = Soundfont.instrument(ctx, name, options).then(function (instrument) {\n      inst.play = instrument.play\n      return inst\n    })\n    this.promises.push(promise)\n    inst.onready = function (cb) {\n      console.warn('onready is deprecated. Use Soundfont.instrument().then()')\n      promise.then(cb)\n    }\n  } else {\n    inst.onready = function (cb) {\n      console.warn('onready is deprecated. Use Soundfont.instrument().then()')\n      cb()\n    }\n  }\n  return inst\n}\n\n/*\n * Load the buffers of a given instrument name. It returns a promise that resolves\n * to a hash with midi note numbers as keys, and audio buffers as values.\n *\n * @param {AudioContext} ac - the audio context\n * @param {String} name - the instrument name (it accepts an url if starts with \"http\")\n * @param {Object} options - (Optional) options object\n * @return {Promise} a promise that resolves to a Hash of { midiNoteNum: <AudioBuffer> }\n *\n * The options object accepts the following keys:\n *\n * - nameToUrl {Function}: a function to convert from instrument names to urls.\n * By default it uses Benjamin Gleitzman's package of\n * [pre-rendered sound fonts](https://github.com/gleitz/midi-js-soundfonts)\n * - notes {Array}: the list of note names to be decoded (all by default)\n *\n * @example\n * var Soundfont = require('soundfont-player')\n * Soundfont.loadBuffers(ctx, 'acoustic_grand_piano').then(function(buffers) {\n *  buffers[60] // => An <AudioBuffer> corresponding to note C4\n * })\n */\nfunction loadBuffers (ac, name, options) {\n  console.warn('Soundfont.loadBuffers is deprecate.')\n  console.log('Use Soundfont.instrument(..) and get buffers properties from the result.')\n  return Soundfont.instrument(ac, name, options).then(function (inst) {\n    return inst.buffers\n  })\n}\nSoundfont.loadBuffers = loadBuffers\n\n/**\n * Returns a function that plays an oscillator\n *\n * @param {AudioContext} ac - the audio context\n * @param {Hash} defaultOptions - (Optional) a hash of options:\n * - vcoType: the oscillator type (default: 'sine')\n * - gain: the output gain value (default: 0.4)\n  * - destination: the player destination (default: ac.destination)\n */\nfunction oscillatorPlayer (ctx, defaultOptions) {\n  defaultOptions = defaultOptions || {}\n  return function (note, time, duration, options) {\n    console.warn('The oscillator player is deprecated.')\n    console.log('Starting with version 0.9.0 you will have to wait until the soundfont is loaded to play sounds.')\n    var midi = note > 0 && note < 129 ? +note : parser.midi(note)\n    var freq = midi ? parser.midiToFreq(midi, 440) : null\n    if (!freq) return\n\n    duration = duration || 0.2\n\n    options = options || {}\n    var destination = options.destination || defaultOptions.destination || ctx.destination\n    var vcoType = options.vcoType || defaultOptions.vcoType || 'sine'\n    var gain = options.gain || defaultOptions.gain || 0.4\n\n    var vco = ctx.createOscillator()\n    vco.type = vcoType\n    vco.frequency.value = freq\n\n    /* VCA */\n    var vca = ctx.createGain()\n    vca.gain.value = gain\n\n    /* Connections */\n    vco.connect(vca)\n    vca.connect(destination)\n\n    vco.start(time)\n    if (duration > 0) vco.stop(time + duration)\n    return vco\n  }\n}\n\n/**\n * Given a note name, return the note midi number\n *\n * @name noteToMidi\n * @function\n * @param {String} noteName\n * @return {Integer} the note midi number or null if not a valid note name\n */\nSoundfont.noteToMidi = parser.midi\n\nmodule.exports = Soundfont\n","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (obj, key, value) {\n  if (key in obj) {\n    (0, _defineProperty2.default)(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n};","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n","module.exports = true;\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n","module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n    var O = toObject(arrayLike);\n    var C = typeof this == 'function' ? this : Array;\n    var aLen = arguments.length;\n    var mapfn = aLen > 1 ? arguments[1] : undefined;\n    var mapping = mapfn !== undefined;\n    var index = 0;\n    var iterFn = getIterFn(O);\n    var length, result, step, iterator;\n    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n  exports.createRoot = m.createRoot;\n  exports.hydrateRoot = m.hydrateRoot;\n} else {\n  var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  exports.createRoot = function(c, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.createRoot(c, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n  exports.hydrateRoot = function(c, h, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.hydrateRoot(c, h, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n}\n","/* global AudioBuffer */\n'use strict'\n\nvar ADSR = require('adsr')\n\nvar EMPTY = {}\nvar DEFAULTS = {\n  gain: 1,\n  attack: 0.01,\n  decay: 0.1,\n  sustain: 0.9,\n  release: 0.3,\n  loop: false,\n  cents: 0,\n  loopStart: 0,\n  loopEnd: 0\n}\n\n/**\n * Create a sample player.\n *\n * @param {AudioContext} ac - the audio context\n * @param {ArrayBuffer|Object<String,ArrayBuffer>} source\n * @param {Onject} options - (Optional) an options object\n * @return {player} the player\n * @example\n * var SamplePlayer = require('sample-player')\n * var ac = new AudioContext()\n * var snare = SamplePlayer(ac, <AudioBuffer>)\n * snare.play()\n */\nfunction SamplePlayer (ac, source, options) {\n  var connected = false\n  var nextId = 0\n  var tracked = {}\n  var out = ac.createGain()\n  out.gain.value = 1\n\n  var opts = Object.assign({}, DEFAULTS, options)\n\n  /**\n   * @namespace\n   */\n  var player = { context: ac, out: out, opts: opts }\n  if (source instanceof AudioBuffer) player.buffer = source\n  else player.buffers = source\n\n  /**\n   * Start a sample buffer.\n   *\n   * The returned object has a function `stop(when)` to stop the sound.\n   *\n   * @param {String} name - the name of the buffer. If the source of the\n   * SamplePlayer is one sample buffer, this parameter is not required\n   * @param {Float} when - (Optional) when to start (current time if by default)\n   * @param {Object} options - additional sample playing options\n   * @return {AudioNode} an audio node with a `stop` function\n   * @example\n   * var sample = player(ac, <AudioBuffer>).connect(ac.destination)\n   * sample.start()\n   * sample.start(5, { gain: 0.7 }) // name not required since is only one AudioBuffer\n   * @example\n   * var drums = player(ac, { snare: <AudioBuffer>, kick: <AudioBuffer>, ... }).connect(ac.destination)\n   * drums.start('snare')\n   * drums.start('snare', 0, { gain: 0.3 })\n   */\n  player.start = function (name, when, options) {\n    // if only one buffer, reorder arguments\n    if (player.buffer && name !== null) return player.start(null, name, when)\n\n    var buffer = name ? player.buffers[name] : player.buffer\n    if (!buffer) {\n      console.warn('Buffer ' + name + ' not found.')\n      return\n    } else if (!connected) {\n      console.warn('SamplePlayer not connected to any node.')\n      return\n    }\n\n    var opts = options || EMPTY\n    when = Math.max(ac.currentTime, when || 0)\n    player.emit('start', when, name, opts)\n    var node = createNode(name, buffer, opts)\n    node.id = track(name, node)\n    node.env.start(when)\n    node.source.start(when)\n    player.emit('started', when, node.id, node)\n    if (opts.duration) node.stop(when + opts.duration)\n    return node\n  }\n\n  // NOTE: start will be override so we can't copy the function reference\n  // this is obviously not a good design, so this code will be gone soon.\n  /**\n   * An alias for `player.start`\n   * @see player.start\n   * @since 0.3.0\n   */\n  player.play = function (name, when, options) {\n    return player.start(name, when, options)\n  }\n\n  /**\n   * Stop some or all samples\n   *\n   * @param {Float} when - (Optional) an absolute time in seconds (or currentTime\n   * if not specified)\n   * @param {Array} nodes - (Optional) an array of nodes or nodes ids to stop\n   * @return {Array} an array of ids of the stoped samples\n   *\n   * @example\n   * var longSound = player(ac, <AudioBuffer>).connect(ac.destination)\n   * longSound.start(ac.currentTime)\n   * longSound.start(ac.currentTime + 1)\n   * longSound.start(ac.currentTime + 2)\n   * longSound.stop(ac.currentTime + 3) // stop the three sounds\n   */\n  player.stop = function (when, ids) {\n    var node\n    ids = ids || Object.keys(tracked)\n    return ids.map(function (id) {\n      node = tracked[id]\n      if (!node) return null\n      node.stop(when)\n      return node.id\n    })\n  }\n  /**\n   * Connect the player to a destination node\n   *\n   * @param {AudioNode} destination - the destination node\n   * @return {AudioPlayer} the player\n   * @chainable\n   * @example\n   * var sample = player(ac, <AudioBuffer>).connect(ac.destination)\n   */\n  player.connect = function (dest) {\n    connected = true\n    out.connect(dest)\n    return player\n  }\n\n  player.emit = function (event, when, obj, opts) {\n    if (player.onevent) player.onevent(event, when, obj, opts)\n    var fn = player['on' + event]\n    if (fn) fn(when, obj, opts)\n  }\n\n  return player\n\n  // =============== PRIVATE FUNCTIONS ============== //\n\n  function track (name, node) {\n    node.id = nextId++\n    tracked[node.id] = node\n    node.source.onended = function () {\n      var now = ac.currentTime\n      node.source.disconnect()\n      node.env.disconnect()\n      node.disconnect()\n      player.emit('ended', now, node.id, node)\n    }\n    return node.id\n  }\n\n  function createNode (name, buffer, options) {\n    var node = ac.createGain()\n    node.gain.value = 0 // the envelope will control the gain\n    node.connect(out)\n\n    node.env = envelope(ac, options, opts)\n    node.env.connect(node.gain)\n\n    node.source = ac.createBufferSource()\n    node.source.buffer = buffer\n    node.source.connect(node)\n    node.source.loop = options.loop || opts.loop\n    node.source.playbackRate.value = centsToRate(options.cents || opts.cents)\n    node.source.loopStart = options.loopStart || opts.loopStart\n    node.source.loopEnd = options.loopEnd || opts.loopEnd\n    node.stop = function (when) {\n      var time = when || ac.currentTime\n      player.emit('stop', time, name)\n      var stopAt = node.env.stop(time)\n      node.source.stop(stopAt)\n    }\n    return node\n  }\n}\n\nfunction isNum (x) { return typeof x === 'number' }\nvar PARAMS = ['attack', 'decay', 'sustain', 'release']\nfunction envelope (ac, options, opts) {\n  var env = ADSR(ac)\n  var adsr = options.adsr || opts.adsr\n  PARAMS.forEach(function (name, i) {\n    if (adsr) env[name] = adsr[i]\n    else env[name] = options[name] || opts[name]\n  })\n  env.value.value = isNum(options.gain) ? options.gain\n    : isNum(opts.gain) ? opts.gain : 1\n  return env\n}\n\n/*\n * Get playback rate for a given pitch change (in cents)\n * Basic [math](http://www.birdsoft.demon.co.uk/music/samplert.htm):\n * f2 = f1 * 2^( C / 1200 )\n */\nfunction centsToRate (cents) { return cents ? Math.pow(2, cents / 1200) : 1 }\n\nmodule.exports = SamplePlayer\n","'use strict'\n\nvar player = require('./player')\nvar events = require('./events')\nvar notes = require('./notes')\nvar scheduler = require('./scheduler')\nvar midi = require('./midi')\n\nfunction SamplePlayer (ac, source, options) {\n  return midi(scheduler(notes(events(player(ac, source, options)))))\n}\n\nif (typeof module === 'object' && module.exports) module.exports = SamplePlayer\nif (typeof window !== 'undefined') window.SamplePlayer = SamplePlayer\n","const PRINT_TRESHOLD = 100;\n\nfunction calculateHandPosition(fingersDown){\n  //if one of the fingers has a handposition attached:\n  const fingerWithHandPosition = fingersDown.filter(f => f.handPosition);\n\n  //unchanged, return null:\n  if(fingerWithHandPosition.length > 0){\n    if(fingerWithHandPosition[0].handPosition == \"unchanged\"){\n      return null;\n    }\n    let [firstFret, lastFret] = fingerWithHandPosition[0].handPosition.split(\"-\");\n    return {firstFret, lastFret};\n  }\n\n  //find first finger with non-zero fret (ignore open strings)\n  const frettedFingers = fingersDown.filter(f => f.fret > 0);\n\n  const thumbFinger = fingersDown.filter(f => f.nr === 5);\n  if(thumbFinger.length > 0){\n    //thumb is a special case,\n    //the thumb position is the lowest, with a range of at least 7?\n    return {firstFret: thumbFinger[0].fret, lastFret: thumbFinger[0].fret + 7};\n  }else{\n    if(frettedFingers.length > 0){\n      frettedFingers.sort((f1, f2)=>{\n        if(f1.fret < f2.fret){return -1}\n        if(f1.fret > f2.fret){return 1;}\n        return 0;\n      });\n      const firstFret = (frettedFingers[0].fret - frettedFingers[0].nr) + 1;\n      return {firstFret: firstFret, lastFret: firstFret + 3};\n    }else{\n      return null;\n    }\n  }\n}\n\nfunction executeCommand(fingersDown, command){\n  if(command.action === 'print-down'){\n    fingersDown.push({nr: command.nr, string:command.string, fret: command.fret, type:'print'})\n  }else if(command.action === 'print-up'){\n    //remove finger\n    fingersDown = fingersDown.filter((finger)=>{\n      return !(finger.nr === command.nr\n        && finger.string === command.string\n        && finger.fret === command.fret\n        && finger.type === 'print');\n    });\n  }\n  else if(command.action === 'down'){\n    //add finger\n    fingersDown.push({\n      nr: command.nr,\n      string:command.string,\n      fret: command.fret,\n      type: 'default',\n      handPosition: command.handPosition\n    })\n  }\n  else if(command.action === 'up'){\n    //remove finger\n    fingersDown = fingersDown.filter((finger)=>{\n      return !(finger.nr === command.nr\n        && finger.string === command.string\n        && finger.fret === command.fret\n        && finger.type === 'default');\n    });\n  }\n  return fingersDown;\n}\n\nfunction fingerToCommands(f){\n  let commands = [\n    {action:'down', at: f.at, nr: f.nr, string:f.string, fret:f.fret, handPosition: f.handPosition},\n    {action:'up', at: f.to, nr: f.nr, string:f.string, fret:f.fret, handPosition: f.handPosition},\n  ];\n  if(f.to - f.at < PRINT_TRESHOLD){\n    commands.push({action:'print-down', at: f.to, nr: f.nr, string:f.string, fret:f.fret});\n    commands.push({action:'print-up', at: f.to + 500, nr: f.nr, string:f.string, fret:f.fret});\n  }\n  return commands;\n}\nfunction movementToCommands(movement){\n  return movement.rightHand\n    .sort((a, b)=>a.at - b.at)\n    .reduce((acc, f)=>{\n      Array.prototype.push.apply(acc,fingerToCommands(f));\n      return acc;\n    }, []).sort((a, b)=> a.at - b.at);\n}\n\nmodule.exports = {\n  init: (score)=>{\n    //split movement into commands\n    const commands = movementToCommands(score.getFretboardMovement());\n    const nextCommandIndex = 0;\n    return {\n      fingersDown: [],\n      handPosition: null,\n      _: { commands, nextCommandIndex, justInited: true },\n    };\n  },\n  getAt: (state, at)=>{\n    //execute all necessary commands\n    const commandsToExecute = [];\n    const commands = state._.commands;\n    let nextCommandIndex = state._.nextCommandIndex;\n\n    while(nextCommandIndex >= 0 && commands[nextCommandIndex].at <= at){\n      commandsToExecute.push(commands[nextCommandIndex]);\n      if(nextCommandIndex < commands.length - 1){\n        nextCommandIndex ++;\n      }else{\n        nextCommandIndex = -1;\n      }\n    }\n\n    let fingersDown= commandsToExecute.reduce(executeCommand, state.fingersDown);\n    const hasChanged = commandsToExecute.length > 0;\n    let handPosition = state.handPosition;\n\n    if(hasChanged){\n      handPosition = calculateHandPosition(fingersDown) || state.handPosition;\n    }\n    return {\n      fingersDown,\n      handPosition: handPosition,\n      changed: hasChanged || state._.justInited,\n      _: {commands, nextCommandIndex, justInited: false},\n    };\n  }\n}","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _assign = require(\"../core-js/object/assign\");\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _assign2.default || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","module.exports = { \"default\": require(\"core-js/library/fn/symbol\"), __esModule: true };","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (obj, keys) {\n  var target = {};\n\n  for (var i in obj) {\n    if (keys.indexOf(i) >= 0) continue;\n    if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n    target[i] = obj[i];\n  }\n\n  return target;\n};","module.exports = { \"default\": require(\"core-js/library/fn/object/set-prototype-of\"), __esModule: true };","module.exports = { \"default\": require(\"core-js/library/fn/object/get-prototype-of\"), __esModule: true };","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict'\n\nvar REGEX = /^([a-gA-G])(#{1,}|b{1,}|x{1,}|)(-?\\d*)\\s*(.*)\\s*$/\n/**\n * A regex for matching note strings in scientific notation.\n *\n * @name regex\n * @function\n * @return {RegExp} the regexp used to parse the note name\n *\n * The note string should have the form `letter[accidentals][octave][element]`\n * where:\n *\n * - letter: (Required) is a letter from A to G either upper or lower case\n * - accidentals: (Optional) can be one or more `b` (flats), `#` (sharps) or `x` (double sharps).\n * They can NOT be mixed.\n * - octave: (Optional) a positive or negative integer\n * - element: (Optional) additionally anything after the duration is considered to\n * be the element name (for example: 'C2 dorian')\n *\n * The executed regex contains (by array index):\n *\n * - 0: the complete string\n * - 1: the note letter\n * - 2: the optional accidentals\n * - 3: the optional octave\n * - 4: the rest of the string (trimmed)\n *\n * @example\n * var parser = require('note-parser')\n * parser.regex.exec('c#4')\n * // => ['c#4', 'c', '#', '4', '']\n * parser.regex.exec('c#4 major')\n * // => ['c#4major', 'c', '#', '4', 'major']\n * parser.regex().exec('CMaj7')\n * // => ['CMaj7', 'C', '', '', 'Maj7']\n */\nfunction regex () { return REGEX }\n\nvar SEMITONES = [0, 2, 4, 5, 7, 9, 11]\n/**\n * Parse a note name in scientific notation an return it's components,\n * and some numeric properties including midi number and frequency.\n *\n * @name parse\n * @function\n * @param {String} note - the note string to be parsed\n * @param {Boolean} isTonic - true if the note is the tonic of something.\n * If true, en extra tonicOf property is returned. It's false by default.\n * @param {Float} tunning - The frequency of A4 note to calculate frequencies.\n * By default it 440.\n * @return {Object} the parsed note name or null if not a valid note\n *\n * The parsed note name object will ALWAYS contains:\n * - letter: the uppercase letter of the note\n * - acc: the accidentals of the note (only sharps or flats)\n * - pc: the pitch class (letter + acc)\n * - step: s a numeric representation of the letter. It's an integer from 0 to 6\n * where 0 = C, 1 = D ... 6 = B\n * - alt: a numeric representation of the accidentals. 0 means no alteration,\n * positive numbers are for sharps and negative for flats\n * - chroma: a numeric representation of the pitch class. It's like midi for\n * pitch classes. 0 = C, 1 = C#, 2 = D ... It can have negative values: -1 = Cb.\n * Can detect pitch class enhramonics.\n *\n * If the note has octave, the parser object will contain:\n * - oct: the octave number (as integer)\n * - midi: the midi number\n * - freq: the frequency (using tuning parameter as base)\n *\n * If the parameter `isTonic` is set to true, the parsed object will contain:\n * - tonicOf: the rest of the string that follows note name (left and right trimmed)\n *\n * @example\n * var parse = require('note-parser').parse\n * parse('Cb4')\n * // => { letter: 'C', acc: 'b', pc: 'Cb', step: 0, alt: -1, chroma: -1,\n *         oct: 4, midi: 59, freq: 246.94165062806206 }\n * // if no octave, no midi, no freq\n * parse('fx')\n * // => { letter: 'F', acc: '##', pc: 'F##', step: 3, alt: 2, chroma: 7 })\n */\nfunction parse (str, isTonic, tuning) {\n  if (typeof str !== 'string') return null\n  var m = REGEX.exec(str)\n  if (!m || !isTonic && m[4]) return null\n\n  var p = { letter: m[1].toUpperCase(), acc: m[2].replace(/x/g, '##') }\n  p.pc = p.letter + p.acc\n  p.step = (p.letter.charCodeAt(0) + 3) % 7\n  p.alt = p.acc[0] === 'b' ? -p.acc.length : p.acc.length\n  p.chroma = SEMITONES[p.step] + p.alt\n  if (m[3]) {\n    p.oct = +m[3]\n    p.midi = p.chroma + 12 * (p.oct + 1)\n    p.freq = midiToFreq(p.midi, tuning)\n  }\n  if (isTonic) p.tonicOf = m[4]\n  return p\n}\n\n/**\n * Given a midi number, return its frequency\n * @param {Integer} midi - midi note number\n * @param {Float} tuning - (Optional) the A4 tuning (440Hz by default)\n * @return {Float} frequency in hertzs\n */\nfunction midiToFreq (midi, tuning) {\n  return Math.pow(2, (midi - 69) / 12) * (tuning || 440)\n}\n\nvar parser = { parse: parse, regex: regex, midiToFreq: midiToFreq }\nvar FNS = ['letter', 'acc', 'pc', 'step', 'alt', 'chroma', 'oct', 'midi', 'freq']\nFNS.forEach(function (name) {\n  parser[name] = function (src) {\n    var p = parse(src)\n    return p && (typeof p[name] !== 'undefined') ? p[name] : null\n  }\n})\n\nmodule.exports = parser\n\n// extra API docs\n/**\n * Get midi of a note\n *\n * @name midi\n * @function\n * @param {String} note - the note name\n * @return {Integer} the midi number of the note or null if not a valid note\n * or the note does NOT contains octave\n * @example\n * var parser = require('note-parser')\n * parser.midi('A4') // => 69\n * parser.midi('A') // => null\n */\n/**\n * Get freq of a note in hertzs (in a well tempered 440Hz A4)\n *\n * @name freq\n * @function\n * @param {String} note - the note name\n * @return {Float} the freq of the number if hertzs or null if not valid note\n * or the note does NOT contains octave\n * @example\n * var parser = require('note-parser')\n * parser.freq('A4') // => 440\n * parser.freq('A') // => null\n */\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: require('./_library') ? 'pure' : 'global',\n  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n","module.exports = { \"default\": require(\"core-js/library/fn/symbol/iterator\"), __esModule: true };","'use strict'\n\n// DECODE UTILITIES\nfunction b64ToUint6 (nChr) {\n  return nChr > 64 && nChr < 91 ? nChr - 65\n    : nChr > 96 && nChr < 123 ? nChr - 71\n    : nChr > 47 && nChr < 58 ? nChr + 4\n    : nChr === 43 ? 62\n    : nChr === 47 ? 63\n    : 0\n}\n\n// Decode Base64 to Uint8Array\n// ---------------------------\nfunction decode (sBase64, nBlocksSize) {\n  var sB64Enc = sBase64.replace(/[^A-Za-z0-9\\+\\/]/g, '')\n  var nInLen = sB64Enc.length\n  var nOutLen = nBlocksSize\n    ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize\n    : nInLen * 3 + 1 >> 2\n  var taBytes = new Uint8Array(nOutLen)\n\n  for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {\n    nMod4 = nInIdx & 3\n    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4\n    if (nMod4 === 3 || nInLen - nInIdx === 1) {\n      for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {\n        taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255\n      }\n      nUint24 = 0\n    }\n  }\n  return taBytes\n}\n\nmodule.exports = { decode: decode }\n","var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n","require('../../modules/es6.symbol');\nrequire('../../modules/es6.object.to-string');\nrequire('../../modules/es7.symbol.async-iterator');\nrequire('../../modules/es7.symbol.observable');\nmodule.exports = require('../../modules/_core').Symbol;\n","exports.f = {}.propertyIsEnumerable;\n","/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS205: Consider reworking code to avoid use of IIFEs\n * DS206: Consider reworking classes to avoid initClass\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n// Vex.Flow.VexTab\n// Copyright 2012 Mohit Cheppudira <mohit@muthanna.com>\n//\n// This class implements the semantic analysis of the Jison\n// output, and generates elements that can be used by\n// Vex.Flow.Artist to render the notation.\n// parsed by Vex.Flow.VexTab.\n\nconst Vex = require('vexflow').default;\nconst _ = require('lodash');\nconst parser = require('./vextab-jison.js');\n\nvar VexTab = (function() {\n  let L = undefined;\n  let newError = undefined;\n  VexTab = class VexTab {\n    static initClass() {\n      this.DEBUG = false;\n      L = function(...args) { if (VexTab.DEBUG) { return (typeof console !== 'undefined' && console !== null ? console.log(\"(Vex.Flow.VexTab)\", ...Array.from(args)) : undefined); } };\n\n      // Private methods\n      newError = (object, msg) => new Vex.RERR(\"ParseError\",\n                   `${msg} in line ${object._l} column ${object._c}`);\n    }\n\n    // Public methods\n    constructor(artist) {\n      this.artist = artist;\n      this.reset();\n    }\n\n    reset() {\n      this.valid = false;\n      return this.elements = false;\n    }\n\n    isValid() { return this.valid; }\n\n    getArtist() { return this.artist; }\n\n    parseStaveOptions(options) {\n      const params = {};\n      if (options == null) { return params; }\n\n      let notation_option = null;\n      for (var option of Array.from(options)) {\n        var e;\n        const error = msg => newError(option, msg);\n        params[option.key] = option.value;\n        switch (option.key) {\n          case \"notation\": case \"tablature\":\n            notation_option = option;\n            if (![\"true\", \"false\"].includes(option.value)) { throw error(`'${option.key}' must be 'true' or 'false'`); }\n            break;\n          case \"key\":\n            if (!_.has(Vex.Flow.keySignature.keySpecs, option.value)) { throw error(`Invalid key signature '${option.value}'`); }\n            break;\n          case \"clef\":\n            var clefs = [\"treble\", \"bass\", \"tenor\", \"alto\", \"percussion\", \"none\"];\n            if (!Array.from(clefs).includes(option.value)) { throw error(`'clef' must be one of ${clefs.join(', ')}`); }\n            break;\n          case \"voice\":\n            var voices = [\"top\", \"bottom\", \"new\"];\n            if (!Array.from(voices).includes(option.value)) { throw error(`'voice' must be one of ${voices.join(', ')}`); }\n            break;\n          case \"time\":\n            try {\n              new Vex.Flow.TimeSignature(option.value);\n            } catch (error1) {\n              e = error1;\n              throw error(`Invalid time signature: '${option.value}'`);\n            }\n            break;\n          case \"tuning\":\n            try {\n              new Vex.Flow.Tuning(option.value);\n            } catch (error2) {\n              e = error2;\n              throw error(`Invalid tuning: '${option.value}'`);\n            }\n            break;\n          case \"strings\":\n            var num_strings = parseInt(option.value);\n            if ((num_strings < 4) || (num_strings > 8)) { throw error(`Invalid number of strings: ${num_strings}`); }\n            break;\n          default:\n            throw error(`Invalid option '${option.key}'`);\n        }\n      }\n\n      if ((params.notation === \"false\") && (params.tablature === \"false\")) {\n        throw newError(notation_option, \"Both 'notation' and 'tablature' can't be invisible\");\n      }\n\n      return params;\n    }\n\n    parseCommand(element) {\n      if (element.command === \"bar\") {\n        this.artist.addBar(element.type);\n      }\n\n      if (element.command === \"tuplet\") {\n        this.artist.makeTuplets(element.params.tuplet, element.params.notes);\n      }\n\n      if (element.command === \"annotations\") {\n        this.artist.addAnnotations(element.params);\n      }\n\n      if (element.command === \"rest\") {\n        this.artist.addRest(element.params);\n      }\n\n      if (element.command === \"command\") {\n        return this.artist.runCommand(element.params, element._l, element._c);\n      }\n    }\n\n    parseChord(element) {\n      L(\"parseChord:\", element);\n      return this.artist.addChord(\n        _.map(element.chord,\n              note => _.pick(note, 'time', 'dot', 'fret', 'abc', 'octave', 'string', 'articulation', 'decorator')),\n        element.articulation, element.decorator);\n    }\n\n    parseFret(note) {\n      return this.artist.addNote(_.pick(\n        note, 'time', 'dot', 'fret', 'string', 'articulation', 'decorator'));\n    }\n\n    parseABC(note) {\n      return this.artist.addNote(_.pick(\n        note, 'time', 'dot', 'fret', 'abc', 'octave', 'string', 'articulation', 'decorator'));\n    }\n\n    parseStaveElements(notes) {\n      L(\"parseStaveElements:\", notes);\n      return (() => {\n        const result = [];\n        for (let element of Array.from(notes)) {\n          if (element.time) {\n            this.artist.setDuration(element.time, element.dot);\n          }\n\n          if (element.command) {\n            this.parseCommand(element);\n          }\n\n          if (element.chord) {\n            this.parseChord(element);\n          }\n\n          if (element.abc) {\n            result.push(this.parseABC(element));\n          } else if (element.fret) {\n            result.push(this.parseFret(element));\n          } else {\n            result.push(undefined);\n          }\n        }\n        return result;\n      })();\n    }\n\n    parseStaveText(text_line) {\n      if (!_.isEmpty(text_line)) { this.artist.addTextVoice(); }\n\n      let position = 0;\n      let justification = \"center\";\n      let smooth = true;\n      let font = null;\n\n      const bartext = () => this.artist.addTextNote(\"\", 0, justification, false, true);\n      const createNote = text => {\n        let ignore_ticks = false;\n        if (text[0] === \"|\") {\n          ignore_ticks = true;\n          text = text.slice(1);\n        }\n\n        try {\n          return this.artist.addTextNote(text, position, justification, smooth, ignore_ticks);\n        } catch (e) {\n          throw newError(str, \"Bad text or duration. Did you forget a comma?\" + e);\n        }\n      };\n\n      return (() => {\n        const result = [];\n        for (let str of Array.from(text_line)) {\n          const text = str.text.trim();\n          if (text.match(/\\.font=.*/)) {\n            font = text.slice(6);\n            result.push(this.artist.setTextFont(font));\n          } else if (text[0] === \":\") {\n            result.push(this.artist.setDuration(text));\n          } else if (text[0] === \".\") {\n            const command = text.slice(1);\n            switch (command) {\n              case \"center\": case \"left\": case \"right\":\n                result.push(justification = command);\n                break;\n              case \"strict\":\n                result.push(smooth = false);\n                break;\n              case \"smooth\":\n                result.push(smooth = true);\n                break;\n              case \"bar\": case \"|\":\n                result.push(bartext());\n                break;\n              default:\n                result.push(position = parseInt(text.slice(1), 10));\n            }\n          } else if (text === \"|\") {\n            result.push(bartext());\n          } else if (text.slice(0, 2) === \"++\") {\n            result.push(this.artist.addTextVoice());\n          } else {\n            result.push(createNote(text));\n          }\n        }\n        return result;\n      })();\n    }\n\n    generate() {\n      return (() => {\n        const result = [];\n        for (let stave of Array.from(this.elements)) {\n          switch (stave.element) {\n            case \"stave\": case \"tabstave\":\n              this.artist.addStave(stave.element, this.parseStaveOptions(stave.options));\n              if (stave.notes != null) { this.parseStaveElements(stave.notes); }\n              if (stave.text != null) { result.push(this.parseStaveText(stave.text)); } else {\n                result.push(undefined);\n              }\n              break;\n            case \"voice\":\n              this.artist.addVoice(this.parseStaveOptions(stave.options));\n              if (stave.notes != null) { this.parseStaveElements(stave.notes); }\n              if (stave.text != null) { result.push(this.parseStaveText(stave.text)); } else {\n                result.push(undefined);\n              }\n              break;\n            case \"options\":\n              var options = {};\n              for (let option of Array.from(stave.params)) {\n                options[option.key] = option.value;\n              }\n              try {\n                result.push(this.artist.setOptions(options));\n              } catch (e) {\n                throw newError(stave, e.message);\n              }\n              break;\n            default:\n              throw newError(stave, `Invalid keyword '${stave.element}'`);\n          }\n        }\n        return result;\n      })();\n    }\n\n    parse(code) {\n      parser.parseError = function(message, hash) {\n        L(\"VexTab parse error: \", message, hash);\n        message = `Unexpected text '${hash.text}' at line ${hash.loc.first_line} column ${hash.loc.first_column}.`;\n        throw new Vex.RERR(\"ParseError\", message);\n      };\n\n      if (code == null) { throw new Vex.RERR(\"ParseError\", \"No code\"); }\n\n      L(`Parsing:\\n${code}`);\n\n      // Strip lines\n      const stripped_code = (Array.from(code.split(/\\r\\n|\\r|\\n/)).map((line) => line.trim()));\n      this.elements = parser.parse(stripped_code.join(\"\\n\"));\n      if (this.elements) {\n        this.generate();\n        this.valid = true;\n      }\n\n      return this.elements;\n    }\n  };\n  VexTab.initClass();\n  return VexTab;\n})();\n\nmodule.exports = VexTab;\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n","\"use strict\";\n\n(function() {\n  var PolyfillEvent = eventConstructor();\n\n  function eventConstructor() {\n    if (typeof window.CustomEvent === \"function\") return window.CustomEvent;\n    // IE<=9 Support\n    function CustomEvent(event, params) {\n      params = params || {bubbles: false, cancelable: false, detail: undefined};\n      var evt = document.createEvent('CustomEvent');\n      evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n      return evt;\n    }\n    CustomEvent.prototype = window.Event.prototype;\n    return CustomEvent;\n  }\n\n  function buildHiddenInput(name, value) {\n    var input = document.createElement(\"input\");\n    input.type = \"hidden\";\n    input.name = name;\n    input.value = value;\n    return input;\n  }\n\n  function handleClick(element, targetModifierKey) {\n    var to = element.getAttribute(\"data-to\"),\n        method = buildHiddenInput(\"_method\", element.getAttribute(\"data-method\")),\n        csrf = buildHiddenInput(\"_csrf_token\", element.getAttribute(\"data-csrf\")),\n        form = document.createElement(\"form\"),\n        target = element.getAttribute(\"target\");\n\n    form.method = (element.getAttribute(\"data-method\") === \"get\") ? \"get\" : \"post\";\n    form.action = to;\n    form.style.display = \"hidden\";\n\n    if (target) form.target = target;\n    else if (targetModifierKey) form.target = \"_blank\";\n\n    form.appendChild(csrf);\n    form.appendChild(method);\n    document.body.appendChild(form);\n    form.submit();\n  }\n\n  window.addEventListener(\"click\", function(e) {\n    var element = e.target;\n    if (e.defaultPrevented) return;\n\n    while (element && element.getAttribute) {\n      var phoenixLinkEvent = new PolyfillEvent('phoenix.link.click', {\n        \"bubbles\": true, \"cancelable\": true\n      });\n\n      if (!element.dispatchEvent(phoenixLinkEvent)) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        return false;\n      }\n\n      if (element.getAttribute(\"data-method\")) {\n        handleClick(element, e.metaKey || e.shiftKey);\n        e.preventDefault();\n        return false;\n      } else {\n        element = element.parentNode;\n      }\n    }\n  }, false);\n\n  window.addEventListener('phoenix.link.click', function (e) {\n    var message = e.target.getAttribute(\"data-confirm\");\n    if(message && !window.confirm(message)) {\n      e.preventDefault();\n    }\n  }, false);\n})();\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// Browser Request\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// UMD HEADER START \n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define([], factory);\n    } else if (typeof exports === 'object') {\n        // Node. Does not work with strict CommonJS, but\n        // only CommonJS-like enviroments that support module.exports,\n        // like Node.\n        module.exports = factory();\n    } else {\n        // Browser globals (root is window)\n        root.returnExports = factory();\n  }\n}(this, function () {\n// UMD HEADER END\n\nvar XHR = XMLHttpRequest\nif (!XHR) throw new Error('missing XMLHttpRequest')\nrequest.log = {\n  'trace': noop, 'debug': noop, 'info': noop, 'warn': noop, 'error': noop\n}\n\nvar DEFAULT_TIMEOUT = 3 * 60 * 1000 // 3 minutes\n\n//\n// request\n//\n\nfunction request(options, callback) {\n  // The entry-point to the API: prep the options object and pass the real work to run_xhr.\n  if(typeof callback !== 'function')\n    throw new Error('Bad callback given: ' + callback)\n\n  if(!options)\n    throw new Error('No options given')\n\n  var options_onResponse = options.onResponse; // Save this for later.\n\n  if(typeof options === 'string')\n    options = {'uri':options};\n  else\n    options = JSON.parse(JSON.stringify(options)); // Use a duplicate for mutating.\n\n  options.onResponse = options_onResponse // And put it back.\n\n  if (options.verbose) request.log = getLogger();\n\n  if(options.url) {\n    options.uri = options.url;\n    delete options.url;\n  }\n\n  if(!options.uri && options.uri !== \"\")\n    throw new Error(\"options.uri is a required argument\");\n\n  if(typeof options.uri != \"string\")\n    throw new Error(\"options.uri must be a string\");\n\n  var unsupported_options = ['proxy', '_redirectsFollowed', 'maxRedirects', 'followRedirect']\n  for (var i = 0; i < unsupported_options.length; i++)\n    if(options[ unsupported_options[i] ])\n      throw new Error(\"options.\" + unsupported_options[i] + \" is not supported\")\n\n  options.callback = callback\n  options.method = options.method || 'GET';\n  options.headers = options.headers || {};\n  options.body    = options.body || null\n  options.timeout = options.timeout || request.DEFAULT_TIMEOUT\n\n  if(options.headers.host)\n    throw new Error(\"Options.headers.host is not supported\");\n\n  if(options.json) {\n    options.headers.accept = options.headers.accept || 'application/json'\n    if(options.method !== 'GET')\n      options.headers['content-type'] = 'application/json'\n\n    if(typeof options.json !== 'boolean')\n      options.body = JSON.stringify(options.json)\n    else if(typeof options.body !== 'string')\n      options.body = JSON.stringify(options.body)\n  }\n  \n  //BEGIN QS Hack\n  var serialize = function(obj) {\n    var str = [];\n    for(var p in obj)\n      if (obj.hasOwnProperty(p)) {\n        str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(obj[p]));\n      }\n    return str.join(\"&\");\n  }\n  \n  if(options.qs){\n    var qs = (typeof options.qs == 'string')? options.qs : serialize(options.qs);\n    if(options.uri.indexOf('?') !== -1){ //no get params\n        options.uri = options.uri+'&'+qs;\n    }else{ //existing get params\n        options.uri = options.uri+'?'+qs;\n    }\n  }\n  //END QS Hack\n  \n  //BEGIN FORM Hack\n  var multipart = function(obj) {\n    //todo: support file type (useful?)\n    var result = {};\n    result.boundry = '-------------------------------'+Math.floor(Math.random()*1000000000);\n    var lines = [];\n    for(var p in obj){\n        if (obj.hasOwnProperty(p)) {\n            lines.push(\n                '--'+result.boundry+\"\\n\"+\n                'Content-Disposition: form-data; name=\"'+p+'\"'+\"\\n\"+\n                \"\\n\"+\n                obj[p]+\"\\n\"\n            );\n        }\n    }\n    lines.push( '--'+result.boundry+'--' );\n    result.body = lines.join('');\n    result.length = result.body.length;\n    result.type = 'multipart/form-data; boundary='+result.boundry;\n    return result;\n  }\n  \n  if(options.form){\n    if(typeof options.form == 'string') throw('form name unsupported');\n    if(options.method === 'POST'){\n        var encoding = (options.encoding || 'application/x-www-form-urlencoded').toLowerCase();\n        options.headers['content-type'] = encoding;\n        switch(encoding){\n            case 'application/x-www-form-urlencoded':\n                options.body = serialize(options.form).replace(/%20/g, \"+\");\n                break;\n            case 'multipart/form-data':\n                var multi = multipart(options.form);\n                //options.headers['content-length'] = multi.length;\n                options.body = multi.body;\n                options.headers['content-type'] = multi.type;\n                break;\n            default : throw new Error('unsupported encoding:'+encoding);\n        }\n    }\n  }\n  //END FORM Hack\n\n  // If onResponse is boolean true, call back immediately when the response is known,\n  // not when the full request is complete.\n  options.onResponse = options.onResponse || noop\n  if(options.onResponse === true) {\n    options.onResponse = callback\n    options.callback = noop\n  }\n\n  // XXX Browsers do not like this.\n  //if(options.body)\n  //  options.headers['content-length'] = options.body.length;\n\n  // HTTP basic authentication\n  if(!options.headers.authorization && options.auth)\n    options.headers.authorization = 'Basic ' + b64_enc(options.auth.username + ':' + options.auth.password);\n\n  return run_xhr(options)\n}\n\nvar req_seq = 0\nfunction run_xhr(options) {\n  var xhr = new XHR\n    , timed_out = false\n    , is_cors = is_crossDomain(options.uri)\n    , supports_cors = ('withCredentials' in xhr)\n\n  req_seq += 1\n  xhr.seq_id = req_seq\n  xhr.id = req_seq + ': ' + options.method + ' ' + options.uri\n  xhr._id = xhr.id // I know I will type \"_id\" from habit all the time.\n\n  if(is_cors && !supports_cors) {\n    var cors_err = new Error('Browser does not support cross-origin request: ' + options.uri)\n    cors_err.cors = 'unsupported'\n    return options.callback(cors_err, xhr)\n  }\n\n  xhr.timeoutTimer = setTimeout(too_late, options.timeout)\n  function too_late() {\n    timed_out = true\n    var er = new Error('ETIMEDOUT')\n    er.code = 'ETIMEDOUT'\n    er.duration = options.timeout\n\n    request.log.error('Timeout', { 'id':xhr._id, 'milliseconds':options.timeout })\n    return options.callback(er, xhr)\n  }\n\n  // Some states can be skipped over, so remember what is still incomplete.\n  var did = {'response':false, 'loading':false, 'end':false}\n\n  xhr.onreadystatechange = on_state_change\n  xhr.open(options.method, options.uri, true) // asynchronous\n  if(is_cors)\n    xhr.withCredentials = !! options.withCredentials\n  xhr.send(options.body)\n  return xhr\n\n  function on_state_change(event) {\n    if(timed_out)\n      return request.log.debug('Ignoring timed out state change', {'state':xhr.readyState, 'id':xhr.id})\n\n    request.log.debug('State change', {'state':xhr.readyState, 'id':xhr.id, 'timed_out':timed_out})\n\n    if(xhr.readyState === XHR.OPENED) {\n      request.log.debug('Request started', {'id':xhr.id})\n      for (var key in options.headers)\n        xhr.setRequestHeader(key, options.headers[key])\n    }\n\n    else if(xhr.readyState === XHR.HEADERS_RECEIVED)\n      on_response()\n\n    else if(xhr.readyState === XHR.LOADING) {\n      on_response()\n      on_loading()\n    }\n\n    else if(xhr.readyState === XHR.DONE) {\n      on_response()\n      on_loading()\n      on_end()\n    }\n  }\n\n  function on_response() {\n    if(did.response)\n      return\n\n    did.response = true\n    request.log.debug('Got response', {'id':xhr.id, 'status':xhr.status})\n    clearTimeout(xhr.timeoutTimer)\n    xhr.statusCode = xhr.status // Node request compatibility\n\n    // Detect failed CORS requests.\n    if(is_cors && xhr.statusCode == 0) {\n      var cors_err = new Error('CORS request rejected: ' + options.uri)\n      cors_err.cors = 'rejected'\n\n      // Do not process this request further.\n      did.loading = true\n      did.end = true\n\n      return options.callback(cors_err, xhr)\n    }\n\n    options.onResponse(null, xhr)\n  }\n\n  function on_loading() {\n    if(did.loading)\n      return\n\n    did.loading = true\n    request.log.debug('Response body loading', {'id':xhr.id})\n    // TODO: Maybe simulate \"data\" events by watching xhr.responseText\n  }\n\n  function on_end() {\n    if(did.end)\n      return\n\n    did.end = true\n    request.log.debug('Request done', {'id':xhr.id})\n\n    xhr.body = xhr.responseText\n    if(options.json) {\n      try        { xhr.body = JSON.parse(xhr.responseText) }\n      catch (er) { return options.callback(er, xhr)        }\n    }\n\n    options.callback(null, xhr, xhr.body)\n  }\n\n} // request\n\nrequest.withCredentials = false;\nrequest.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;\n\n//\n// defaults\n//\n\nrequest.defaults = function(options, requester) {\n  var def = function (method) {\n    var d = function (params, callback) {\n      if(typeof params === 'string')\n        params = {'uri': params};\n      else {\n        params = JSON.parse(JSON.stringify(params));\n      }\n      for (var i in options) {\n        if (params[i] === undefined) params[i] = options[i]\n      }\n      return method(params, callback)\n    }\n    return d\n  }\n  var de = def(request)\n  de.get = def(request.get)\n  de.post = def(request.post)\n  de.put = def(request.put)\n  de.head = def(request.head)\n  return de\n}\n\n//\n// HTTP method shortcuts\n//\n\nvar shortcuts = [ 'get', 'put', 'post', 'head' ];\nshortcuts.forEach(function(shortcut) {\n  var method = shortcut.toUpperCase();\n  var func   = shortcut.toLowerCase();\n\n  request[func] = function(opts) {\n    if(typeof opts === 'string')\n      opts = {'method':method, 'uri':opts};\n    else {\n      opts = JSON.parse(JSON.stringify(opts));\n      opts.method = method;\n    }\n\n    var args = [opts].concat(Array.prototype.slice.apply(arguments, [1]));\n    return request.apply(this, args);\n  }\n})\n\n//\n// CouchDB shortcut\n//\n\nrequest.couch = function(options, callback) {\n  if(typeof options === 'string')\n    options = {'uri':options}\n\n  // Just use the request API to do JSON.\n  options.json = true\n  if(options.body)\n    options.json = options.body\n  delete options.body\n\n  callback = callback || noop\n\n  var xhr = request(options, couch_handler)\n  return xhr\n\n  function couch_handler(er, resp, body) {\n    if(er)\n      return callback(er, resp, body)\n\n    if((resp.statusCode < 200 || resp.statusCode > 299) && body.error) {\n      // The body is a Couch JSON object indicating the error.\n      er = new Error('CouchDB error: ' + (body.error.reason || body.error.error))\n      for (var key in body)\n        er[key] = body[key]\n      return callback(er, resp, body);\n    }\n\n    return callback(er, resp, body);\n  }\n}\n\n//\n// Utility\n//\n\nfunction noop() {}\n\nfunction getLogger() {\n  var logger = {}\n    , levels = ['trace', 'debug', 'info', 'warn', 'error']\n    , level, i\n\n  for(i = 0; i < levels.length; i++) {\n    level = levels[i]\n\n    logger[level] = noop\n    if(typeof console !== 'undefined' && console && console[level])\n      logger[level] = formatted(console, level)\n  }\n\n  return logger\n}\n\nfunction formatted(obj, method) {\n  return formatted_logger\n\n  function formatted_logger(str, context) {\n    if(typeof context === 'object')\n      str += ' ' + JSON.stringify(context)\n\n    return obj[method].call(obj, str)\n  }\n}\n\n// Return whether a URL is a cross-domain request.\nfunction is_crossDomain(url) {\n  var rurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/\n\n  // jQuery #8138, IE may throw an exception when accessing\n  // a field from window.location if document.domain has been set\n  var ajaxLocation\n  try { ajaxLocation = location.href }\n  catch (e) {\n    // Use the href attribute of an A element since IE will modify it given document.location\n    ajaxLocation = document.createElement( \"a\" );\n    ajaxLocation.href = \"\";\n    ajaxLocation = ajaxLocation.href;\n  }\n\n  var ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []\n    , parts = rurl.exec(url.toLowerCase() )\n\n  var result = !!(\n    parts &&\n    (  parts[1] != ajaxLocParts[1]\n    || parts[2] != ajaxLocParts[2]\n    || (parts[3] || (parts[1] === \"http:\" ? 80 : 443)) != (ajaxLocParts[3] || (ajaxLocParts[1] === \"http:\" ? 80 : 443))\n    )\n  )\n\n  //console.debug('is_crossDomain('+url+') -> ' + result)\n  return result\n}\n\n// MIT License from http://phpjs.org/functions/base64_encode:358\nfunction b64_enc (data) {\n    // Encodes string using MIME base64 algorithm\n    var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc=\"\", tmp_arr = [];\n\n    if (!data) {\n        return data;\n    }\n\n    // assume utf8 data\n    // data = this.utf8_encode(data+'');\n\n    do { // pack three octets into four hexets\n        o1 = data.charCodeAt(i++);\n        o2 = data.charCodeAt(i++);\n        o3 = data.charCodeAt(i++);\n\n        bits = o1<<16 | o2<<8 | o3;\n\n        h1 = bits>>18 & 0x3f;\n        h2 = bits>>12 & 0x3f;\n        h3 = bits>>6 & 0x3f;\n        h4 = bits & 0x3f;\n\n        // use hexets to index into b64, and append result to encoded string\n        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n    } while (i < data.length);\n\n    enc = tmp_arr.join('');\n\n    switch (data.length % 3) {\n        case 1:\n            enc = enc.slice(0, -2) + '==';\n        break;\n        case 2:\n            enc = enc.slice(0, -1) + '=';\n        break;\n    }\n\n    return enc;\n}\n    return request;\n//UMD FOOTER START\n}));\n//UMD FOOTER END\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY];\n  var exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n","/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if(\"function\"===typeof F)S=function(){F(R)};else if(\"undefined\"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _iterator = require(\"../core-js/symbol/iterator\");\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = require(\"../core-js/symbol\");\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n  return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n} : function (obj) {\n  return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};","\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n","\"use strict\";\n\nexports.__esModule = true;\n\nvar _setPrototypeOf = require(\"../core-js/object/set-prototype-of\");\n\nvar _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);\n\nvar _create = require(\"../core-js/object/create\");\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _typeof2 = require(\"../helpers/typeof\");\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(superClass)));\n  }\n\n  subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;\n};","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n","require('./es6.array.iterator');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar TO_STRING_TAG = require('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n  'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n  var NAME = DOMIterables[i];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n  Iterators[NAME] = Iterators.Array;\n}\n","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n","require('../../modules/es6.object.create');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function create(P, D) {\n  return $Object.create(P, D);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var IS_WRAP = type & $export.W;\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE];\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n  var key, own, out;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if (own && has(exports, key)) continue;\n    // export native or passed\n    out = own ? target[key] : source[key];\n    // prevent global pollution for namespaces\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n    // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global)\n    // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? (function (C) {\n      var F = function (a, b, c) {\n        if (this instanceof C) {\n          switch (arguments.length) {\n            case 0: return new C();\n            case 1: return new C(a);\n            case 2: return new C(a, b);\n          } return new C(a, b, c);\n        } return C.apply(this, arguments);\n      };\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F;\n    // make static versions for prototype methods\n    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n    if (IS_PROTO) {\n      (exports.virtual || (exports.virtual = {}))[key] = out;\n      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n    }\n  }\n};\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict'\n\n// util\nfunction fillStr (s, num) { return Array(num + 1).join(s) }\nfunction isNum (x) { return typeof x === 'number' }\nfunction isStr (x) { return typeof x === 'string' }\nfunction isDef (x) { return typeof x !== 'undefined' }\nfunction midiToFreq (midi, tuning) {\n  return Math.pow(2, (midi - 69) / 12) * (tuning || 440)\n}\n\nvar REGEX = /^([a-gA-G])(#{1,}|b{1,}|x{1,}|)(-?\\d*)\\s*(.*)\\s*$/\n/**\n * A regex for matching note strings in scientific notation.\n *\n * @name regex\n * @function\n * @return {RegExp} the regexp used to parse the note name\n *\n * The note string should have the form `letter[accidentals][octave][element]`\n * where:\n *\n * - letter: (Required) is a letter from A to G either upper or lower case\n * - accidentals: (Optional) can be one or more `b` (flats), `#` (sharps) or `x` (double sharps).\n * They can NOT be mixed.\n * - octave: (Optional) a positive or negative integer\n * - element: (Optional) additionally anything after the duration is considered to\n * be the element name (for example: 'C2 dorian')\n *\n * The executed regex contains (by array index):\n *\n * - 0: the complete string\n * - 1: the note letter\n * - 2: the optional accidentals\n * - 3: the optional octave\n * - 4: the rest of the string (trimmed)\n *\n * @example\n * var parser = require('note-parser')\n * parser.regex.exec('c#4')\n * // => ['c#4', 'c', '#', '4', '']\n * parser.regex.exec('c#4 major')\n * // => ['c#4major', 'c', '#', '4', 'major']\n * parser.regex().exec('CMaj7')\n * // => ['CMaj7', 'C', '', '', 'Maj7']\n */\nexport function regex () { return REGEX }\n\nvar SEMITONES = [0, 2, 4, 5, 7, 9, 11]\n/**\n * Parse a note name in scientific notation an return it's components,\n * and some numeric properties including midi number and frequency.\n *\n * @name parse\n * @function\n * @param {String} note - the note string to be parsed\n * @param {Boolean} isTonic - true the strings it's supposed to contain a note number\n * and some category (for example an scale: 'C# major'). It's false by default,\n * but when true, en extra tonicOf property is returned with the category ('major')\n * @param {Float} tunning - The frequency of A4 note to calculate frequencies.\n * By default it 440.\n * @return {Object} the parsed note name or null if not a valid note\n *\n * The parsed note name object will ALWAYS contains:\n * - letter: the uppercase letter of the note\n * - acc: the accidentals of the note (only sharps or flats)\n * - pc: the pitch class (letter + acc)\n * - step: s a numeric representation of the letter. It's an integer from 0 to 6\n * where 0 = C, 1 = D ... 6 = B\n * - alt: a numeric representation of the accidentals. 0 means no alteration,\n * positive numbers are for sharps and negative for flats\n * - chroma: a numeric representation of the pitch class. It's like midi for\n * pitch classes. 0 = C, 1 = C#, 2 = D ... 11 = B. Can be used to find enharmonics\n * since, for example, chroma of 'Cb' and 'B' are both 11\n *\n * If the note has octave, the parser object will contain:\n * - oct: the octave number (as integer)\n * - midi: the midi number\n * - freq: the frequency (using tuning parameter as base)\n *\n * If the parameter `isTonic` is set to true, the parsed object will contain:\n * - tonicOf: the rest of the string that follows note name (left and right trimmed)\n *\n * @example\n * var parse = require('note-parser').parse\n * parse('Cb4')\n * // => { letter: 'C', acc: 'b', pc: 'Cb', step: 0, alt: -1, chroma: -1,\n *         oct: 4, midi: 59, freq: 246.94165062806206 }\n * // if no octave, no midi, no freq\n * parse('fx')\n * // => { letter: 'F', acc: '##', pc: 'F##', step: 3, alt: 2, chroma: 7 })\n */\nexport function parse (str, isTonic, tuning) {\n  if (typeof str !== 'string') return null\n  var m = REGEX.exec(str)\n  if (!m || (!isTonic && m[4])) return null\n\n  var p = { letter: m[1].toUpperCase(), acc: m[2].replace(/x/g, '##') }\n  p.pc = p.letter + p.acc\n  p.step = (p.letter.charCodeAt(0) + 3) % 7\n  p.alt = p.acc[0] === 'b' ? -p.acc.length : p.acc.length\n  var pos = SEMITONES[p.step] + p.alt\n  p.chroma = pos < 0 ? 12 + pos : pos % 12\n  if (m[3]) { // has octave\n    p.oct = +m[3]\n    p.midi = pos + 12 * (p.oct + 1)\n    p.freq = midiToFreq(p.midi, tuning)\n  }\n  if (isTonic) p.tonicOf = m[4]\n  return p\n}\n\nvar LETTERS = 'CDEFGAB'\nfunction accStr (n) { return !isNum(n) ? '' : n < 0 ? fillStr('b', -n) : fillStr('#', n) }\nfunction octStr (n) { return !isNum(n) ? '' : '' + n }\n\n/**\n * Create a string from a parsed object or `step, alteration, octave` parameters\n * @param {Object} obj - the parsed data object\n * @return {String} a note string or null if not valid parameters\n * @since 1.2\n * @example\n * parser.build(parser.parse('cb2')) // => 'Cb2'\n *\n * @example\n * // it accepts (step, alteration, octave) parameters:\n * parser.build(3) // => 'F'\n * parser.build(3, -1) // => 'Fb'\n * parser.build(3, -1, 4) // => 'Fb4'\n */\nexport function build (s, a, o) {\n  if (s === null || typeof s === 'undefined') return null\n  if (s.step) return build(s.step, s.alt, s.oct)\n  if (s < 0 || s > 6) return null\n  return LETTERS.charAt(s) + accStr(a) + octStr(o)\n}\n\n/**\n * Get midi of a note\n *\n * @name midi\n * @function\n * @param {String|Integer} note - the note name or midi number\n * @return {Integer} the midi number of the note or null if not a valid note\n * or the note does NOT contains octave\n * @example\n * var parser = require('note-parser')\n * parser.midi('A4') // => 69\n * parser.midi('A') // => null\n * @example\n * // midi numbers are bypassed (even as strings)\n * parser.midi(60) // => 60\n * parser.midi('60') // => 60\n */\nexport function midi (note) {\n  if ((isNum(note) || isStr(note)) && note >= 0 && note < 128) return +note\n  var p = parse(note)\n  return p && isDef(p.midi) ? p.midi : null\n}\n\n/**\n * Get freq of a note in hertzs (in a well tempered 440Hz A4)\n *\n * @name freq\n * @function\n * @param {String} note - the note name or note midi number\n * @param {String} tuning - (Optional) the A4 frequency (440 by default)\n * @return {Float} the freq of the number if hertzs or null if not valid note\n * @example\n * var parser = require('note-parser')\n * parser.freq('A4') // => 440\n * parser.freq('A') // => null\n * @example\n * // can change tuning (440 by default)\n * parser.freq('A4', 444) // => 444\n * parser.freq('A3', 444) // => 222\n * @example\n * // it accepts midi numbers (as numbers and as strings)\n * parser.freq(69) // => 440\n * parser.freq('69', 442) // => 442\n */\nexport function freq (note, tuning) {\n  var m = midi(note)\n  return m === null ? null : midiToFreq(m, tuning)\n}\n\nexport function letter (src) { return (parse(src) || {}).letter }\nexport function acc (src) { return (parse(src) || {}).acc }\nexport function pc (src) { return (parse(src) || {}).pc }\nexport function step (src) { return (parse(src) || {}).step }\nexport function alt (src) { return (parse(src) || {}).alt }\nexport function chroma (src) { return (parse(src) || {}).chroma }\nexport function oct (src) { return (parse(src) || {}).oct }\n","\nmodule.exports = function (player) {\n  /**\n   * Adds a listener of an event\n   * @chainable\n   * @param {String} event - the event name\n   * @param {Function} callback - the event handler\n   * @return {SamplePlayer} the player\n   * @example\n   * player.on('start', function(time, note) {\n   *   console.log(time, note)\n   * })\n   */\n  player.on = function (event, cb) {\n    if (arguments.length === 1 && typeof event === 'function') return player.on('event', event)\n    var prop = 'on' + event\n    var old = player[prop]\n    player[prop] = old ? chain(old, cb) : cb\n    return player\n  }\n  return player\n}\n\nfunction chain (fn1, fn2) {\n  return function (a, b, c, d) { fn1(a, b, c, d); fn2(a, b, c, d) }\n}\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","module.exports = ADSR\n\nfunction ADSR(audioContext){\n  var node = audioContext.createGain()\n\n  var voltage = node._voltage = getVoltage(audioContext)\n  var value = scale(voltage)\n  var startValue = scale(voltage)\n  var endValue = scale(voltage)\n\n  node._startAmount = scale(startValue)\n  node._endAmount = scale(endValue)\n\n  node._multiplier = scale(value)\n  node._multiplier.connect(node)\n  node._startAmount.connect(node)\n  node._endAmount.connect(node)\n\n  node.value = value.gain\n  node.startValue = startValue.gain\n  node.endValue = endValue.gain\n\n  node.startValue.value = 0\n  node.endValue.value = 0\n\n  Object.defineProperties(node, props)\n  return node\n}\n\nvar props = {\n\n  attack: { value: 0, writable: true },\n  decay: { value: 0, writable: true },\n  sustain: { value: 1, writable: true },\n  release: {value: 0, writable: true },\n\n  getReleaseDuration: {\n    value: function(){\n      return this.release\n    }\n  },\n\n  start: {\n    value: function(at){\n      var target = this._multiplier.gain\n      var startAmount = this._startAmount.gain\n      var endAmount = this._endAmount.gain\n\n      this._voltage.start(at)\n      this._decayFrom = this._decayFrom = at+this.attack\n      this._startedAt = at\n\n      var sustain = this.sustain\n\n      target.cancelScheduledValues(at)\n      startAmount.cancelScheduledValues(at)\n      endAmount.cancelScheduledValues(at)\n\n      endAmount.setValueAtTime(0, at)\n\n      if (this.attack){\n        target.setValueAtTime(0, at)\n        target.linearRampToValueAtTime(1, at + this.attack)\n\n        startAmount.setValueAtTime(1, at)\n        startAmount.linearRampToValueAtTime(0, at + this.attack)\n      } else {\n        target.setValueAtTime(1, at)\n        startAmount.setValueAtTime(0, at)\n      }\n\n      if (this.decay){\n        target.setTargetAtTime(sustain, this._decayFrom, getTimeConstant(this.decay))\n      }\n    }\n  },\n\n  stop: {\n    value: function(at, isTarget){\n      if (isTarget){\n        at = at - this.release\n      }\n\n      var endTime = at + this.release\n      if (this.release){\n\n        var target = this._multiplier.gain\n        var startAmount = this._startAmount.gain\n        var endAmount = this._endAmount.gain\n\n        target.cancelScheduledValues(at)\n        startAmount.cancelScheduledValues(at)\n        endAmount.cancelScheduledValues(at)\n\n        var expFalloff = getTimeConstant(this.release)\n\n        // truncate attack (required as linearRamp is removed by cancelScheduledValues)\n        if (this.attack && at < this._decayFrom){\n          var valueAtTime = getValue(0, 1, this._startedAt, this._decayFrom, at)\n          target.linearRampToValueAtTime(valueAtTime, at)\n          startAmount.linearRampToValueAtTime(1-valueAtTime, at)\n          startAmount.setTargetAtTime(0, at, expFalloff)\n        }\n\n        endAmount.setTargetAtTime(1, at, expFalloff)\n        target.setTargetAtTime(0, at, expFalloff)\n      }\n\n      this._voltage.stop(endTime)\n      return endTime\n    }\n  },\n\n  onended: {\n    get: function(){\n      return this._voltage.onended\n    },\n    set: function(value){\n      this._voltage.onended = value\n    }\n  }\n\n}\n\nvar flat = new Float32Array([1,1])\nfunction getVoltage(context){\n  var voltage = context.createBufferSource()\n  var buffer = context.createBuffer(1, 2, context.sampleRate)\n  buffer.getChannelData(0).set(flat)\n  voltage.buffer = buffer\n  voltage.loop = true\n  return voltage\n}\n\nfunction scale(node){\n  var gain = node.context.createGain()\n  node.connect(gain)\n  return gain\n}\n\nfunction getTimeConstant(time){\n  return Math.log(time+1)/Math.log(100)\n}\n\nfunction getValue(start, end, fromTime, toTime, at){\n  var difference = end - start\n  var time = toTime - fromTime\n  var truncateTime = at - fromTime\n  var phase = truncateTime / time\n  var value = start + phase * difference\n\n  if (value <= start) {\n      value = start\n  }\n  if (value >= end) {\n      value = end\n  }\n\n  return value\n}\n","'use strict'\n\nvar isArr = Array.isArray\nvar isObj = function (o) { return o && typeof o === 'object' }\nvar OPTS = {}\n\nmodule.exports = function (player) {\n  /**\n   * Schedule a list of events to be played at specific time.\n   *\n   * It supports three formats of events for the events list:\n   *\n   * - An array with [time, note]\n   * - An array with [time, object]\n   * - An object with { time: ?, [name|note|midi|key]: ? }\n   *\n   * @param {Float} time - an absolute time to start (or AudioContext's\n   * currentTime if provided number is 0)\n   * @param {Array} events - the events list.\n   * @return {Array} an array of ids\n   *\n   * @example\n   * // Event format: [time, note]\n   * var piano = player(ac, ...).connect(ac.destination)\n   * piano.schedule(0, [ [0, 'C2'], [0.5, 'C3'], [1, 'C4'] ])\n   *\n   * @example\n   * // Event format: an object { time: ?, name: ? }\n   * var drums = player(ac, ...).connect(ac.destination)\n   * drums.schedule(0, [\n   *   { name: 'kick', time: 0 },\n   *   { name: 'snare', time: 0.5 },\n   *   { name: 'kick', time: 1 },\n   *   { name: 'snare', time: 1.5 }\n   * ])\n   */\n  player.schedule = function (time, events) {\n    var now = player.context.currentTime\n    var when = time < now ? now : time\n    player.emit('schedule', when, events)\n    var t, o, note, opts\n    return events.map(function (event) {\n      if (!event) return null\n      else if (isArr(event)) {\n        t = event[0]; o = event[1]\n      } else {\n        t = event.time; o = event\n      }\n\n      if (isObj(o)) {\n        note = o.name || o.key || o.note || o.midi || null\n        opts = o\n      } else {\n        note = o\n        opts = OPTS\n      }\n\n      return player.start(note, when + (t || 0), opts)\n    })\n  }\n  return player\n}\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","module.exports = function(arr, obj){\n  if (arr.indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};","function getBarLength(bar, bars, totalLength){\n  let nextBar = null;\n  if(bar.number -1 < bars.length){ //bar.number is 1 based, can be used as inded to next bar\n    nextBar = bars[bar.number];\n  }\n\n  if(nextBar && nextBar.position){\n    return nextBar.position - bar.position;\n  }else{\n    return totalLength - bar.position;\n  }\n}\nfunction barIsVisible(bar, barLength, currentPosition, viewPortWidth){\n  return bar.position >= currentPosition  //after current postion\n    && bar.position + barLength < currentPosition + viewPortWidth; //before end of viewport\n}\n\nfunction needsLeftAlign(bar, allBars, totalLength, maxBarIndex, viewPortWidth){\n  //if we are within the last 4 bars, and all bars can fit into the viewport\n  //we can left align\n  let barIndex = bar.number -1;\n  if(maxBarIndex - barIndex < 4){\n    let allBarLength = 0\n    for(var i=barIndex; i <= maxBarIndex; i++){\n      allBarLength += getBarLength(allBars[i], allBars, totalLength)\n    }\n    return allBarLength <= viewPortWidth;\n  }\n\n  return false;\n}\n\nmodule.exports = {\n  calculatePosition:(\n    currentPosition, currentBar, minBarIndex, maxBarIndex, allBars, viewPortWidth, totalLength)=>{\n    viewPortWidth = viewPortWidth * 0.8;\n    //const currentBar = allBars[currentBarIndex];\n    const barLength = getBarLength(currentBar, allBars, totalLength);\n    let repositionOnBar = null;\n\n    if(!repositionOnBar){\n      if(barIsVisible(currentBar, barLength, currentPosition, viewPortWidth)){\n        if(currentBar.number % 2 === 1){ //first part of bar\n          let nextBar = allBars[currentBar.number]; //1-based\n          let nextBarLength = getBarLength(nextBar, allBars, totalLength);\n          if(!barIsVisible(nextBar, nextBarLength, currentPosition, viewPortWidth)){\n            //first part of bar is visible, but the next part isn't\n            //let's position on start of this bar\n            repositionOnBar = currentBar;\n          }\n        }\n      } else {\n        // if(currentBar.number > 1){\n        //   let prevBar = allBars[currentBar.number -2]; //one based\n        //   let prevBarLength = getBarLength(prevBar, allBars, totalLength);\n        //   if(prevBarLength + barLength < viewPortWidth){\n        //     //current bar isn't visible, and both bars can be showed,\n        //     //position on prev bar\n        //     repositionOnBar = prevBar;\n        //   }\n        // }\n        if(!repositionOnBar) {\n          repositionOnBar = currentBar;\n        }\n      }\n    }\n\n    if(repositionOnBar){\n      if(needsLeftAlign(repositionOnBar, allBars, totalLength, maxBarIndex, viewPortWidth)){\n        let lastBar = allBars[maxBarIndex]\n        let lastBarLength = getBarLength(lastBar, allBars, totalLength);\n        let leftAlignedPosition = (lastBar.position + lastBarLength) - viewPortWidth;\n        if(leftAlignedPosition < 0){\n          return 0;\n        }else{\n          return leftAlignedPosition;\n        }\n      }else{\n        return repositionOnBar.position;\n      }\n    }\n    return currentPosition;\n  }\n};","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toObject = require('./_to-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $GOPS = require('./_object-gops');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n  require('./_object-pie').f = $propertyIsEnumerable;\n  $GOPS.f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./_library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });\n\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    return $GOPS.f(toObject(it));\n  }\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n  var printWarning = function printWarning(format, args) {\n    var len = arguments.length;\n    args = new Array(len > 1 ? len - 1 : 0);\n    for (var key = 1; key < len; key++) {\n      args[key - 1] = arguments[key];\n    }\n    var argIndex = 0;\n    var message = 'Warning: ' +\n      format.replace(/%s/g, function() {\n        return args[argIndex++];\n      });\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  }\n\n  warning = function(condition, format, args) {\n    var len = arguments.length;\n    args = new Array(len > 2 ? len - 2 : 0);\n    for (var key = 2; key < len; key++) {\n      args[key - 2] = arguments[key];\n    }\n    if (format === undefined) {\n      throw new Error(\n          '`warning(condition, format, ...args)` requires a warning ' +\n          'message argument'\n      );\n    }\n    if (!condition) {\n      printWarning.apply(null, [format].concat(args));\n    }\n  };\n}\n\nmodule.exports = warning;\n","module.exports = { \"default\": require(\"core-js/library/fn/array/from\"), __esModule: true };","exports.f = Object.getOwnPropertySymbols;\n","module.exports = { \"default\": require(\"core-js/library/fn/object/define-property\"), __esModule: true };","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the module cache\n__webpack_require__.c = __webpack_module_cache__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","// module cache are used so entry inlining is disabled\n// startup\n// Load entry module and return exports\nvar __webpack_exports__ = __webpack_require__(__webpack_require__.s = 3481);\n"],"names":["note","toMidi","n","isMidi","midi","module","exports","player","buffers","map","opts","toKey","mapper","name","Object","keys","reduce","mapped","mapBuffers","start","when","options","key","dec","Math","floor","assign","cents","dP","anObject","getKeys","defineProperties","O","Properties","P","length","i","f","toInteger","min","it","o","e","t","s","a","r","h","Error","code","c","call","defineProperty","value","this","_event","_data","data","receivedTime","console","warn","_messageCode","channel","messageType","velocity","pressure","controllerNumber","controllerValue","channelModeMessage","program","pitchBend","L","parseBool","makeDuration","makeBend","getFingering","getStrokeParts","getScoreArticulationParts","Vex","require","_","Artist","undefined","x","y","width","_classCallCheck","font_face","font_size","font_style","bottom_spacing","NOLOGO","tab_stave_lower_spacing","note_stave_lower_spacing","scale","extend","reset","tuning","Flow","Tuning","key_manager","KeyManager","music_api","Music","customizations","staves","tab_articulations","stave_articulations","player_voices","last_y","current_duration","current_clef","current_bends","current_octave_shift","bend_start_index","bend_start_strings","rendered","renderer_context","valid_options","k","v","Array","from","includes","RERR","concat","parseInt","space","voices","context","renderer","closeBends","resize","ctx","getContext","clear","setFont","setBar","stave","notes","last_note","last","BarNote","pop","tab_note_start_x","getNoteStartX","setEndBarType","getType","setNoteStartX","_i","_Array$from","tab","tab_notes","note_notes","setContext","draw","tab_voices","push","note_voices","formatAndRender","text_voices","beam_groups","_i2","_Array$from2","_i3","_Array$from3","setTempo","tempo","setInstrument","instrument","render","removeControls","LOGO","measureText","save","fillText","restore","score","text_notes","multi_voice","score_stave","tab_stave","voice","score_voices","beams","format_stave","text_stave","beam_config","beam_rests","show_stemlets","beam_middle_only","groups","isEmpty","each","setStave","Voice","TIME4_4","setMode","Mode","SOFT","addTickables","stem_direction","Beam","generateBeams","getTickables","_i4","_Array$from4","format_voices","formatter","Formatter","align_rests","joinVoices","formatToStave","beam","renderConnector","StaveConnector","setType","type","BRACKET","fret","string","spec","getNoteForFret","spec_props","keyProperties","selected_note","selectNote","accidental","accidentals","change","new_note","new_octave","octave","old_root","getNoteParts","root","new_root","abc","accidental_type","note_params","params","is_rest","play_note","stave_notes","stave_note","StaveNote","duration","clef","auto_stem","index","acc","parts","split","new_accidental","Accidental","setAsCautionary","addAccidental","addDotToAll","setPlayNote","arguments","new_tab_note","TabNote","positions","addDot","time","dot","TYPE","Barline","SINGLE","DOUBLE","END","REPEAT_BEGIN","REPEAT_END","REPEAT_BOTH","bar_note","first_note","first_indices","last_indices","_this","start_note","start_indices","getPositions","last_frets","result","last_index","from_fret","to_fret","offset","phrase","_i5","_Array$from5","bend","addModifier","Bend","_i6","_Array$from6","slice","setGhost","tuplets","modifier","Tuplet","num_notes","tab_modifier","text","POS","Modifier","Position","fingers","fingering","p","trim","badFingering","_i7","_Array$from7","pieces","match","note_number","position","RIGHT","LEFT","ABOVE","BELOW","number","StringNumber","setPosition","FretHandFinger","num","Stroke","Type","BRUSH_UP","BRUSH_DOWN","ROLL_UP","ROLL_DOWN","RASQUEDO_UP","RASQUEDO_DOWN","POSTYPE","pos","Articulation","aposition","VJUST","Annotation","VerticalJustify","default_vjust","TOP","BOTTOM","makeIt","just","setVerticalJustification","annotations","score_articulation","stroke","_this2","iterable","tab_note","makeScoreArticulation","makeStroke","makeAnnotation","iterable1","addAnnotation","iterable2","addArticulation","addStroke","fingerings","makeFingering","articulation","TabSlide","TabTie","toUpperCase","openBends","StaveTie","decorator","transform","score_notes","score_modifier","Vibrato","setHarsh","articulations","current_tab_note","has_bends","_i8","_arr","current_indices","prev_indices","prev_tab_note","valid_articulation","indices","art","prev_index","getPreviousNoteIndex","this_strings","result1","str","valid_strings","result2","result3","result4","iterable3","addTabArticulation","addStaveArticulation","addStaveNote","GhostNote","chord","chord_articulation","chord_decorator","specs","play_notes","decorators","tab_specs","durations","current_string","first","current_position","_i9","_Array$from8","_Array$from0","_slicedToArray","_Array$from10","getNoteForABC","_Array$from12","play_octave","setDuration","addTabNote","addArticulations","addDecorator","end","asc","addChord","font","justification","smooth","ignore_ticks","TextNote","Justification","CENTER","struct","family","size","weight","glyph","setLine","setJustification","addStave","element","notation","tablature","strings","note_stave","start_x","tabstave_start_x","Stave","left_bar","renderClef","addClef","renderKeySig","addKeySignature","renderTimeSig","addTimeSignature","getHeight","TabStave","setNumLines","renderTabGlyph","addTabGlyph","getDefaultBeamGroups","setTuning","setKey","cancel_key","has","keySignature","keySpecs","keysig_note","KeySigNote","note_voice","tab_stave_start_x","setKeySignature","format","line","_l","_c","words","addKeyChange","getKey","DEBUG","_console","_len","args","_key","log","apply","_toConsumableArray","direction","UP","DOWN","abs","initClass","store","uid","Symbol","USE_SYMBOL","done","Iterators","ITERATOR","ArrayProto","prototype","absToRel","absoluteTime","startTime","zeroTime","maxTime","loopDuration","pauseDuration","absTime","Timer","audioContext","toBar","fromBar","barDuration","pauseBarFactor","tempoFactor","absolutePrepareOffset","prepareOffset","onAnimationFrame","bind","onCheckTimer","handlers","setInterval","_ref","beatsPerBar","_this$getTime","getTime","currentTime","factoredTime","pausedAt","forEach","onFactorChanged","check","window","requestAnimationFrame","_this$getTime2","isPlaying","prepareTime","onTimerStarted","timeDelay","canRewind","_this$currentTime","bars","getBars","currentBar","find","b","onTimeChange","onPrepare","absoluteOffset","handler","filter","obj","_typeof2","_typeof3","__esModule","default","self","ReferenceError","isObject","S","fn","val","toString","valueOf","TypeError","returnFalse","returnTrue","EventBaseObject","timeStamp","Date","now","target","currentTarget","isEventObject","constructor","isDefaultPrevented","isPropagationStopped","isImmediatePropagationStopped","preventDefault","stopPropagation","stopImmediatePropagation","halt","immediate","err","re","ClassList","el","nodeType","list","classList","add","arr","array","className","join","remove","removeMatching","splice","test","toggle","force","getAttribute","replace","shift","contains","checkDCE","__REACT_DEVTOOLS_GLOBAL_HOOK__","error","pIE","createDesc","toIObject","toPrimitive","IE8_DOM_DEFINE","gOPD","getOwnPropertyDescriptor","load","isSoundfontURL","nameToUrl","sf","Soundfont","ac","isUrl","toUrl","url","soundfont","only","then","connect","destination","def","TAG","tag","stat","configurable","Promise","reject","req","XMLHttpRequest","responseType","open","onload","status","response","statusText","onerror","send","$keys","hiddenKeys","getOwnPropertyNames","base64","fetch","fromRegex","prefix","pre","source","defVal","loader","ArrayBuffer","loadArrayBuffer","isAudioFileName","loadAudioFile","isPromise","loadPromise","isArray","loadArrayData","loadObjectData","isJsonFileName","loadJsonFile","isBase64Audio","loadBase64Audio","isJsFileName","loadMidiJSFile","resolve","decodeAudioData","buffer","promise","all","dest","promises","indexOf","audio","JSON","parse","decode","midiJsToJson","begin","lastIndexOf","loadAudio","$defineProperty","object","$export","create","exec","proto","set","setPrototypeOf","buggy","Function","__proto__","dPs","enumBugKeys","IE_PROTO","Empty","PROTOTYPE","createDict","iframeDocument","iframe","style","display","src","contentWindow","document","write","lt","close","F","_interopRequireDefault","_EventBaseObject2","_objectAssign2","TRUE","FALSE","commonProps","isNullOrUndefined","w","eventNormalizers","reg","props","fix","event","nativeEvent","which","charCode","keyCode","metaKey","ctrlKey","deltaX","deltaY","delta","wheelDelta","axis","wheelDeltaY","wheelDeltaX","detail","HORIZONTAL_AXIS","VERTICAL_AXIS","eventDoc","doc","body","button","pageX","clientX","ownerDocument","documentElement","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","fromElement","toElement","retTrue","retFalse","DomEventObject","isNative","cancelBubble","defaultPrevented","getPreventDefault","returnValue","fixFns","l","prop","normalizer","srcElement","parentNode","fixFn","EventBaseObjectProto","eventType","callback","option","wrapCallback","ne","_EventObject2","addEventListener","_ret","useCapture","capture","removeEventListener","attachEvent","detachEvent","_EventObject","addToUnscopables","step","iterated","kind","_t","_k","Arguments","get","FUNC_ERROR_TEXT","HASH_UNDEFINED","PLACEHOLDER","WRAP_CURRY_RIGHT_FLAG","WRAP_PARTIAL_FLAG","WRAP_PARTIAL_RIGHT_FLAG","WRAP_ARY_FLAG","WRAP_REARG_FLAG","INFINITY","MAX_SAFE_INTEGER","NAN","MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","RegExp","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsAstralRange","rsComboRange","rsComboMarksRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsVarRange","rsBreakRange","rsMathOpRange","rsApos","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsOptVar","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","parseFloat","freeParseInt","freeGlobal","g","freeSelf","freeExports","freeModule","moduleExports","freeProcess","process","nodeUtil","types","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","func","thisArg","arrayAggregator","setter","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","values","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","collection","eachFunc","baseFindIndex","fromIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","current","baseTimes","baseTrim","trimmedEndIndex","baseUnary","baseValues","cacheHas","cache","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","escapeHtmlChar","escapeStringChar","chr","hasUnicode","mapToArray","overArg","arg","replaceHolders","placeholder","setToArray","setToPairs","stringSize","lastIndex","unicodeSize","stringToArray","unicodeToArray","asciiToArray","charAt","unescapeHtmlChar","runInContext","defaults","pick","String","arrayProto","funcProto","objectProto","coreJsData","funcToString","hasOwnProperty","idCounter","maskSrcKey","nativeObjectToString","objectCtorString","oldDash","reIsNative","Buffer","Uint8Array","allocUnsafe","getPrototype","getPrototypeOf","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","iterator","symToStringTag","toStringTag","getNative","ctxClearTimeout","clearTimeout","ctxNow","ctxSetTimeout","setTimeout","nativeCeil","ceil","nativeFloor","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","max","nativeMin","nativeNow","nativeParseInt","nativeRandom","random","nativeReverse","reverse","DataView","Map","Set","WeakMap","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","symbolToString","lodash","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","entries","entry","ListCache","MapCache","SetCache","__data__","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","eq","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","lower","upper","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","initCloneArray","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","symbol","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","isSymbol","baseFilter","baseFlatten","depth","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","isFunction","baseGet","path","castPath","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","other","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","maxLength","Infinity","seen","baseInvoke","parent","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","message","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","othProps","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","property","baseKeys","isPrototype","baseKeysIn","nativeKeysIn","isProto","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","newValue","isTyped","isArrayLikeObject","isPlainObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","criteria","comparer","sort","baseSortBy","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","basePickBy","baseSet","basePullAll","basePullAt","indexes","previous","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","nested","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","actions","action","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","id","copy","arrayBuffer","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","argsLength","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","createCaseFirst","methodName","trailing","createCompounder","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","wrapper","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","arity","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","countHolders","newHolders","createRecurry","arrLength","oldArray","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","newData","setData","setWrapToString","createRound","precision","pair","noop","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrStacked","arrValue","flatten","otherFunc","getValue","stubArray","hasPath","hasFunc","isLength","ctorString","isMaskable","stubFalse","otherArgs","shortOut","reference","details","insertWrapDetails","updateWrapDetails","getWrapDetails","count","lastCalled","stamp","remaining","rand","memoize","memoizeCapped","charCodeAt","quote","subString","clone","difference","differenceBy","differenceWith","findIndex","findLastIndex","head","intersection","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","group","unzipWith","without","xor","xorBy","xorWith","zip","zipWith","chain","interceptor","wrapperAt","countBy","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","before","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","defer","delay","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","gt","gte","isError","isInteger","isNumber","isString","lte","toArray","next","iteratorToArray","remainder","toLength","isBinary","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invert","invertBy","invoke","merge","omit","CLONE_DEEP_FLAG","basePick","pickBy","toPairs","toPairsIn","camelCase","word","toLowerCase","capitalize","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","pattern","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","method","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","divide","dividend","divisor","multiply","multiplier","multiplicand","round","subtract","minuend","subtrahend","after","castArray","chunk","compact","cond","conforms","baseConforms","properties","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","fill","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","flip","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matches","matchesProperty","nthArg","omitBy","once","orderBy","propertyOf","pullAllBy","pullAllWith","rest","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","uniqWith","unset","update","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extendWith","clamp","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","escape","escapeRegExp","every","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEqual","isEqualWith","isMatch","isMatchWith","isNaN","isNil","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","pad","strLength","padEnd","padStart","radix","floating","temp","reduceRight","repeat","sample","some","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","template","settings","isEscaping","isEvaluating","imports","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","variable","times","toLower","toSafeInteger","toUpper","trimEnd","trimStart","truncate","omission","search","substring","global","newEnd","unescape","uniqueId","eachRight","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","dir","isRight","view","getView","iterLength","takeCount","iterIndex","commit","wrapped","toJSON","aa","ca","encodeURIComponent","da","ea","fa","ha","ia","createElement","ja","ka","la","ma","d","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","z","ra","sa","ta","pa","qa","oa","removeAttribute","setAttribute","setAttributeNS","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","A","Ma","Na","Oa","prepareStackTrace","Reflect","construct","displayName","Pa","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","enumerable","setValue","stopTracking","Ua","Wa","checked","Xa","activeElement","Ya","defaultChecked","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","eb","fb","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","innerHTML","firstChild","removeChild","appendChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","setProperty","tb","menuitem","area","base","br","col","embed","hr","img","keygen","link","meta","param","track","wbr","ub","vb","is","wb","xb","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","m","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","Yb","$b","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","delete","pointerId","Tc","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","Uc","jd","kd","ld","md","nd","od","pd","qd","rd","_reactName","_targetInst","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","isTrusted","td","ud","vd","Ad","screenX","screenY","shiftKey","altKey","getModifierState","zd","buttons","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","fromCharCode","location","locale","Rd","Td","height","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","date","datetime","email","month","password","tel","week","me","oe","listeners","pe","qe","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","Be","Ce","De","Ee","Fe","He","Ie","Je","Ke","node","nextSibling","Le","compareDocumentPosition","Me","HTMLIFrameElement","href","Ne","contentEditable","Oe","focusedElem","selectionRange","selectionStart","selectionEnd","defaultView","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","setStart","removeAllRanges","addRange","setEnd","left","top","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","instance","listener","D","of","pf","qf","rf","passive","J","u","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","unshift","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","Hf","Jf","queueMicrotask","catch","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","E","G","Vf","H","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","ref","_owner","_stringRef","refs","Mg","Ng","Og","Pg","Qg","Rg","implementation","Sg","Tg","q","Ug","Vg","Wg","Xg","Yg","Zg","$g","ah","_currentValue","bh","childLanes","ch","dependencies","firstContext","lanes","dh","eh","memoizedValue","fh","gh","hh","interleaved","ih","jh","kh","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","lh","mh","eventTime","lane","payload","nh","K","oh","ph","qh","rh","sh","th","uh","vh","wh","xh","yh","tagName","zh","Ah","Bh","Ch","revealOrder","Dh","Eh","_workInProgressVersionPrimary","Fh","ReactCurrentDispatcher","Gh","Hh","M","N","Ih","Jh","Kh","Lh","Mh","Nh","Oh","Ph","Qh","Rh","Sh","Th","baseQueue","queue","Uh","Vh","Wh","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","dispatch","Xh","Yh","Zh","$h","ai","getSnapshot","bi","ci","Q","di","lastEffect","stores","ei","fi","gi","hi","ii","destroy","deps","ji","ki","li","mi","ni","oi","pi","qi","ri","si","ti","ui","vi","wi","xi","yi","zi","Ai","R","Bi","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ci","defaultProps","Di","Ei","isMounted","_reactInternals","enqueueSetState","enqueueReplaceState","enqueueForceUpdate","Fi","shouldComponentUpdate","isPureReactComponent","Gi","contextType","state","Hi","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Ii","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","Ji","digest","Ki","Li","Mi","Ni","Oi","Pi","Qi","getDerivedStateFromError","componentDidCatch","Ri","componentStack","Si","pingCache","Ti","Ui","Vi","Wi","ReactCurrentOwner","Xi","Yi","Zi","$i","aj","compare","bj","cj","dj","baseLanes","cachePool","transitions","ej","fj","gj","hj","ij","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","jj","kj","pendingContext","lj","zj","Aj","Bj","Cj","mj","nj","oj","fallback","pj","qj","sj","dataset","dgst","tj","uj","_reactRetry","rj","subtreeFlags","vj","wj","isBackwards","rendering","renderingStartTime","tailMode","xj","Dj","Ej","Fj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","createElementNS","autoFocus","createTextNode","T","Gj","Hj","Ij","Jj","U","Kj","WeakSet","V","Lj","W","Mj","Nj","Pj","Qj","Rj","Sj","Tj","Uj","Vj","insertBefore","_reactRootContainer","Wj","X","Xj","Yj","Zj","onCommitFiberUnmount","componentWillUnmount","ak","bk","ck","dk","ek","isHidden","fk","gk","hk","ik","jk","kk","__reactInternalSnapshotBeforeUpdate","Vk","lk","mk","nk","ok","Y","Z","pk","qk","rk","sk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Ek","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","finishedWork","finishedLanes","Pk","timeoutHandle","Qk","Rk","Sk","Tk","Uk","mutableReadLanes","Bc","Oj","onCommitFiberRoot","mc","onRecoverableError","Wk","onPostCommitFiberRoot","Xk","Yk","$k","isReactComponent","pendingChildren","al","mutableSourceEagerHydrationData","bl","pendingSuspenseBoundaries","dl","fl","gl","hl","il","yj","Zk","kl","reportError","ll","_internalRoot","ml","nl","ol","pl","rl","ql","unmount","unstable_scheduleHydration","querySelectorAll","stringify","form","sl","usingClientEntryPoint","Events","tl","findFiberByHostInstance","bundleType","version","rendererPackageName","ul","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","vl","isDisabled","supportsFiber","inject","createPortal","cl","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","parser","$V0","$V1","$V2","$V3","$V4","$V5","$V6","$V7","$V8","$V9","$Va","$Vb","$Vc","$Vd","$Ve","$Vf","$Vg","$Vh","$Vi","$Vj","$Vk","$Vl","$Vm","$Vn","$Vo","$Vp","$Vq","$Vr","$Vs","$Vt","$Vu","$Vv","$Vw","$Vx","$Vy","$Vz","$VA","$VB","$VC","$VD","$VE","$VF","$VG","$VH","$VI","$VJ","$VK","$VL","$VM","$VN","$VO","$VP","$VQ","$VR","$VS","$VT","$VU","$VV","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","first_line","first_column","slurs","command","tuplet","table","defaultActions","parseError","hash","recoverable","vstack","lstack","recovering","lexer","sharedState","setInput","yylloc","yyloc","ranges","preErrorSymbol","len","newState","expected","lex","token","yyval","errStr","showPosition","loc","last_line","last_column","EOF","_input","_more","_backtrack","matched","conditionStack","unput","lines","substr","oldLines","more","backtrack_lexer","less","pastInput","past","upcomingInput","test_match","indexed_rule","backup","tempMatch","rules","_currentRules","condition","popState","conditions","topState","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","main","argv","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","propFullName","secret","getShim","isRequired","ReactPropTypes","bigint","bool","any","arrayOf","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","$Object","desc","PI_OVER_180","PI","Konva","stages","ids","names","shapes","listenClickTap","inDblClickWindow","isBrowser","enableTrace","traceArrMax","dblClickWindow","pixelRatio","dragDistance","angleDeg","showWarnings","Filters","isDragging","DD","isDragReady","_addId","_removeId","_addName","_removeName","_id","nodes","getAngle","angle","_detectIE","msie","rv","edge","_parseUA","userAgent","mobile","ieMobile","browser","isIE","UA","glob","WorkerGlobalScope","navigator","Collection","toCollection","_mapMethod","mapMethods","prot","Transform","point","translate","sx","sy","rotate","rad","cos","sin","m11","m12","m21","m22","getTranslation","skew","matrix","dx","dy","m0","m1","m2","m3","m4","m5","getMatrix","setAbsolutePosition","yt","xt","PI_OVER_DEG180","DEG180_OVER_PI","KONVA_ERROR","COLORS","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","transparent","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","RGB_REGEX","Util","_isElement","_isFunction","_isObject","_isArray","_isNumber","_isString","_throttle","timeout","later","_hasMethods","isValidSelector","selector","firstChar","createCanvasElement","canvas","_nodeCanvas","_isInDocument","_simplifyArray","retArr","util","_getImage","imageObj","Image","putImageData","toDataURL","_getRGBAString","alpha","_rgbToHex","_hexToRgb","hex","getRandomColor","randColor","getRGB","rgb","colorToRGBA","_namedColorToRBA","_hex3ColorToRGBA","_hex6ColorToRGBA","_rgbColorToRGBA","_rgbaColorToRGBA","Number","_merge","o1","o2","retObj","_clone","cloneObject","cloneArray","_degToRad","deg","_radToDeg","_capitalize","throw","oldProto","__super__","super","addMethods","methods","_getControlPoints","x0","y0","x1","y1","x2","y2","d01","sqrt","pow","d12","_expandPoints","tension","cp","allPoints","_removeLastLetter","_getProjectionToSegment","x3","y3","dist","pd2","_getProjectionToLine","pt","isClosed","MAX_VALUE","p1","p2","proj","px","py","pdist","_prepareArrayForTween","startArray","endArray","newStart","pr","_prepareToStringify","visitedByCircularReferenceRemoval","_pixelRatio","Canvas","config","init","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","getDevicePixelRatio","_canvas","padding","margin","border","background","getPixelRatio","setPixelRatio","previousRatio","setSize","getWidth","setWidth","setHeight","mimeType","quality","SceneCanvas","conf","SceneContext","HitCanvas","HitContext","hitCanvas","CONTEXT_METHODS","Context","traceArr","_enableTrace","fillShape","getFillEnabled","_fill","strokeShape","getStrokeEnabled","_stroke","fillStrokeShape","getTrace","relaxed","clearTrace","_trace","getCanvas","setTransform","bounds","clearRect","_applyLineCap","lineCap","getLineCap","setAttr","_applyOpacity","absOpacity","getAbsoluteOpacity","_applyLineJoin","lineJoin","getLineJoin","attr","arc","beginPath","bezierCurveTo","clip","closePath","createImageData","createLinearGradient","createPattern","createRadialGradient","drawImage","isPointInPath","fillRect","strokeRect","getImageData","lineTo","moveTo","rect","quadraticCurveTo","setLineDash","mozDash","webkitLineDash","getLineDash","strokeText","that","origSetter","ret","origMethod","_fillColor","_fillFunc","_fillPattern","fillPatternX","getFillPatternX","fillPatternY","getFillPatternY","fillPatternScale","getFillPatternScale","fillPatternRotation","getFillPatternRotation","fillPatternOffset","getFillPatternOffset","getFillPatternImage","getFillPatternRepeat","_fillLinearGradient","getFillLinearGradientStartPoint","getFillLinearGradientEndPoint","colorStops","getFillLinearGradientColorStops","grd","addColorStop","_fillRadialGradient","getFillRadialGradientStartPoint","getFillRadialGradientEndPoint","startRadius","getFillRadialGradientStartRadius","endRadius","getFillRadialGradientEndRadius","getFillRadialGradientColorStops","hasColor","hasPattern","hasLinearGradient","hasRadialGradient","fillPriority","getFillPriority","dash","strokeScaleEnabled","getStrokeScaleEnabled","Text","hasStroke","dashEnabled","dashOffset","getShadowForStrokeEnabled","_strokeFunc","_applyShadow","getShadowRGBA","blur","getShadowBlur","getShadowOffset","getAbsoluteScale","ratio","scaleX","scaleY","_applyGlobalCompositeOperation","globalCompositeOperation","getGlobalCompositeOperation","colorKey","_fillFuncHit","strokeHitEnabled","_strokeFuncHit","GET","SET","Factory","addGetterSetter","validator","addGetter","addSetter","addOverloadedGetterSetter","attrs","_setAttr","addComponentsGetterSetter","components","component","getter","getAttr","oldVal","_fireChangeEvent","capitalizedAttr","addDeprecatedGetterSetter","backCompat","oldMethodName","newMethodName","afterSetFilter","_filterUpToDate","Validators","RGBComponent","alphaComponent","ABSOLUTE_OPACITY","ABSOLUTE_TRANSFORM","ABSOLUTE_SCALE","LISTENING","MOUSEENTER","MOUSELEAVE","SHAPE","SPACE","STAGE","TRANSFORM","VISIBLE","CLONE_BLACK_LIST","TRANSFORM_CHANGE_STR","SCALE_CHANGE_STR","Node","eventListeners","_cache","_isUnderCache","setAttrs","on","_clearCache","_clearSelfAndDescendantCache","_getCache","privateGetter","getChildren","clearCache","getClientRect","skipTransform","relativeTo","getParent","drawBorder","cachedSceneCanvas","cachedFilterCanvas","cachedHitCanvas","sceneContext","hitContext","isCache","drawScene","drawHit","scene","hit","_transformedRect","minX","minY","maxX","maxY","points","trans","getAbsoluteTransform","transformed","_drawCachedSceneCanvas","cacheCanvas","_getCachedSceneCanvas","_drawCachedHitCanvas","imageData","filters","cachedCanvas","sceneCanvas","filterCanvas","filterContext","evtStr","_delegate","baseEvent","events","off","_off","evt","fire","stopNode","targets","findAncestors","_setChildrenIndices","getId","getName","subname","getAncestors","ancestors","getAttrs","isListening","_isListening","listening","getListening","isVisible","_isVisible","visible","getVisible","shouldDrawHit","layer","getLayer","hitGraphEnabled","show","setVisible","hide","getZIndex","getAbsoluteZIndex","getDepth","addChildren","getStage","setX","setY","getPosition","getX","getY","getAbsolutePosition","absoluteMatrix","absoluteTransform","origTrans","_clearTransform","_setTransform","rotation","getRotation","getScaleX","getScaleY","offsetX","getOffsetX","offsetY","getOffsetY","skewX","getSkewX","skewY","getSkewY","move","changeX","changeY","_eachAncestorReverse","theta","setRotation","moveToTop","moveUp","moveDown","moveToBottom","setZIndex","_getAbsoluteOpacity","getOpacity","newContainer","__originalRemove","toObject","getClassName","includeSelf","res","_isMatch","ancestor","findAncestor","sel","selectorArr","hasName","_get","_getStage","bubble","_fireAndBubble","_fire","_getAbsoluteTransform","transformsEnabled","getTransform","_getAbsoluteScale","_getTransform","allListeners","_toKonvaCanvas","stage","toCanvas","toImage","getSize","getDragDistance","evtName","evtListeners","newVal","setId","oldId","setName","oldNames","newNames","addName","oldName","newName","removeName","_setComponentAttr","compareShape","okayToRun","isAncestorOf","stopBubble","container","_createNode","no","rotateDeg","setRotationDeg","getRotationDeg","Grayscale","brightness","Brighten","Invert","BlurStack","mul_table","shg_table","Blur","radius","blurRadius","yp","yw","r_sum","g_sum","b_sum","a_sum","r_out_sum","g_out_sum","b_out_sum","a_out_sum","r_in_sum","g_in_sum","b_in_sum","a_in_sum","rbs","pixels","div","widthMinus1","heightMinus1","radiusPlus1","sumFactor","stackStart","stackEnd","stackIn","stackOut","mul_sum","shg_sum","filterGaussBlurRGBA","pixelAt","idata","idx","rgbDistance","Mask","mask","threshold","rgbv_no","rgbv_ne","rgbv_so","rgbv_se","thres","pTab","rgbMean","backgroundMask","applyMask","sw","weights","side","halfSide","maskResult","so","cy","cx","scy","scx","wt","smoothEdgeMask","dilateMask","erodeMask","RGB","nPixels","RGBA","HSV","saturation","hue","vsu","vsw","rr","gr","HSL","luminance","Emboss","strength","embossStrength","greyLevel","embossWhiteLevel","embossDirection","blend","embossBlend","dirY","dirX","w4","otherY","offsetYOther","otherX","offsetOther","dR","dG","dB","dif","absDif","remap","fromValue","fromMin","fromMax","toMin","toMax","fromRange","toRange","Enhance","nSubPixels","rMin","rMax","gMin","gMax","bMin","bMax","enhanceAmount","enhance","rMid","rGoalMax","rGoalMin","gMid","gGoalMax","gGoalMin","bMid","bGoalMax","bGoalMin","Posterize","levels","Noise","amount","noise","half","Pixelate","xBinStart","xBinEnd","yBinStart","yBinEnd","xBin","yBin","pixelsInBin","pixelSize","nBinsX","nBinsY","Threshold","level","Sepia","or","Solarize","Kaleidoscope","srcPos","dstPos","xSize","ySize","power","kaleidoscopePower","kaleidoscopeAngle","tempCanvas","scratchData","dst","opt","srcPixels","dstPixels","xMid","polarCenterX","yMid","polarCenterY","rSize","tSize","conversion","ToPolar","minSectionSize","sectionSize","xStart","xEnd","xDelta","phaseShift","polarRotation","atan2","FromPolar","Container","__init","filterFunc","results","hasChildren","removeChildren","destroyChildren","_validateAdd","anim","setLayers","clen","_getNodeById","_getNodesByName","findOne","_getDescendants","getAllIntersections","intersects","can","caching","_applyTransform","_drawChildren","clearHitCache","drawMethod","skipBuffer","clipX","clipY","clipWidth","getClipWidth","clipHeight","getClipHeight","clipFunc","getClipFunc","hasClip","getClipX","getClipY","layerUnderDrag","getLayers","selfRect","HAS_SHADOW","SHADOW_RGBA","_clearHasShadowCache","_clearGetShadowRGBACache","Shape","hasShadow","_hasShadow","getShadowEnabled","getShadowOpacity","getShadowColor","getShadowOffsetX","getShadowOffsetY","_getShadowRGBA","rgba","shadowColor","hasFill","getFill","strokeEnabled","bufferHitCanvas","_useBufferCanvas","perfectDrawEnabled","getSelfRect","_centroid","fillAndStrokeWidth","fillAndStrokeHeight","shadowOffsetX","shadowOffsetY","preWidth","preHeight","shadowBlur","roundingOffset","bufferCanvas","bufferContext","drawFunc","sceneFunc","hitFunc","drawHitFromCache","alphaThreshold","hitImageData","hitData","rgbColorKey","hitWidth","hitHeight","dashArray","getDashArray","setDashArray","getDrawFunc","setDrawFunc","drawHitFunc","getDrawHitFunc","setDrawHitFunc","MOUSEOUT","MOUSEOVER","MOUSEMOVE","MOUSEDOWN","MOUSEUP","TOUCHSTART","TOUCHEND","TOUCHMOVE","WHEEL","EVENTS","eventsLength","addEvent","eventName","content","Stage","___init","_buildDOM","_bindContentEvents","_enableNestedTransforms","setContainer","getElementsByClassName","getElementById","_resizeDOM","layers","getContainer","getPointerPosition","pointerPos","getContent","dataUrl","getIntersection","_setCanvasSize","_mouseover","_setPointerPosition","_mouseout","targetShape","_mousemove","_touchmove","_mousedown","_touchstart","clickStartShape","_mouseup","_touchend","clickEndShape","fireDblClick","justDragged","_contextmenu","tapStartShape","_wheel","contentPosition","_getContentPosition","touch","getBoundingClientRect","_onContent","typesStr","BaseLayer","createPNGStream","getHitCanvas","_hitImageData","INTERSECTION_OFFSETS","INTERSECTION_OFFSETS_LEN","Layer","____init","intersectionOffset","spiralSearchDistance","continueSearch","_getIntersection","antialiased","_getImageData","p3","getClearBeforeDraw","enableHitGraph","setHitGraphEnabled","disableHitGraph","FastLayer","Group","performance","FRAF","RAF","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","requestAnimFrame","Animation","Anim","animIdCounter","frame","timeDiff","lastTime","lays","addLayer","isRunning","animations","stop","_addAnimation","_removeAnimation","_updateFrameObject","frameRate","animRunning","_handleAnimation","_runFrames","layersLen","layerHash","_animationLoop","batchDraw","batchAnim","blacklist","easing","onFinish","yoyo","colorAttrs","Tween","propFunc","finish","_pos","_change","prevPos","_time","_position","_startTime","_finish","pause","setTime","play","getTimer","onEnterFrame","seek","nodeId","Easings","Linear","tween","_tweenFunc","_addListeners","tweens","_addAttr","onReset","diff","tweenId","trueEnd","trueStart","closed","endRGBA","onPlay","onReverse","onPause","thisId","to","BackEaseIn","BackEaseOut","BackEaseInOut","ElasticEaseIn","asin","ElasticEaseOut","ElasticEaseInOut","BounceEaseOut","BounceEaseIn","BounceEaseInOut","EaseIn","EaseOut","EaseInOut","StrongEaseIn","StrongEaseOut","StrongEaseInOut","dirty","_drag","startPointerPos","_setDragPosition","_endDragBefore","dragEndNode","_endDragAfter","startDrag","ap","stopDrag","dbf","getDragBoundFunc","newNodePos","_lastPos","setDraggable","draggable","_dragChange","origRemove","_listenDrag","_dragCleanup","html","Rect","_sceneFunc","cornerRadius","getCornerRadius","PIx2","Circle","getRadius","setRadius","Ellipse","rx","getRadiusX","ry","getRadiusY","Ring","getInnerRadius","getOuterRadius","outerRadius","setOuterRadius","Wedge","getClockwise","getAngleDeg","setAngleDeg","Arc","clockwise","_hitFunc","cropWidth","cropHeight","image","getImage","getCropWidth","getCropHeight","getCropX","getCropY","fromURL","dummyContext","AUTO","JUSTIFY","NORMAL","ATTR_CHANGE_LIST","attrChangeListLen","getDummyContext","partialText","fillLinearGradientColorStops","fillRadialGradientColorStops","_setTextData","getPadding","textHeight","getTextHeight","lineHeightPx","getLineHeight","textArr","textArrLen","align","getAlign","totalWidth","letterSpacing","getLetterSpacing","textDecoration","fontSize","_getContextFont","lineWidth","strokeStyle","spacesNumber","letter","_getTextSize","setText","getTextWidth","textWidth","metrics","getFontSize","getFontStyle","getFontFamily","getFontVariant","_addTextLine","_getTextWidth","latterSpacing","getText","fixedWidth","fixedHeight","maxWidth","maxHeightPx","currentHeightPx","getWrap","shouldWrap","wrapAtWord","matchWidth","substrWidth","wrapIndex","Line","tp","getPoints","getTension","getClosed","bezier","getBezier","getTensionPoints","_getTensionPoints","_getTensionPointsClosed","firstControlPoints","lastControlPoints","middle","Sprite","_updated","updated","frameIndex","clearInterval","interval","_setInterval","getAnimation","ix4","getAnimations","offsets","frameOffsets","ix2","_updateIndex","getFrameRate","getIndex","setIndex","Path","dataArray","parsePathData","dTheta","psi","fs","getLineLength","getPointOnLine","P1x","P1y","P2x","P2y","fromX","fromY","run","rise","ix","iy","pRise","pRun","getPointOnCubicBezier","pct","P3x","P3y","P4x","P4y","CB1","CB2","CB3","CB4","getPointOnQuadraticBezier","QB1","QB2","QB3","getPointOnEllipticalArc","cosPsi","sinPsi","cs","cpx","cpy","prevCmd","ctlPtx","ctlPty","cmd","startX","startY","convertEndpointToCenterParameterization","pathLength","calcLength","inc","psiDeg","xp","lambda","cxp","cyp","vMag","vRatio","vAngle","acos","TextPath","dummyCanvas","getTextBaseline","glyphInfo","p0","textFullWidth","fullPathWidth","pathCmd","charArr","pIndex","currentT","getNextPathSegment","pathData","j","findSegmentToFitCharacter","glyphWidth","currLen","attempts","cumulativePathLength","needNewSegment","midpoint","transposeX","transposeY","info","RegularPolygon","sides","Star","innerRadius","numPoints","Label","_sync","pointerDirection","pointerWidth","pointerHeight","getPointerDirection","getPointerWidth","getPointerHeight","Tag","Arrow","PI2","radians","pointerLength","pointerAtBeginning","_from","_from2","arr2","_getPrototypeOf2","_getOwnPropertyDescriptor2","receiver","objA","objB","compareContext","keysA","keysB","bHasOwnProperty","valueA","valueB","defined","TO_STRING","block","MakeException","RuntimeError","Merge","Min","Max","RoundN","MidLine","mid_line","SortAndUnique","cmp","newArr","Contains","getCanvasContext","canvas_sel","drawDot","setFillStyle","BM","start_time","elapsed","StackTrace","Prefix","Fraction","GCD","LCM","LCMM","arg0","numerator","denominator","simplify","gcd","param1","param2","otherNumerator","otherDenominator","lcm","equals","__compareA","__compareB","greaterThan","greaterThanEquals","lessThan","lessThanEquals","quotient","fraction","toSimplifiedString","__tmp","toMixedString","setIndexValue","elem","Registry","INDEXES","enableDefaultRegistry","registry","defaultRegistry","getDefaultRegistry","disableDefaultRegistry","class","updateIndex","oldValue","register","onRegister","getElementsByAttribute","attrName","getElementsByType","getElementsByClass","onUpdate","Element","newID","ID","classes","boundingBox","setStyle","getStyle","applyStyle","setShadowColor","setShadowBlur","fillStyle","setStrokeStyle","setLineWidth","restoreStyle","drawWithStyle","checkContext","hasClass","addClass","removeClass","isRendered","setRendered","getAttributes","getBoundingBox","BoundingBoxComputation","NaN","addPoint","addX","addY","addQuadraticCurve","p0x","p0y","p1x","p1y","p2x","p2y","cp1x","cp1y","cp2x","cp2y","addBezierCurve","p3x","p3y","b2ac","t1","t2","BoundingBox","getW","getH","setW","setH","new_x","new_y","new_w","new_h","Font","processOutline","outline","originX","originY","outlineFns","nextX","nextY","Glyph","loadMetrics","glyphs","x_min","x_max","cached_outline","renderGlyph","x_pos","y_pos","nocache","resolution","renderOutline","getOutlineBoundingBox","bboxComp","x_shift","y_shift","originShift","setOptions","setPoint","setXShift","setYShift","bbox","getMetrics","setOriginX","xShift","setOriginY","yShift","setOrigin","renderToStave","getYForGlyphs","STEM_WIDTH","STEM_HEIGHT","STAVE_LINE_THICKNESS","RESOLUTION","DEFAULT_NOTATION_FONT_SCALE","DEFAULT_TABLATURE_FONT_SCALE","SLASH_NOTEHEAD_WIDTH","TEXT_HEIGHT_OFFSET_HACK","IsKerned","clefProperties","line_shift","octave_shift","note_values","int_value","int_val","shift_right","extraProps","glyph_name","customNoteHeads","displaced","stem_up_x_offset","stem_down_x_offset","stem_up_y_offset","stem_down_y_offset","integerToNote","integer","noteValue","tabToGlyph","shift_y","glyphMetrics","articulationCodes","artic","between_lines","accidentalCodes","parenRightPaddingAdjustment","accidentalColumnsTable","second_on_bottom","spaced_out_tetrachord","spaced_out_pentachord","very_spaced_out_pentachord","spaced_out_hexachord","very_spaced_out_hexachord","ornamentCodes","ornaments","keySpec","accidentalList","acc_list","unicode","parseNoteDurationString","durationString","dots","parseNoteStruct","noteStruct","durationStringData","ticks","durationToTicks","customTypes","getGlyphProps","validTypes","currentTicks","sanitizeDuration","alias","durationAliases","durationToFraction","durationToNumber","duration_codes","glyphTypeProperties","customGlyphTypeProperties","code_head","common","stem","stem_offset","flag","stem_up_extension","stem_down_extension","tabnote_stem_up_extension","tabnote_stem_down_extension","dot_shiftY","line_above","line_below","beam_count","code_flag_upstem","code_flag_downstem","smufl","to_code_points","bracketTop","bracketBottom","barlineTick","segno","coda","gClef","cClef","fClef","unpitchedPercussionClef1","timeSig0","timeSig1","timeSig2","timeSig3","timeSig4","timeSig5","timeSig6","timeSig7","timeSig8","timeSig9","timeSigCommon","timeSigCutCommon","noteheadDoubleWhole","noteheadWhole","noteheadHalf","noteheadBlack","noteheadXWhole","noteheadXHalf","noteheadXBlack","noteheadCircleX","noteheadTriangleUpWhole","noteheadTriangleUpHalf","noteheadTriangleUpBlack","noteheadDiamondWhole","noteheadDiamondHalf","noteheadDiamondBlack","augmentationDot","tremolo1","flag8thUp","flag8thDown","flag16thUp","flag16thDown","flag32ndUp","flag32ndDown","flag64thUp","flag64thDown","flag128thUp","flag128thDown","accidentalFlat","accidentalNatural","accidentalSharp","accidentalDoubleSharp","accidentalDoubleFlat","accidentalParensLeft","accidentalParensRight","accidentalQuarterToneFlatStein","accidentalThreeQuarterTonesFlatZimmermann","accidentalQuarterToneSharpStein","accidentalThreeQuarterTonesSharpStein","accidentalBuyukMucennebFlat","accidentalBakiyeFlat","accidentalKomaSharp","accidentalKucukMucennebSharp","accidentalKoron","accidentalSori","articAccentAbove","articAccentBelow","articTenutoAbove","articTenutoBelow","articStaccatoAbove","articStaccatoBelow","articStaccatissimoAbove","articMarcatoAbove","fermataAbove","fermataBelow","breathMarkComma","breathMarkUpbow","caesura","caesuraCurved","restMaxima","restDoubleWhole","restWhole","restHalf","restQuarter","rest8th","rest16th","rest32nd","rest64th","rest128th","dynamicPiano","dynamicMezzo","dynamicForte","dynamicRinforzando","dynamicSforzando","dynamicZ","ornamentTrill","ornamentTurn","ornamentTurnSlash","ornamentMordent","ornamentMordentInverted","ornamentTremblement","ornamentPrecompAppoggTrill","ornamentPrecompSlideTrillDAnglebert","ornamentPrecompSlideTrillBach","ornamentPrecompTrillSuffixDandrieu","ornamentPrecompDoubleCadenceUpperPrefix","ornamentPrecompDoubleCadenceUpperPrefixTurn","ornamentPrecompTrillLowerSuffix","stringsDownBow","stringsUpBow","stringsHarmonic","pluckedSnapPizzicatoAbove","pluckedLeftHandPizzicato","keyboardPedalPed","keyboardPedalUp","pictChokeCymbal","wiggleArpeggiatoUp","arrowheadBlackUp","arrowheadBlackDown","num_beats","beat_value","CanvasContext","WIDTH","HEIGHT","CANVAS_BROWSER_SIZE_LIMIT","SanitizeCanvasDims","vexFlowCanvasContext","openGroup","closeGroup","setRawFont","setBackgroundFillStyle","background_fillStyle","setLineCap","cap_type","lineDash","startAngle","endAngle","antiClockwise","glow","RaphaelContext","paper","Raphael","pen","font_family","font_weight","attributes","background_attributes","shadow_attributes","state_stack","setViewBox","viewBox","normalizeAngle","tmp","arcHelper","largeArcFlag","sweepFlag","out","num_paths","toFixed","txt","getBBox","attrNamesToIgnoreMap","fontAttrNamesToIgnore","SVGContext","svgNS","svg","iePolyfill","svgElementType","cls","pointerBBox","bold","italic","fontAttributes","fontArray","applyAttributes","visibleWidth","visibleHeight","xMin","yMin","viewBoxString","attrNamesToIgnore","rectangle","peth","ieMeasureTextFix","widthCorrection","lastContext","Renderer","Backends","CANVAS","RAPHAEL","SVG","VML","LineEndType","NONE","USE_CANVAS_PROXY","buildContext","elementId","backend","getRaphaelContext","getSVGContext","bolsterCanvasContext","drawDashedLine","toX","toY","dashPattern","dashLength","nx","ny","Stem","CATEGORY","x_begin","x_end","y_top","y_bottom","stem_extension","isStemlet","stemletHeight","renderHeightAdjustment","setNoteHeadXBounds","setDirection","setExtension","ext","getExtension","setYBounds","getCategory","y_offset","getExtents","isStemUp","ys","stemHeight","innerMostNoteheadY","outerMostNoteheadY","topY","baseY","setVisibility","setStemlet","stem_x","stem_y","stemletYOffset","LOCATION_TOP","LOCATION_BOTTOM","NESTING_OFFSET","beats_occupied","beatsOccupiedDeprecationWarning","notes_occupied","bracketed","ratioed","AlignRestsToNotes","resolveGlyphs","attach","setTuplet","detach","resetTuplet","setBracketed","setRatioed","setTupletLocation","getNotes","getNoteCount","msg","getBeatsOccupied","getNotesOccupied","setBeatsOccupied","beats","setNotesOccupied","numerator_glyphs","denom_glyphs","getNestedTupletCount","maxTupletCount","countTuplets","minTupletCount","tupletStack","tupletCount","getYPosition","nested_tuplet_y_offset","getStave","getYForLine","top_y","getStemDirection","getStemExtents","bottom_y","getTieLeftX","getTieRightX","getStemX","addGlyphWidth","notation_start_x","line_width","x_offset","colon_x","colon_radius","calculateStemDirection","lineSum","keyProps","keyProp","BEAM_LEFT","BEAM_BOTH","time_sig","beatTotal","beatValue","applyAndGetBeams","tickGroups","unprocessedNotes","currentTickGroup","noteGroups","currentGroup","nextTickGroup","nextGroup","unprocessedNote","shouldIgnoreTicks","ticksPerGroup","totalTicks","memo","getTicks","unbeamable","createGroups","sanitizedGroups","tempGroup","isFirstOrLast","prevNote","breaksOnEachRest","isRest","breaksOnFirstOrLastRest","breakOnStemChange","maintain_stem_directions","prevDirection","isUnbeamableDuration","sanitizeGroups","stemDirection","findFirstNote","setStemDirection","applyStemDirection","beamedNoteGroups","beamable","getIntrinsicTicks","allTuplets","uniqueTuplets","getTuplets","render_options","secondary_breaks","secondary_break_ticks","flat_beams","flat_beam_offset","hasStem","stem_weight","setBeam","postFormatted","getBeamCount","break_on_indices","beam_width","max_slope","min_slope","slope_iterations","slope_cost","stemlet_extension","partial_beam_length","min_flat_beam_offset","getGlyph","beamCount","breakSecondaryAt","getSlopeY","first_x_px","first_y_px","slope","calculateSlope","firstNote","initialSlope","lastNote","firstStemTipY","firstStemX","getStemSlope","increment","minCost","bestSlope","totalStemExtension","yShiftTemp","adjustedStemTipY","stemTipY","idealSlope","cost","calculateFlatSlope","total","extremeY","extremeBeamCount","currentExtreme","getYs","extremeTest","newOffset","getBeamYToDraw","beamY","applyStemExtensions","stemX","beamedStemTipY","preBeamExtension","getStem","beamExtension","totalBeamWidth","lookupBeamDirection","prev_tick","tick","next_tick","lookup_duration","prev_note_gets_beam","next_note_gets_beam","note_gets_beam","getBeamLines","tick_of_duration","beam_lines","beam_started","current_beam","previous_should_break","tick_tally","should_break","prev_note","next_note","beam_alone","beam_direction","last_beam","drawStems","drawBeamLines","valid_beam_durations","beamThickness","beamLines","beam_line","startBeamX","startBeamY","lastBeamX","lastBeamY","preFormat","postFormat","STRICT","FULL","resolutionMultiplier","tickables","ticksUsed","smallestTickCount","largestTickWidth","voiceGroup","getTotalTicks","getTicksUsed","getLargestTickWidth","getSmallestTickCount","getMode","getResolutionMultiplier","getActualResolution","getVoiceGroup","setVoiceGroup","setStrict","strict","isComplete","addTickable","tickable","setVoice","preFormatted","tickable_bb","drawBoldDoubleLine","topX","botY","BOLD_DOUBLE_LEFT","BOLD_DOUBLE_RIGHT","variableWidth","SINGLE_RIGHT","SINGLE_LEFT","BRACE","THIN_DOUBLE","typeString","singleRight","singleLeft","single","double","brace","bracket","boldDoubleLeft","boldDoubleRight","thinDouble","none","top_stave","bottom_stave","thickness","texts","shift_x","getNumLines","attachment_height","cpx1","cpy1","cpx2","cpy2","cpx3","cpy3","cpx4","cpy4","cpx5","cpy5","cpx6","cpy6","cpx7","cpy7","cpx8","cpy8","text_width","getBottomLineY","Tickable","intrinsicTicks","tickMultiplier","tickContext","modifierContext","modifiers","align_center","center_x_shift","formatterMetrics","freedom","right","iterations","used","deviation","getFormatterMetrics","getCenterXShift","isCenterAligned","setCenterAlignment","getVoice","getTuplet","noteCount","notesOccupied","applyTickMultiplier","addToModifierContext","mod","getModifiers","setTickContext","setIntrinsicTicks","getTickMultiplier","Note","STAVEPADDING","plotMetrics","yPos","getAbsoluteX","modLeftPx","extraLeftPx","xPre1","xAbs","xPost1","noteWidth","xPost2","extraRightPx","modRightPx","xFreedomRight","xWidth","getXShift","spaceDeviation","initStruct","noteType","duration_override","customGlyphs","playNote","left_modPx","right_modPx","annotation_spacing","stave_padding","getPlayNote","setNote","setPreFormatted","setYs","getExtraLeftPx","getExtraRightPx","setExtraLeftPx","setExtraRightPx","getLineNumber","getLineForRest","getGlyphWidth","glyph_font_scale","getYForTopText","text_line","getTickContext","getDuration","isDotted","getDots","getNoteType","setModifierContext","getModifierStartXY","left_shift","right_shift","extra","getExtraPx","NoteHead","head_options","note_type","STEM_UP","glyph_code","custom_glyph_code","custom_glyph","slashed","stroke_px","isDisplaced","getLine","displacementStemAdjustment","spacing","getSpacingBetweenLines","half_spacing","min_y","getYForNote","head_x","staveSpace","breve_lines","drawSlashNoteHead","StemmableNote","note_struct","stemExtensionOverride","setStem","buildStem","buildFlag","shouldRenderFlag","flagCode","getTopGlyph","getStemLength","getStemExtension","getStemMinumumLength","getCenterGlyphX","setStemLength","textLine","extents","getYForBottomText","hasFlag","drawStem","stem_struct","PositionString","above","below","modifier_context","spacingFromNextModifier","getNote","getModifierContext","setTextLine","setSpacingFromNextModifier","getSpacingFromNextModifier","alignSubNotesWithNote","subNotes","extraPx","subNoteXOffset","extraLeft","subNote","subTickContext","setXOffset","Dot","dot_list","max_shift_map","getKeyProps","note_id","dot_shift","x_width","prev_dotted_space","half_shiftY","setDotShiftY","lineSpace","spacing_between_lines_px","forceFlagRight","shiftRestVertical","isrest","maxLine","minLine","setKeyLine","getKeyLine","STEM_DOWN","DEFAULT_LEDGER_LINE_OFFSET","formatByY","notesList","minL","stemMax","stemMin","maxL","voice_shift","getVoiceShiftWidth","is_displaced","noteU","noteM","noteL","voiceXShift","stemDelta","lineSpacing","centerRest","hasStave","topNote","bottomNote","topKeys","bottomKeys","HALF_NOTEHEAD_HEIGHT","topNoteBottomY","use_default_head_x","note_heads","calculateKeyProps","autoStem","noteHeadStyles","noteHead","buildNoteHeads","calcExtraPx","lastLine","lineDiff","noteProps","notehead","halfLineSpacing","frac","isTopNote","resultLine","thisLine","isChord","getNoteHeadBounds","setNoteDisplaced","tieStartX","tieEndX","restLine","bot","isInnerNoteIndex","setStemStyle","getStemStyle","setLedgerLineStyle","ledgerLineStyle","getLedgerLineStyle","setFlagStyle","flagStyle","getFlagStyle","setKeyStyle","mContext","annotation","getAccidentals","yTop","yBottom","nonDisplacedX","displacedX","highestLine","lowestLine","highestDisplacedLine","lowestDisplacedLine","highestNonDisplacedLine","lowestNonDisplacedLine","displaced_x","non_displaced_x","highest_line","lowest_line","highest_displaced_line","lowest_displaced_line","highest_non_displaced_line","lowest_non_displaced_line","getNoteHeadBeginX","getNoteHeadEndX","drawLedgerLines","doubleWidth","min_x","drawLedgerLine","normal","ledgerWidth","drawModifiers","noteheadStyle","drawFlag","noteStemHeight","flagX","flagY","drawNoteHeads","stemStruct","xBegin","shouldRenderStem","nums","nums_list","shiftLeft","shiftRight","props_tmp","shiftL","shiftR","numShiftL","numShiftR","xWidthL","xWidthR","num_shift","numWidth","finger","setFretHandFinger","setOffsetX","setOffsetY","dot_x","dot_y","NUM_TONES","roots","root_values","root_indices","canonical_notes","diatonic_intervals","diatonic_accidentals","intervals","scales","major","dorian","mixolydian","minor","scaleTypes","noteValues","root_index","isValidNoteValue","isValidIntervalValue","noteString","getKeyParts","keyString","getNoteValue","getIntervalValue","intervalString","getCanonicalNoteName","getCanonicalIntervalName","intervalValue","getRelativeNoteValue","getRelativeNoteName","rootValue","reverse_interval","relativeNoteName","getScaleTones","tones","nextNote","getIntervalBetween","note1","note2","createScaleMap","keySigParts","scaleName","keySigString","noteLocation","scaleMap","rootName","noteName","leftShift","accList","propsTemp","accLine","lineList","accShift","previousLine","flatLine","dblSharpLine","numAcc","totalColumns","noFurtherConflicts","groupStart","groupEnd","checkCollision","getGroupLine","getGroupLines","lineDifference","indexA","indexB","item","notColliding","indexPairs","groupLength","groupMember","column","endCase","patternLength","collisionDetected","columnWidths","columnXOffsets","totalShift","accCount","lastAccOnLine","line1","line2","clearance","clearanceRequired","collision","applyAccidentals","tickPositions","tickNoteMap","tickPosition","notesAtPosition","music","modifiedPitches","processNote","keyIndex","accidentalString","pitch","sameAccidental","previouslyModified","getGraceNotes","font_scale","parenLeftPadding","parenRightPadding","cautionary","parenLeft","parenRight","fontScale","parenWidth","accX","accY","NoteSubGroup","getMinTotalWidth","cp1","cp2","text_shift_x","first_x_shift","last_x_shift","tie_spacing","setNotes","renderTie","first_ys","last_ys","last_x_px","cp_x","last_y_px","top_cp_y","bottom_cp_y","renderText","center_x","getTieStartX","getTieEndX","createHammeron","createPulloff","GraceNoteGroup","gracenote_groups","group_list","gracenote_group","is_stavenote","formatWidth","group_shift","grace_notes","show_slur","slur","slur_y_shift","beamNotes","graceNote","TieClass","ARPEGGIO_DIRECTIONLESS","strokes","strokeList","strokeShift","all_voices","note_end","stroke_spacing","addEndNote","line_space","arrow","arrow_shift_x","arrow_y","text_y","shift_left","num_shiftL","num_shiftR","x_widthL","x_widthR","num_width","string_number","dashed","leg","setLineEndType","setStringNumber","setLastNote","setDashed","stem_ext","bottom","roundToNearestHalf","mathFn","isWithinLines","getRoundingFunction","isStaveNote","noteCategory","INITIAL_OFFSET","getIncrement","top_text_line","articWidth","easyScoreHook","builder","articNameToCode","staccato","tenuto","articString","getFactory","canSitBetweenLines","staffSpace","isTab","shouldSitOutsideStaff","initialOffset","isOnStemTip","getInitialOffset","stemBaseY","getTopY","getBottomY","offsetDirection","noteLine","articLine","snappedLine","snapLineToStaff","TickContext","getNextContext","tContext","contexts","tContexts","currentTick","maxTicks","minTicks","xBase","xOffset","notePx","getXBase","setXBase","getXOffset","setPadding","getMaxTicks","getMinTicks","getCenterAlignedTickables","getCurrentTick","setCurrentTick","extraRight","Ornament","ornament","delayed","accidentalUpper","accidentalLower","accidentalLowerPadding","accidentalUpperPadding","setDelayed","setUpperAccidental","accid","setLowerAccidental","stemDir","stemExtents","isPlacedOnNoteheadSide","glyphYBetweenLines","glyphX","glyphY","delayXShift","nextContext","Justify","CENTER_STEM","JustifyString","center","centerStem","VerticalJustifyString","vert_justification","getJustification","text_height","has_stem","stem_base","bends","last_width","release","line_style","bend_width","release_width","updateWidth","measure_text","total_width","additional_width","draw_width","bend_height","annotation_y","renderBend","cp_y","renderRelease","renderArrowHead","render_x","last_bend","last_drawn_width","vibratos","vibrato","harsh","vibrato_width","wave_height","wave_width","wave_girth","setVibratoWidth","vx","vy","renderVibrato","num_waves","ModifierContext","PREFORMAT","POSTFORMAT","getState","formatted","extra_left_px","extra_right_px","lookAhead","nextRestLine","createContexts","ContextType","addToContext","tickToContextMap","tickList","integerTicks","newContext","SimpleFormat","paddingBetween","plotDebugging","xPos","contextGaps","gaps","gap","lossHistory","loss","FormatAndDraw","auto_beam","FormatAndDrawTab","tabstave","tabnotes","autobeam","notevoice","tabvoice","alignAllNotes","alignTuplets","minTotalWidth","hasMinTotalWidth","tickContexts","modiferContexts","alignRests","preCalculateMinTotalWidth","createTickContexts","contextList","contextMap","createModifierContexts","justifyWidth","renderingContext","centerX","leftoverPxPerTick","spaceAccum","prevTick","prevContext","prevMetrics","insideRightEdge","insideLeftEdge","durationStats","leftNoteEdge","rightNote","rightMetrics","stats","updateStats","totalDeviation","totalCost","tune","prev","minShift","postFormatContexts","getNoteEndX","StaveModifier","BEGIN","layoutMetrics","makeSpacer","placeGlyphOnLine","setLayoutMetrics","getLayoutMetrics","repeatBegin","repeatEnd","repeatBoth","widths","paddings","layoutMetricsMap","xMax","paddingLeft","paddingRight","drawVerticalBar","drawVerticalEndBar","drawRepeatBar","double_bar","getTopLineTopY","getBottomLineBottomY","Repetition","CODA_LEFT","CODA_RIGHT","SEGNO_LEFT","SEGNO_RIGHT","DC","DC_AL_CODA","DC_AL_FINE","DS","DS_AL_CODA","DS_AL_FINE","FINE","symbol_type","setShiftX","setShiftY","drawCodaFixed","drawSymbolText","drawSignoFixed","num_lines","draw_coda","text_x","symbol_x","vertical_bar_width","StaveSection","section","setStaveSection","StaveTempo","bpm","stem_height","GLYPHS","text_struct","superscript","subscript","glyph_type","glyph_struct","StaveText","setStaveText","Clef","sizes","attachments","anno_dict","attachment","glyphScale","glyphOffset","numLines","getOptions","KeySignature","accidentalSpacing","cancelKeySpec","alterKeySpec","setKeySig","glyphFontScale","xPositions","paddingForced","convertToGlyph","nextAcc","accGlyphData","extraWidth","xPosition","cancelKey","convertToCancelAccList","cancel_accList","different_types","naturals","cancelled","addToStave","convertAccLines","customLines","alterKey","convertToAlterAccList","firstAccidentalType","cancelAccList","endClef","TimeSignature","timeSpec","customPadding","validate_args","topLine","bottomLine","setTimeSig","timeSig","parseTimeSpec","numbers","assertIsValidFraction","topDigits","botDigits","makeTimeSignatureGlyph","topGlyphs","botGlyphs","topWidth","topGlyph","botWidth","botGlyph","topStartX","botStartX","getTimeSig","Volta","MID","BEGIN_END","volta","vert_height","end_x","measure","glyph_spacing_px","fill_style","right_bar","space_above_staff_ln","space_below_staff_ln","top_text_position","resetLines","BARTYPE","addEndModifier","line_config","bottom_text_position","begBarline","setMeasure","getModifierXShift","setRepetitionTypeLeft","setRepetitionTypeRight","setVoltaType","number_t","setSection","headroom","getLineForY","setBegBarType","setClef","clefSpec","clefs","setEndClef","keySignatures","setEndKeySignature","setTimeSignature","timeSignatures","setEndTimeSignature","addEndClef","addEndTimeSignature","addTrebleGlyph","category","sortByCategory","items","endBarline","begModifiers","endModifiers","barlines","keysignatures","timesignatures","lastBarlineIdx","drawVertical","isDouble","drawVerticalFixed","top_line","bottom_line","drawVerticalBarFixed","getConfigForLines","setConfigForLine","line_number","setConfigForLines","lines_configuration","tab_options","tab_struct","draw_stem","ghost","draw_dots","draw_stem_through_stave","stem_extension_override","getStemY","stemDownLine","stemStartLine","shouldDrawFlag","flag_x","flag_y","flag_code","drawStemThrough","stem_through","unused_strings","strings_used","getUnusedStringGroups","stem_lines","up_stem","down_stem","line_spacing","total_lines","containsLastString","containsFirstString","line_ys","isTopBound","isBottomBound","getPartialStemLines","drawPositions","tab_x","render_stem","VibratoBracket","bracket_data","stop_x","semibrave_rest","get_semibrave_rest","MultiMeasureRest","number_of_measures","show_number","number_line","number_glyph_point","padding_left","padding_right","line_thickness","serif_thickness","use_symbols","symbol_spacing","semibrave_rest_glyph_scale","xs","getXs","drawLine","sbl","serif","lineThicknessHalf","drawSymbols","n4","n2","n1","semibrave_rest_width","yMiddle","ClefNote","clef_obj","getClef","abs_x","TimeSigNote","timeSignature","SLIDE_UP","SLIDE_DOWN","createSlideUp","createSlideDown","first_fret","last_fret","slide_direction","slide_y","GraceNote","LEDGER_LINE_OFFSET","SCALE","slash","staveNoteScale","getStaveNoteScale","offsetScale","slashBBox","calcBeamedNotesSlashBBox","noteHeadBounds","defaultStemExtention","defaultOffsetY","slashStemOffset","slashBeamOffset","protrusions","beam_slope","beam_angle","atan","iPointOnBeam","slash_angle","protrusion_stem_dx","protrusion_stem_dy","protrusion_beam_dx","protrusion_beam_dy","stem0X","stemY","GraceTabNote","tuningString","noteToInteger","tuningValues","numStrings","getValueForString","stringNum","getValueForFret","fretNum","stringValue","StaveHairpin","CRESC","DECRESC","FormatByTicksAndDraw","ppt","pixelsPerTick","l_shift_px","left_shift_ticks","r_shift_px","right_shift_ticks","hairpin_options","left_shift_px","right_shift_px","setRenderOptions","hairpin","renderHairpin","dis","first_y","staff_height","l_shift","r_shift","last_x","first_x","Curve","NEAR_HEAD","NEAR_TOP","nearHead","nearTop","position_end","cps","renderCurve","cp_spacing","metric","end_metric","TextDynamics","sequence","glyph_font_size","glyph_data","letter_x","current_letter","drawArrowHead","StaveLine","TextVerticalPosition","TextJustification","line_dash","rounded_end","draw_start_arrow","draw_end_arrow","arrowhead_length","arrowhead_angle","text_position_vertical","text_justification","applyLineStyle","applyFontStyle","start_position","end_position","first_index","upwards_slope","notehead_width","point1","point2","both_arrows","distance","end_y","start_y","line_angle","angle1","angle2","top_x","bottom_x","drawArrowLine","vertical_position","drawPedalGlyph","PedalMarking","Styles","TEXT","MIXED","StylesString","mixed","createSustain","createSostenuto","pedal","setCustomText","createUnaCorda","custom_depress_text","custom_release_text","bracket_height","text_margin_right","bracket_line_width","glyph_point_size","depress","drawBracketed","prev_x","prev_y","is_pedal_depressed","next_is_same","prev_is_same","drawText","TextBracket","Positions","show_bracket","underline_superscript","main_width","main_height","super_y","superscript_width","super_height","line_y","barline","parameter","Tremolo","YOFFSETSTEMUP","YOFFSETSTEMDOWN","XOFFSETSTEMUP","XOFFSETSTEMDOWN","y_spacing","Crescendo","decrescendo","extend_left","extend_right","setDecrescendo","decresc","tick_context","next_context","begin_x","half_height","flattenMatches","matchedString","grammar","errorPos","expect","matchFail","returnPos","matchSuccess","matchToken","noSpace","success","incrementPos","expectOne","rule","maybe","allMatches","oneMatch","localPos","gotOne","numMatches","expectOneOrMore","expectZeroOrMore","oneOrMore","zeroOrMore","EasyScore","Grammar","LINE","PIECE","PIECES","EOL","CHORDORNOTE","PARAMS","commitPiece","COMMA","DURATION","DOTS","OPTS","CHORD","SINGLENOTE","LPAREN","NOTES","RPAREN","NOTE","NOTENAME","ACCIDENTAL","OCTAVE","addSingleNote","ACCIDENTALS","DOT","setNoteDots","SLASH","MAYBESLASH","TYPES","setNoteType","DURATIONS","setNoteDuration","LBRACKET","KEYVAL","KEYVALS","RBRACKET","KEY","EQUALS","VAL","addNoteOption","unquote","SVAL","DVAL","Builder","factory","commitHooks","elements","rollingDuration","resetPiece","getElements","addCommitHook","commitHook","piece","addNote","accids","setClass","throwOnError","voiceOptions","setDefaults","default_options","face","newFromElementId","renderQ","systems","initRenderer","getVoices","ghostNote","textNoteStruct","textNote","barNote","clefNote","timeSigNote","keySigNote","vJustify","hJustify","fontFamily","Fingering","stringNumber","multimeasurerest","connector","secondaryBeamBreaks","curve","tie","vibratoBracket","textBracket","System","system","spaceBetweenStaves","debugFormatter","formatIterations","addConnector","spaceAbove","spaceBelow","debugNoteMetrics","allVoices","debugNoteMetricsYs","part","lastY","keyParts","scaleMapByValue","originalScaleMapByValue","getAccidental","scaleNote","modparts","valueNote","originalValueNote","STRINGS","FRETS","halfFret","INLAY_DOTS","CIRCLE_RADIUS","createCircularFingerShape","circleText","colors","circle","createFingerShape","nr","createNumericFingerShape","createOpenStringFingerShape","createThumbFingerShape","drawFingers","fingerState","fingerLayer","currentLeftOffset","fingersDown","setFingerPosition","handPosition","firstFretIndex","firstFret","lastFretIndex","lastFret","leftSquare","rightSquare","createHandPositionShape","setContainerSize","actualWidth","innerWidth","Fretboard","onWindowResize","timer","containerElement","needsResizing","frameCounter","addHandler","_ref2","needsDraw","previousTime","changed","offsetWidth","FretboardWrapper","_React$Component","_callSuper","_inherits","fretboard","removeHandler","destruct","React","propTypes","currentX","barWidths","totalBarWidth","VexTab","logged","setNoteColor","scoreElement","staveNotes","tabNumbers","tabChild","noteShapes","scoreChildNumber","noteShape","tabChildNumber","exc","normalizeNotes","normalizeNote","highlightNotes","highlightNote","notesBySecond","previousBar","currentPosition","currentNotes","viewportWidth","ScoreWrapper","fullBarDuration","bar","barWidth","minWidth","barCount","showNotation","showTabs","barNumber","artist","vextab","vexTabString","showVexTab","tabTuning","tabKey","baseVal","getStaveNotes","getTabNumbers","noteBBox","setBarPositions","noteStartSecond","noteEndSecond","groupNotesBySecond","clientWidth","maxPosition","lastNoteShapeBBox","noteBySecondIndex","focusPoint","nextBar","newPosition","barDurationInSeconds","performTransition","adgcTuning","pageWidth","currentKey","InfoTrack","setState","infoTrack","getCurrentInfoTrack","StripButton","_onClick","iconText","icon","openClass","isOpen","disabledClass","getIconComponent","title","dropDownClassName","VisibilityButton","_onVisibilityOptionChange","field","newVisibility","visibility","onVisibilityChanged","onChange","canPageFuns","getPagingLink","_moveNext","_movePrevious","pauseRadioElement","pauseOption","onPauseOptionChanged","LoopButton","_fromBarChanged","_toBarChanged","onLoopChanged","ev","newFromBar","newToBar","barsTo","nextLink","prevLink","barConfig","included","vertical","positonStyle","elStyle","addEventListenerWrap","Steps","prefixCls","marks","lowerBound","upperBound","dotStyle","activeDotStyle","calcPoints","_classNames","isActived","pointClassName","Marks","onClickLabel","marksKeys","markPoint","markPointIsObject","markLabel","label","isActive","markClassName","bottomStyle","marginBottom","leftStyle","msTransform","markStyle","onMouseDown","onTouchStart","Handle","_temp","clickFocused","setHandleRef","handle","handleMouseUp","setClickFocus","handleMouseDown","handleBlur","handleKeyDown","onMouseUpListener","focused","_ref3","_props","tabIndex","restProps","positionStyle","_tabIndex","onBlur","onKeyDown","role","KeyCode","MAC_ENTER","BACKSPACE","TAB","NUM_CENTER","ENTER","SHIFT","CTRL","ALT","PAUSE","CAPS_LOCK","ESC","PAGE_UP","PAGE_DOWN","HOME","PRINT_SCREEN","INSERT","DELETE","ZERO","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","QUESTION_MARK","META","WIN_KEY_RIGHT","CONTEXT_MENU","NUM_ZERO","NUM_ONE","NUM_TWO","NUM_THREE","NUM_FOUR","NUM_FIVE","NUM_SIX","NUM_SEVEN","NUM_EIGHT","NUM_NINE","NUM_MULTIPLY","NUM_PLUS","NUM_MINUS","NUM_PERIOD","NUM_DIVISION","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","NUMLOCK","SEMICOLON","DASH","PERIOD","APOSTROPHE","SINGLE_QUOTE","OPEN_SQUARE_BRACKET","BACKSLASH","CLOSE_SQUARE_BRACKET","WIN_KEY","MAC_FF_META","WIN_IME","isTextModifyingKeyEvent","isCharacterKey","isEventFromHandle","handles","isValueOutOfRange","isNotTouchEvent","getClosestPoint","maxSteps","steps","closestStep","diffs","getMousePosition","getTouchPosition","getHandleCenterPosition","coords","pageXOffset","ensureValueInRange","ensureValuePrecision","closestPoint","stepString","getPrecision","pauseEvent","getKeyboardValueMutator","increase","decrease","operations","indexToGet","keyToGet","calculateNextValue","createSlider","Component","_class","_Component","ComponentEnhancer","isVertical","handlesRefs","handlePosition","dragOffset","removeDocumentEvents","onStart","addDocumentMouseEvents","addDocumentTouchEvents","onFocus","_this$props","onEnd","onMouseUp","prevMovedHandleIndex","clickFocus","onMouseMove","sliderRef","onMove","onTouchMove","onKeyboard","onClickMarkLabel","saveSlider","slider","isPointDiffEven","_props2","onTouchMoveListener","onTouchUpListener","onMouseMoveListener","_props3","getSliderLength","pixelOffset","getSliderStart","trimAlignValue","calcValue","_props4","_props5","maximumTrackStyle","railStyle","_get$call","tracks","sliderClassName","getLowerBound","getUpperBound","onBeforeChange","onAfterChange","minimumTrackStyle","handleStyle","trackStyle","dragging","Slider","prevProps","prevState","theValue","nextValue","isNotControlled","nextState","changedValue","prevValue","calcValueByPos","startValue","startPosition","valueMutator","mutatedValue","nextProps","mergedProps","handleGenerator","_state","calcOffset","saveHandle","_trackStyle","__reactInternalSnapshotFlag","__reactInternalSnapshot","polyfill","foundWillMountName","foundWillReceivePropsName","foundWillUpdateName","newApiName","maybeSnapshot","snapshot","__suppressDeprecationWarning","_trimAlignValue","allowCross","pushable","thershold","valInRange","valNotConflict","Range","recent","currentValue","controlledState","closestBound","getClosestBound","getBoundNeedMoving","nextBounds","boundNeedMoving","isAtTheSamePoint","_getPointsCache","pointsObject","isFromKeyboardEvent","_this3","nextHandle","pushSurroundingHandles","diffToNext","pushHandle","originalValue","pushHandleOnePoint","nextPointIndex","_state2","_this4","_state3","handleClassName","_classNames2","trackClassName","descriptor","writable","_createSuper","Derived","hasNativeReflectConstruct","sham","Proxy","Super","NewTarget","ContainerRender","subClass","superClass","Constructor","protoProps","staticProps","_super","removeContainer","renderComponent","ready","getComponent","forceRender","_component","autoMount","autoDestroy","vendorPrefix","Portal","createContainer","didUpdate","_container","forceUpdate","isPointsEq","a1","a2","isAlignPoint","saveRef","ownKeys","enumerableOnly","symbols","sym","_objectSpread2","_defineProperty","getOwnPropertyDescriptors","jsCssMap","Webkit","Moz","ms","getVendorPrefix","getTransitionName","getTransformName","setTransitionProperty","transitionProperty","getComputedStyleX","matrix2d","matrix3d","forceRelayout","originalStyle","offsetHeight","css","getScroll","getScrollLeft","getScrollTop","getOffset","box","docElem","getClientPosition","isWindow","getDocument","_RE_NUM_NO_PX","RE_POS","CURRENT_STYLE","RUNTIME_STYLE","getOffsetDirection","useCssRight","useCssBottom","oppositeOffsetDirection","setLeftTop","presetH","presetV","horizontalProperty","verticalProperty","oppositeHorizontalProperty","oppositeVerticalProperty","originalTransition","originalOffset","old","preset","_dir","setTransform$1","originalXY","getComputedStyle","getPropertyValue","getTransformXY","resultXY","xy","match2d","setTransformXY","isBorderBoxFn","computedStyle","rsLeft","pixelLeft","BOX_MODELS","getPBMWidth","cssProp","domUtils","host","getWH","ex","viewportHeight","docWidth","docHeight","borderBoxValue","isBorderBox","cssBoxValue","borderBoxValueOrIsBorderBox","refWin","win","documentElementProp","compatMode","cssShow","getWHIgnoreDisplay","_key2","swap","mix","includeMargin","utils","getWindow","ignoreShake","oriOffset","oLeft","oTop","tLeft","tTop","useCssTransform","setOffset","getWindowScrollLeft","getWindowScrollTop","getOffsetParent","getParent$1","getVisibleRectForElement","alwaysByViewport","visibleRect","clientHeight","originalPosition","scrollX","scrollY","documentWidth","scrollWidth","documentHeight","scrollHeight","bodyStyle","overflowX","overflowY","innerHeight","isAncestorFixed","maxVisibleWidth","maxVisibleHeight","getRegion","outerWidth","outerHeight","getAlignOffset","region","getElFuturePos","elRegion","refNodeRegion","targetOffset","isFailX","elFuturePos","isFailY","flipOffset","convertOffset","offsetLen","normalizeOffset","doAlign","tgtRegion","isTgtRegionVisible","newOverflowCfg","fail","newElRegion","adjustX","adjustY","newPoints","newTargetOffset","isCompleteFailX","_newPoints","_newOffset","_newTargetOffset","isCompleteFailY","isStillFailX","isStillFailY","_newPoints2","resizeWidth","resizeHeight","adjustForViewport","alignElement","refNode","isTargetNotOutOfVisible","targetRegion","isOutOfVisibleRect","__getOffsetParent","__getVisibleRectForElement","isSimilarValue","val1","val2","int1","int2","getElement","getPoint","Align","forceAlign","onAlign","tgtPoint","pointInView","alignPoint","restoreFocus","monitorWindowResize","startMonitorWindowResize","reAlign","sourceRect","lastElement","currentElement","lastPoint","currentPoint","preRect","stopMonitorWindowResize","resizeHandler","bufferMonitor","bufferFn","monitorBufferTime","childrenProps","newProps","toArrayChildren","findChildInChildrenByKey","findShownChildInChildrenByKey","showProp","START_EVENT_NAME_MAP","transitionstart","WebkitTransition","MozTransition","OTransition","msTransition","WebkitAnimation","MozAnimation","OAnimation","msAnimation","END_EVENT_NAME_MAP","startEvents","endEvents","eventListener","EVENT_NAME_MAP","baseEventName","baseEvents","styleName","detectEvents","addStartEventListener","startEvent","removeStartEventListener","addEndEventListener","endEvent","removeEndEventListener","isCssAnimationSupported","Event","capitalPrefixes","prefixes","getStyleProperty","fixBrowserByTimeout","transitionDelay","transitionDuration","animationDelay","animationDuration","rcEndAnimTimeout","rcEndListener","clearBrowserBugTimeout","cssAnimation","transitionName","endCallback","nameIsObj","activeClassName","active","nodeClasses","rcAnimTimeout","setTransition","isAppearSupported","transitionAppear","appear","isEnterSupported","transitionEnter","enter","isLeaveSupported","transitionLeave","leave","allowAppearCallback","allowEnterCallback","allowLeaveCallback","transitionMap","AnimateChild","animationType","finishCallback","stopper","activeName","defaultKey","getChildrenFromProps","Animate","_initialiseProps","currentlyAnimatingKeys","keysToEnter","keysToLeave","childrenRefs","performAppear","nextChildren","exclusive","nextChildrenPending","currentChildren","newChildren","currentChild","nextChild","newChild","hasPrev","showInNext","hasNext","showInNow","performEnter","performLeave","stateChildren","passedProps","componentProps","isAnimate","onEnter","onLeave","onAppear","_this5","componentWillEnter","handleDoneAdding","componentWillAppear","isValidChildByKey","componentWillLeave","handleDoneLeaving","c1","c2","same","child2","LazyRenderBox","hiddenClassName","PopupInner","onMouseEnter","onMouseLeave","Popup","stretchChecked","targetWidth","targetHeight","savePopupRef","saveAlignRef","rootNode","getPopupDomNode","setStretchSize","popupInstance","getMaskTransitionName","maskTransitionName","maskAnimation","currentAlignClassName","getPopupElement","getClassNameFromAlign","destroyPopupOnHide","stretch","sizeStyle","minHeight","alignInstance","popupInnerProps","getZIndexStyle","getAlignTarget","xVisible","getMaskElement","maskElement","maskTransition","getRootDomNode","popupDomNode","$ele","getTargetElement","ALL_HANDLERS","IS_REACT_16","rcTrigger","onPopupMouseDown","Trigger","popupVisible","defaultPopupVisible","prevPopupVisible","fireEvents","afterPopupVisibleChange","currentDocument","clickOutsideHandler","isClickToHide","isContextMenuToShow","onDocumentClick","touchOutsideHandler","contextMenuOutsideHandler1","onContextMenuClose","contextMenuOutsideHandler2","clearOutsideHandler","clearDelayTimer","mouseDownTimeout","getPopupAlign","popupPlacement","popupAlign","builtinPlacements","placementStr","baseAlign","getAlignFromPlacement","setPopupVisible","onPopupVisibleChange","delaySetPopupVisible","delayS","delayTimer","createTwoChains","childPros","isClickToShow","showAction","hideAction","isMouseEnterToShow","isMouseLeaveToHide","isFocusToShow","_props6","isBlurToHide","_props7","forcePopupAlign","childCallback","_props8","newChildProps","onContextMenu","childrenClassName","trigger","portal","handlePortalUpdate","getPopupClassNameFromAlign","popup","popupStyle","popupClassName","popupTransitionName","popupAnimation","mouseEnterDelay","mouseLeaveDelay","focusDelay","blurDelay","getPopupContainer","maskClosable","onPopupAlign","onPopupMouseEnter","onPopupMouseLeave","focusTime","preClickTime","preTouchTime","preTime","nextVisible","_context$rcTrigger","hasPopupMouseDown","_props9","placement","getAlignPopupClassName","_props10","mouseProps","savePopup","popupContainer","autoAdjustOverflow","placements","topLeft","leftTop","topRight","rightTop","bottomRight","rightBottom","bottomLeft","leftBottom","Content","overlay","Tooltip","arrowContent","saveTrigger","overlayClassName","overlayStyle","onVisibleChange","afterVisibleChange","destroyTooltipOnHide","defaultVisible","getTooltipContainer","createSliderWithTooltip","_temp2","ComponentWrapper","visibles","handleTooltipVisibleChange","handleWithTooltip","tipFormatter","tipProps","_tipProps$prefixCls","_tipProps$overlay","_tipProps$placement","_tipProps$visible","restTooltipProps","handleStyleWithIndex","SoundButton","volume","onVolumeChanged","onCLick","PlayPauseButton","playIcon","canPlay","onRestart","hasDropDown","onPlayPause","TempoButton","_onChange","currentBpm","availableBpms","KeySelector","currentIsOriginalKey","originalKey","originalKeyClassName","onSwitchTuning","availableKeys","KeyButton","repeatsOmitted","InfoButton","infoText","indexTl","DownloadButton","_onKeyOverride","_onShowTabsOverride","_onOpenPage","_onOpenDownloadUrl","_onSwitchTuning","keyOverride","contentUrl","_openScoreUrl","DonateButton","alt","ButtonStrip","_onButtonClick","openButton","buttonType","onButtonClick","_isOpen","infoButton","onBpmChanged","onKeyChanged","soundVolume","loopVideo","videoElement","videoElementId","playing","paused","positionMs","VideoControl","loop","controls","BarControl","CenterControl","isLoading","playingNotes","getNotePosition","openStringNotes","EADG","ADGC","scoreNote","gain","SoundPlayer","currentNoteIndex","scoreNotes","getFretboardMovement","rightHand","openStringNoteIndex","currentNote","factor","titleElement","SoundFont","AudioContext","webkitAudioContext","soundFont","updatePageTitle","innerText","contentTemplate","playedOnce","barDurationToBpm","bpmToFactor","originalBpm","wantedBpm","getPauseFactor","Score","_createClass","currentKeyData","adgcKeyData","adgcKeys","useAdgcTuning","fretboardMovement","tabScore","gtag","log_analytics","event_category","event_label","partId","centerControlVisible","soundPlayer","_getStoredConfig","Storage","localStorage","_JSON$parse","fromBarIndex","toBarIndex","getStoredConfig","defaultBpm","request","json","scoreComponent","fretboardComponent","barControlComponent","getTabScore","currentTab","_onPlayPause","changes","nextToBar","availableBars","barDiff","_storeStateAndRestarTimer","_startTimer","resume","_stopTimer","startOrStop","_stopPlaying","canResume","_resumePlaying","_startPlaying","playASilentNote","_storeState","setTempoFactor","_this6","newAdgcTuning","setVolume","_restartTimer","barRange","configure","_getContent","video","videoStart","videoEnd","disableVideo","_onContentClick","_onButtonBarButtonClick","_onLoopChanged","_onPauseOptionChanged","_onVisibilityChanged","_onRestart","_onBpmChanged","_onKeyChanged","_onVolumeChanged","DisplayName","studyConainer","midimessage","listenToMidi","started","vel","onmidimessage","mm","instruments","oscillatorPlayer","defaultOptions","freq","midiToFreq","vcoType","vco","createOscillator","frequency","vca","createGain","onready","inst","loadBuffers","noteToMidi","toAbsoluteIndex","IS_INCLUDES","$this","_defineProperty2","cof","ARG","tryGet","callee","arrayIndexOf","IObject","setDesc","isExtensible","FREEZE","preventExtensions","setMeta","NEED","fastKey","getWeak","onFreeze","propIsEnumerable","test1","test2","test3","shouldUseNative","isArrayIter","createProperty","getIterFn","iter","arrayLike","aLen","mapfn","mapping","iterFn","__self","__source","_status","_result","Children","Fragment","Profiler","PureComponent","StrictMode","Suspense","act","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","startTransition","unstable_act","classof","ADSR","EMPTY","DEFAULTS","attack","decay","sustain","loopStart","loopEnd","isNum","connected","nextId","tracked","AudioBuffer","emit","createNode","onended","disconnect","env","onevent","adsr","envelope","createBufferSource","playbackRate","stopAt","scheduler","SamplePlayer","executeCommand","commands","fingerToCommands","nextCommandIndex","justInited","getAt","commandsToExecute","hasChanged","fingerWithHandPosition","_fingerWithHandPositi2","frettedFingers","thumbFinger","f1","f2","calculateHandPosition","_assign","_assign2","ObjectProto","REGEX","SEMITONES","isTonic","chroma","oct","tonicOf","regex","bitmap","core","SHARED","copyright","gOPN","windowNames","getWindowNames","b64ToUint6","nChr","sBase64","nBlocksSize","nMod3","nMod4","sB64Enc","nInLen","nOutLen","taBytes","nUint24","nOutIdx","nInIdx","__e","gOPS","isEnum","newError","valid","notation_option","error1","error2","num_strings","addBar","makeTuplets","addAnnotations","addRest","runCommand","parseCommand","parseChord","parseABC","parseFret","addTextVoice","bartext","addTextNote","createNote","setTextFont","parseStaveOptions","parseStaveElements","parseStaveText","addVoice","stripped_code","generate","__g","DESCRIPTORS","$assign","PolyfillEvent","CustomEvent","createEvent","initCustomEvent","eventConstructor","buildHiddenInput","handleClick","targetModifierKey","csrf","submit","phoenixLinkEvent","confirm","hasOwn","classNames","appendClass","parseValue","newClass","XHR","DEFAULT_TIMEOUT","options_onResponse","onResponse","verbose","getLogger","uri","unsupported_options","headers","accept","serialize","qs","multipart","boundry","encoding","multi","authorization","auth","b64_enc","username","run_xhr","req_seq","xhr","timed_out","is_cors","is_crossDomain","supports_cors","seq_id","cors_err","cors","too_late","er","timeoutTimer","did","onreadystatechange","on_state_change","withCredentials","debug","readyState","OPENED","setRequestHeader","HEADERS_RECEIVED","on_response","LOADING","on_loading","DONE","on_end","statusCode","loading","responseText","logger","formatted_logger","ajaxLocation","rurl","ajaxLocParts","h1","h2","h3","h4","bits","b64","enc","tmp_arr","requester","post","put","shortcut","couch","couch_handler","resp","reason","fails","exp","$getOwnPropertyDescriptor","sortIndex","setImmediate","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","_iterator2","_symbol2","_typeof","_setPrototypeOf2","_create2","LIBRARY","wksExt","$Symbol","$at","SAFE_CLOSING","riter","skipClosing","safe","TO_STRING_TAG","DOMIterables","NAME","$getPrototypeOf","setToStringTag","IteratorPrototype","Attributes","own","IS_FORCED","IS_GLOBAL","IS_STATIC","IS_PROTO","IS_BIND","IS_WRAP","expProto","virtual","fillStr","LETTERS","build","octStr","isDef","fn1","fn2","redefine","$iterCreate","BUGGY","KEYS","VALUES","returnThis","Base","DEFAULT","IS_SET","FORCED","getMethod","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","aFunction","voltage","_voltage","createBuffer","sampleRate","getChannelData","flat","getVoltage","endValue","_startAmount","_endAmount","_multiplier","getReleaseDuration","startAmount","endAmount","_decayFrom","_startedAt","cancelScheduledValues","setValueAtTime","linearRampToValueAtTime","setTargetAtTime","getTimeConstant","isTarget","endTime","expFalloff","valueAtTime","fromTime","toTime","truncateTime","Float32Array","schedule","isObj","getBarLength","totalLength","barIsVisible","barLength","viewPortWidth","calculatePosition","minBarIndex","maxBarIndex","allBars","repositionOnBar","barIndex","allBarLength","needsLeftAlign","lastBar","lastBarLength","leftAlignedPosition","$fails","wks","wksDefine","enumKeys","_create","gOPNExt","$GOPD","$GOPS","$DP","$JSON","_stringify","HIDDEN","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","USE_NATIVE","QObject","findChild","setSymbolDesc","protoDesc","$defineProperties","$propertyIsEnumerable","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","$set","es6Symbols","wellKnownSymbols","keyFor","useSetter","useSimple","FAILS_ON_PRIMITIVES","replacer","$replacer","warning","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","definition","globalThis","nmd"],"sourceRoot":""}