/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/dr-gantt@0.0.1/dist/bundle.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s="./src/index.js")}({"./node_modules/lit-element/lib/css-tag.js":
/*!*************************************************!*\
  !*** ./node_modules/lit-element/lib/css-tag.js ***!
  \*************************************************/
/*! exports provided: supportsAdoptingStyleSheets, CSSResult, unsafeCSS, css */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"supportsAdoptingStyleSheets\", function() { return supportsAdoptingStyleSheets; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CSSResult\", function() { return CSSResult; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unsafeCSS\", function() { return unsafeCSS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"css\", function() { return css; });\n/**\n@license\nCopyright (c) 2019 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nconst supportsAdoptingStyleSheets = ('adoptedStyleSheets' in Document.prototype) &&\n    ('replace' in CSSStyleSheet.prototype);\nconst constructionToken = Symbol();\nclass CSSResult {\n    constructor(cssText, safeToken) {\n        if (safeToken !== constructionToken) {\n            throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n        }\n        this.cssText = cssText;\n    }\n    // Note, this is a getter so that it's lazy. In practice, this means\n    // stylesheets are not created until the first element instance is made.\n    get styleSheet() {\n        if (this._styleSheet === undefined) {\n            // Note, if `adoptedStyleSheets` is supported then we assume CSSStyleSheet\n            // is constructable.\n            if (supportsAdoptingStyleSheets) {\n                this._styleSheet = new CSSStyleSheet();\n                this._styleSheet.replaceSync(this.cssText);\n            }\n            else {\n                this._styleSheet = null;\n            }\n        }\n        return this._styleSheet;\n    }\n    toString() {\n        return this.cssText;\n    }\n}\n/**\n * Wrap a value for interpolation in a css tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nconst unsafeCSS = (value) => {\n    return new CSSResult(String(value), constructionToken);\n};\nconst textFromCSSResult = (value) => {\n    if (value instanceof CSSResult) {\n        return value.cssText;\n    }\n    else if (typeof value === 'number') {\n        return value;\n    }\n    else {\n        throw new Error(`Value passed to 'css' function must be a 'css' function result: ${value}. Use 'unsafeCSS' to pass non-literal values, but\n            take care to ensure page security.`);\n    }\n};\n/**\n * Template tag which which can be used with LitElement's `style` property to\n * set element styles. For security reasons, only literal string values may be\n * used. To incorporate non-literal values `unsafeCSS` may be used inside a\n * template string part.\n */\nconst css = (strings, ...values) => {\n    const cssText = values.reduce((acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1], strings[0]);\n    return new CSSResult(cssText, constructionToken);\n};\n//# sourceMappingURL=css-tag.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-element/lib/css-tag.js?")},"./node_modules/lit-element/lib/decorators.js":
/*!****************************************************!*\
  !*** ./node_modules/lit-element/lib/decorators.js ***!
  \****************************************************/
/*! exports provided: customElement, property, query, queryAll, eventOptions */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"customElement\", function() { return customElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return property; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"query\", function() { return query; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"queryAll\", function() { return queryAll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"eventOptions\", function() { return eventOptions; });\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\nconst legacyCustomElement = (tagName, clazz) => {\n    window.customElements.define(tagName, clazz);\n    // Cast as any because TS doesn't recognize the return type as being a\n    // subtype of the decorated class when clazz is typed as\n    // `Constructor<HTMLElement>` for some reason.\n    // `Constructor<HTMLElement>` is helpful to make sure the decorator is\n    // applied to elements however.\n    // tslint:disable-next-line:no-any\n    return clazz;\n};\nconst standardCustomElement = (tagName, descriptor) => {\n    const { kind, elements } = descriptor;\n    return {\n        kind,\n        elements,\n        // This callback is called once the class is otherwise fully defined\n        finisher(clazz) {\n            window.customElements.define(tagName, clazz);\n        }\n    };\n};\n/**\n * Class decorator factory that defines the decorated class as a custom element.\n *\n * @param tagName the name of the custom element to define\n */\nconst customElement = (tagName) => (classOrDescriptor) => (typeof classOrDescriptor === 'function') ?\n    legacyCustomElement(tagName, classOrDescriptor) :\n    standardCustomElement(tagName, classOrDescriptor);\nconst standardProperty = (options, element) => {\n    // When decorating an accessor, pass it through and add property metadata.\n    // Note, the `hasOwnProperty` check in `createProperty` ensures we don't\n    // stomp over the user's accessor.\n    if (element.kind === 'method' && element.descriptor &&\n        !('value' in element.descriptor)) {\n        return Object.assign({}, element, { finisher(clazz) {\n                clazz.createProperty(element.key, options);\n            } });\n    }\n    else {\n        // createProperty() takes care of defining the property, but we still\n        // must return some kind of descriptor, so return a descriptor for an\n        // unused prototype field. The finisher calls createProperty().\n        return {\n            kind: 'field',\n            key: Symbol(),\n            placement: 'own',\n            descriptor: {},\n            // When @babel/plugin-proposal-decorators implements initializers,\n            // do this instead of the initializer below. See:\n            // https://github.com/babel/babel/issues/9260 extras: [\n            //   {\n            //     kind: 'initializer',\n            //     placement: 'own',\n            //     initializer: descriptor.initializer,\n            //   }\n            // ],\n            initializer() {\n                if (typeof element.initializer === 'function') {\n                    this[element.key] = element.initializer.call(this);\n                }\n            },\n            finisher(clazz) {\n                clazz.createProperty(element.key, options);\n            }\n        };\n    }\n};\nconst legacyProperty = (options, proto, name) => {\n    proto.constructor\n        .createProperty(name, options);\n};\n/**\n * A property decorator which creates a LitElement property which reflects a\n * corresponding attribute value. A `PropertyDeclaration` may optionally be\n * supplied to configure property features.\n *\n * @ExportDecoratedItems\n */\nfunction property(options) {\n    // tslint:disable-next-line:no-any decorator\n    return (protoOrDescriptor, name) => (name !== undefined) ?\n        legacyProperty(options, protoOrDescriptor, name) :\n        standardProperty(options, protoOrDescriptor);\n}\n/**\n * A property decorator that converts a class property into a getter that\n * executes a querySelector on the element's renderRoot.\n *\n * @ExportDecoratedItems\n */\nfunction query(selector) {\n    return (protoOrDescriptor, \n    // tslint:disable-next-line:no-any decorator\n    name) => {\n        const descriptor = {\n            get() {\n                return this.renderRoot.querySelector(selector);\n            },\n            enumerable: true,\n            configurable: true,\n        };\n        return (name !== undefined) ?\n            legacyQuery(descriptor, protoOrDescriptor, name) :\n            standardQuery(descriptor, protoOrDescriptor);\n    };\n}\n/**\n * A property decorator that converts a class property into a getter\n * that executes a querySelectorAll on the element's renderRoot.\n *\n * @ExportDecoratedItems\n */\nfunction queryAll(selector) {\n    return (protoOrDescriptor, \n    // tslint:disable-next-line:no-any decorator\n    name) => {\n        const descriptor = {\n            get() {\n                return this.renderRoot.querySelectorAll(selector);\n            },\n            enumerable: true,\n            configurable: true,\n        };\n        return (name !== undefined) ?\n            legacyQuery(descriptor, protoOrDescriptor, name) :\n            standardQuery(descriptor, protoOrDescriptor);\n    };\n}\nconst legacyQuery = (descriptor, proto, name) => {\n    Object.defineProperty(proto, name, descriptor);\n};\nconst standardQuery = (descriptor, element) => ({\n    kind: 'method',\n    placement: 'prototype',\n    key: element.key,\n    descriptor,\n});\nconst standardEventOptions = (options, element) => {\n    return Object.assign({}, element, { finisher(clazz) {\n            Object.assign(clazz.prototype[element.key], options);\n        } });\n};\nconst legacyEventOptions = \n// tslint:disable-next-line:no-any legacy decorator\n(options, proto, name) => {\n    Object.assign(proto[name], options);\n};\n/**\n * Adds event listener options to a method used as an event listener in a\n * lit-html template.\n *\n * @param options An object that specifis event listener options as accepted by\n * `EventTarget#addEventListener` and `EventTarget#removeEventListener`.\n *\n * Current browsers support the `capture`, `passive`, and `once` options. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters\n *\n * @example\n *\n *     class MyElement {\n *\n *       clicked = false;\n *\n *       render() {\n *         return html`<div @click=${this._onClick}`><button></button></div>`;\n *       }\n *\n *       @eventOptions({capture: true})\n *       _onClick(e) {\n *         this.clicked = true;\n *       }\n *     }\n */\nconst eventOptions = (options) => \n// Return value typed as any to prevent TypeScript from complaining that\n// standard decorator function signature does not match TypeScript decorator\n// signature\n// TODO(kschaaf): unclear why it was only failing on this decorator and not\n// the others\n((protoOrDescriptor, name) => (name !== undefined) ?\n    legacyEventOptions(options, protoOrDescriptor, name) :\n    standardEventOptions(options, protoOrDescriptor));\n//# sourceMappingURL=decorators.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-element/lib/decorators.js?")},"./node_modules/lit-element/lib/updating-element.js":
/*!**********************************************************!*\
  !*** ./node_modules/lit-element/lib/updating-element.js ***!
  \**********************************************************/
/*! exports provided: defaultConverter, notEqual, UpdatingElement */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultConverter\", function() { return defaultConverter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"notEqual\", function() { return notEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UpdatingElement\", function() { return UpdatingElement; });\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\nvar _a;\n/**\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\nwindow.JSCompiler_renameProperty =\n    (prop, _obj) => prop;\nconst defaultConverter = {\n    toAttribute(value, type) {\n        switch (type) {\n            case Boolean:\n                return value ? '' : null;\n            case Object:\n            case Array:\n                // if the value is `null` or `undefined` pass this through\n                // to allow removing/no change behavior.\n                return value == null ? value : JSON.stringify(value);\n        }\n        return value;\n    },\n    fromAttribute(value, type) {\n        switch (type) {\n            case Boolean:\n                return value !== null;\n            case Number:\n                return value === null ? null : Number(value);\n            case Object:\n            case Array:\n                return JSON.parse(value);\n        }\n        return value;\n    }\n};\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nconst notEqual = (value, old) => {\n    // This ensures (old==NaN, value==NaN) always returns false\n    return old !== value && (old === old || value === value);\n};\nconst defaultPropertyDeclaration = {\n    attribute: true,\n    type: String,\n    converter: defaultConverter,\n    reflect: false,\n    hasChanged: notEqual\n};\nconst microtaskPromise = Promise.resolve(true);\nconst STATE_HAS_UPDATED = 1;\nconst STATE_UPDATE_REQUESTED = 1 << 2;\nconst STATE_IS_REFLECTING_TO_ATTRIBUTE = 1 << 3;\nconst STATE_IS_REFLECTING_TO_PROPERTY = 1 << 4;\nconst STATE_HAS_CONNECTED = 1 << 5;\n/**\n * The Closure JS Compiler doesn't currently have good support for static\n * property semantics where \"this\" is dynamic (e.g.\n * https://github.com/google/closure-compiler/issues/3177 and others) so we use\n * this hack to bypass any rewriting by the compiler.\n */\nconst finalized = 'finalized';\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclassers to render updates as desired.\n */\nclass UpdatingElement extends HTMLElement {\n    constructor() {\n        super();\n        this._updateState = 0;\n        this._instanceProperties = undefined;\n        this._updatePromise = microtaskPromise;\n        this._hasConnectedResolver = undefined;\n        /**\n         * Map with keys for any properties that have changed since the last\n         * update cycle with previous values.\n         */\n        this._changedProperties = new Map();\n        /**\n         * Map with keys of properties that should be reflected when updated.\n         */\n        this._reflectingProperties = undefined;\n        this.initialize();\n    }\n    /**\n     * Returns a list of attributes corresponding to the registered properties.\n     * @nocollapse\n     */\n    static get observedAttributes() {\n        // note: piggy backing on this to ensure we're finalized.\n        this.finalize();\n        const attributes = [];\n        // Use forEach so this works even if for/of loops are compiled to for loops\n        // expecting arrays\n        this._classProperties.forEach((v, p) => {\n            const attr = this._attributeNameForProperty(p, v);\n            if (attr !== undefined) {\n                this._attributeToPropertyMap.set(attr, p);\n                attributes.push(attr);\n            }\n        });\n        return attributes;\n    }\n    /**\n     * Ensures the private `_classProperties` property metadata is created.\n     * In addition to `finalize` this is also called in `createProperty` to\n     * ensure the `@property` decorator can add property metadata.\n     */\n    /** @nocollapse */\n    static _ensureClassProperties() {\n        // ensure private storage for property declarations.\n        if (!this.hasOwnProperty(JSCompiler_renameProperty('_classProperties', this))) {\n            this._classProperties = new Map();\n            // NOTE: Workaround IE11 not supporting Map constructor argument.\n            const superProperties = Object.getPrototypeOf(this)._classProperties;\n            if (superProperties !== undefined) {\n                superProperties.forEach((v, k) => this._classProperties.set(k, v));\n            }\n        }\n    }\n    /**\n     * Creates a property accessor on the element prototype if one does not exist.\n     * The property setter calls the property's `hasChanged` property option\n     * or uses a strict identity check to determine whether or not to request\n     * an update.\n     * @nocollapse\n     */\n    static createProperty(name, options = defaultPropertyDeclaration) {\n        // Note, since this can be called by the `@property` decorator which\n        // is called before `finalize`, we ensure storage exists for property\n        // metadata.\n        this._ensureClassProperties();\n        this._classProperties.set(name, options);\n        // Do not generate an accessor if the prototype already has one, since\n        // it would be lost otherwise and that would never be the user's intention;\n        // Instead, we expect users to call `requestUpdate` themselves from\n        // user-defined accessors. Note that if the super has an accessor we will\n        // still overwrite it\n        if (options.noAccessor || this.prototype.hasOwnProperty(name)) {\n            return;\n        }\n        const key = typeof name === 'symbol' ? Symbol() : `__${name}`;\n        Object.defineProperty(this.prototype, name, {\n            // tslint:disable-next-line:no-any no symbol in index\n            get() {\n                return this[key];\n            },\n            set(value) {\n                const oldValue = this[name];\n                this[key] = value;\n                this._requestUpdate(name, oldValue);\n            },\n            configurable: true,\n            enumerable: true\n        });\n    }\n    /**\n     * Creates property accessors for registered properties and ensures\n     * any superclasses are also finalized.\n     * @nocollapse\n     */\n    static finalize() {\n        // finalize any superclasses\n        const superCtor = Object.getPrototypeOf(this);\n        if (!superCtor.hasOwnProperty(finalized)) {\n            superCtor.finalize();\n        }\n        this[finalized] = true;\n        this._ensureClassProperties();\n        // initialize Map populated in observedAttributes\n        this._attributeToPropertyMap = new Map();\n        // make any properties\n        // Note, only process \"own\" properties since this element will inherit\n        // any properties defined on the superClass, and finalization ensures\n        // the entire prototype chain is finalized.\n        if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n            const props = this.properties;\n            // support symbols in properties (IE11 does not support this)\n            const propKeys = [\n                ...Object.getOwnPropertyNames(props),\n                ...(typeof Object.getOwnPropertySymbols === 'function') ?\n                    Object.getOwnPropertySymbols(props) :\n                    []\n            ];\n            // This for/of is ok because propKeys is an array\n            for (const p of propKeys) {\n                // note, use of `any` is due to TypeSript lack of support for symbol in\n                // index types\n                // tslint:disable-next-line:no-any no symbol in index\n                this.createProperty(p, props[p]);\n            }\n        }\n    }\n    /**\n     * Returns the property name for the given attribute `name`.\n     * @nocollapse\n     */\n    static _attributeNameForProperty(name, options) {\n        const attribute = options.attribute;\n        return attribute === false ?\n            undefined :\n            (typeof attribute === 'string' ?\n                attribute :\n                (typeof name === 'string' ? name.toLowerCase() : undefined));\n    }\n    /**\n     * Returns true if a property should request an update.\n     * Called when a property value is set and uses the `hasChanged`\n     * option for the property if present or a strict identity check.\n     * @nocollapse\n     */\n    static _valueHasChanged(value, old, hasChanged = notEqual) {\n        return hasChanged(value, old);\n    }\n    /**\n     * Returns the property value for the given attribute value.\n     * Called via the `attributeChangedCallback` and uses the property's\n     * `converter` or `converter.fromAttribute` property option.\n     * @nocollapse\n     */\n    static _propertyValueFromAttribute(value, options) {\n        const type = options.type;\n        const converter = options.converter || defaultConverter;\n        const fromAttribute = (typeof converter === 'function' ? converter : converter.fromAttribute);\n        return fromAttribute ? fromAttribute(value, type) : value;\n    }\n    /**\n     * Returns the attribute value for the given property value. If this\n     * returns undefined, the property will *not* be reflected to an attribute.\n     * If this returns null, the attribute will be removed, otherwise the\n     * attribute will be set to the value.\n     * This uses the property's `reflect` and `type.toAttribute` property options.\n     * @nocollapse\n     */\n    static _propertyValueToAttribute(value, options) {\n        if (options.reflect === undefined) {\n            return;\n        }\n        const type = options.type;\n        const converter = options.converter;\n        const toAttribute = converter && converter.toAttribute ||\n            defaultConverter.toAttribute;\n        return toAttribute(value, type);\n    }\n    /**\n     * Performs element initialization. By default captures any pre-set values for\n     * registered properties.\n     */\n    initialize() {\n        this._saveInstanceProperties();\n        // ensures first update will be caught by an early access of\n        // `updateComplete`\n        this._requestUpdate();\n    }\n    /**\n     * Fixes any properties set on the instance before upgrade time.\n     * Otherwise these would shadow the accessor and break these properties.\n     * The properties are stored in a Map which is played back after the\n     * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n     * (<=41), properties created for native platform properties like (`id` or\n     * `name`) may not have default values set in the element constructor. On\n     * these browsers native properties appear on instances and therefore their\n     * default value will overwrite any element default (e.g. if the element sets\n     * this.id = 'id' in the constructor, the 'id' will become '' since this is\n     * the native platform default).\n     */\n    _saveInstanceProperties() {\n        // Use forEach so this works even if for/of loops are compiled to for loops\n        // expecting arrays\n        this.constructor\n            ._classProperties.forEach((_v, p) => {\n            if (this.hasOwnProperty(p)) {\n                const value = this[p];\n                delete this[p];\n                if (!this._instanceProperties) {\n                    this._instanceProperties = new Map();\n                }\n                this._instanceProperties.set(p, value);\n            }\n        });\n    }\n    /**\n     * Applies previously saved instance properties.\n     */\n    _applyInstanceProperties() {\n        // Use forEach so this works even if for/of loops are compiled to for loops\n        // expecting arrays\n        // tslint:disable-next-line:no-any\n        this._instanceProperties.forEach((v, p) => this[p] = v);\n        this._instanceProperties = undefined;\n    }\n    connectedCallback() {\n        this._updateState = this._updateState | STATE_HAS_CONNECTED;\n        // Ensure first connection completes an update. Updates cannot complete\n        // before connection and if one is pending connection the\n        // `_hasConnectionResolver` will exist. If so, resolve it to complete the\n        // update, otherwise requestUpdate.\n        if (this._hasConnectedResolver) {\n            this._hasConnectedResolver();\n            this._hasConnectedResolver = undefined;\n        }\n    }\n    /**\n     * Allows for `super.disconnectedCallback()` in extensions while\n     * reserving the possibility of making non-breaking feature additions\n     * when disconnecting at some point in the future.\n     */\n    disconnectedCallback() {\n    }\n    /**\n     * Synchronizes property values when attributes change.\n     */\n    attributeChangedCallback(name, old, value) {\n        if (old !== value) {\n            this._attributeToProperty(name, value);\n        }\n    }\n    _propertyToAttribute(name, value, options = defaultPropertyDeclaration) {\n        const ctor = this.constructor;\n        const attr = ctor._attributeNameForProperty(name, options);\n        if (attr !== undefined) {\n            const attrValue = ctor._propertyValueToAttribute(value, options);\n            // an undefined value does not change the attribute.\n            if (attrValue === undefined) {\n                return;\n            }\n            // Track if the property is being reflected to avoid\n            // setting the property again via `attributeChangedCallback`. Note:\n            // 1. this takes advantage of the fact that the callback is synchronous.\n            // 2. will behave incorrectly if multiple attributes are in the reaction\n            // stack at time of calling. However, since we process attributes\n            // in `update` this should not be possible (or an extreme corner case\n            // that we'd like to discover).\n            // mark state reflecting\n            this._updateState = this._updateState | STATE_IS_REFLECTING_TO_ATTRIBUTE;\n            if (attrValue == null) {\n                this.removeAttribute(attr);\n            }\n            else {\n                this.setAttribute(attr, attrValue);\n            }\n            // mark state not reflecting\n            this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_ATTRIBUTE;\n        }\n    }\n    _attributeToProperty(name, value) {\n        // Use tracking info to avoid deserializing attribute value if it was\n        // just set from a property setter.\n        if (this._updateState & STATE_IS_REFLECTING_TO_ATTRIBUTE) {\n            return;\n        }\n        const ctor = this.constructor;\n        const propName = ctor._attributeToPropertyMap.get(name);\n        if (propName !== undefined) {\n            const options = ctor._classProperties.get(propName) || defaultPropertyDeclaration;\n            // mark state reflecting\n            this._updateState = this._updateState | STATE_IS_REFLECTING_TO_PROPERTY;\n            this[propName] =\n                // tslint:disable-next-line:no-any\n                ctor._propertyValueFromAttribute(value, options);\n            // mark state not reflecting\n            this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_PROPERTY;\n        }\n    }\n    /**\n     * This private version of `requestUpdate` does not access or return the\n     * `updateComplete` promise. This promise can be overridden and is therefore\n     * not free to access.\n     */\n    _requestUpdate(name, oldValue) {\n        let shouldRequestUpdate = true;\n        // If we have a property key, perform property update steps.\n        if (name !== undefined) {\n            const ctor = this.constructor;\n            const options = ctor._classProperties.get(name) || defaultPropertyDeclaration;\n            if (ctor._valueHasChanged(this[name], oldValue, options.hasChanged)) {\n                if (!this._changedProperties.has(name)) {\n                    this._changedProperties.set(name, oldValue);\n                }\n                // Add to reflecting properties set.\n                // Note, it's important that every change has a chance to add the\n                // property to `_reflectingProperties`. This ensures setting\n                // attribute + property reflects correctly.\n                if (options.reflect === true &&\n                    !(this._updateState & STATE_IS_REFLECTING_TO_PROPERTY)) {\n                    if (this._reflectingProperties === undefined) {\n                        this._reflectingProperties = new Map();\n                    }\n                    this._reflectingProperties.set(name, options);\n                }\n            }\n            else {\n                // Abort the request if the property should not be considered changed.\n                shouldRequestUpdate = false;\n            }\n        }\n        if (!this._hasRequestedUpdate && shouldRequestUpdate) {\n            this._enqueueUpdate();\n        }\n    }\n    /**\n     * Requests an update which is processed asynchronously. This should\n     * be called when an element should update based on some state not triggered\n     * by setting a property. In this case, pass no arguments. It should also be\n     * called when manually implementing a property setter. In this case, pass the\n     * property `name` and `oldValue` to ensure that any configured property\n     * options are honored. Returns the `updateComplete` Promise which is resolved\n     * when the update completes.\n     *\n     * @param name {PropertyKey} (optional) name of requesting property\n     * @param oldValue {any} (optional) old value of requesting property\n     * @returns {Promise} A Promise that is resolved when the update completes.\n     */\n    requestUpdate(name, oldValue) {\n        this._requestUpdate(name, oldValue);\n        return this.updateComplete;\n    }\n    /**\n     * Sets up the element to asynchronously update.\n     */\n    async _enqueueUpdate() {\n        // Mark state updating...\n        this._updateState = this._updateState | STATE_UPDATE_REQUESTED;\n        let resolve;\n        let reject;\n        const previousUpdatePromise = this._updatePromise;\n        this._updatePromise = new Promise((res, rej) => {\n            resolve = res;\n            reject = rej;\n        });\n        try {\n            // Ensure any previous update has resolved before updating.\n            // This `await` also ensures that property changes are batched.\n            await previousUpdatePromise;\n        }\n        catch (e) {\n            // Ignore any previous errors. We only care that the previous cycle is\n            // done. Any error should have been handled in the previous update.\n        }\n        // Make sure the element has connected before updating.\n        if (!this._hasConnected) {\n            await new Promise((res) => this._hasConnectedResolver = res);\n        }\n        try {\n            const result = this.performUpdate();\n            // If `performUpdate` returns a Promise, we await it. This is done to\n            // enable coordinating updates with a scheduler. Note, the result is\n            // checked to avoid delaying an additional microtask unless we need to.\n            if (result != null) {\n                await result;\n            }\n        }\n        catch (e) {\n            reject(e);\n        }\n        resolve(!this._hasRequestedUpdate);\n    }\n    get _hasConnected() {\n        return (this._updateState & STATE_HAS_CONNECTED);\n    }\n    get _hasRequestedUpdate() {\n        return (this._updateState & STATE_UPDATE_REQUESTED);\n    }\n    get hasUpdated() {\n        return (this._updateState & STATE_HAS_UPDATED);\n    }\n    /**\n     * Performs an element update. Note, if an exception is thrown during the\n     * update, `firstUpdated` and `updated` will not be called.\n     *\n     * You can override this method to change the timing of updates. If this\n     * method is overridden, `super.performUpdate()` must be called.\n     *\n     * For instance, to schedule updates to occur just before the next frame:\n     *\n     * ```\n     * protected async performUpdate(): Promise<unknown> {\n     *   await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n     *   super.performUpdate();\n     * }\n     * ```\n     */\n    performUpdate() {\n        // Mixin instance properties once, if they exist.\n        if (this._instanceProperties) {\n            this._applyInstanceProperties();\n        }\n        let shouldUpdate = false;\n        const changedProperties = this._changedProperties;\n        try {\n            shouldUpdate = this.shouldUpdate(changedProperties);\n            if (shouldUpdate) {\n                this.update(changedProperties);\n            }\n        }\n        catch (e) {\n            // Prevent `firstUpdated` and `updated` from running when there's an\n            // update exception.\n            shouldUpdate = false;\n            throw e;\n        }\n        finally {\n            // Ensure element can accept additional updates after an exception.\n            this._markUpdated();\n        }\n        if (shouldUpdate) {\n            if (!(this._updateState & STATE_HAS_UPDATED)) {\n                this._updateState = this._updateState | STATE_HAS_UPDATED;\n                this.firstUpdated(changedProperties);\n            }\n            this.updated(changedProperties);\n        }\n    }\n    _markUpdated() {\n        this._changedProperties = new Map();\n        this._updateState = this._updateState & ~STATE_UPDATE_REQUESTED;\n    }\n    /**\n     * Returns a Promise that resolves when the element has completed updating.\n     * The Promise value is a boolean that is `true` if the element completed the\n     * update without triggering another update. The Promise result is `false` if\n     * a property was set inside `updated()`. If the Promise is rejected, an\n     * exception was thrown during the update.\n     *\n     * To await additional asynchronous work, override the `_getUpdateComplete`\n     * method. For example, it is sometimes useful to await a rendered element\n     * before fulfilling this Promise. To do this, first await\n     * `super._getUpdateComplete()`, then any subsequent state.\n     *\n     * @returns {Promise} The Promise returns a boolean that indicates if the\n     * update resolved without triggering another update.\n     */\n    get updateComplete() {\n        return this._getUpdateComplete();\n    }\n    /**\n     * Override point for the `updateComplete` promise.\n     *\n     * It is not safe to override the `updateComplete` getter directly due to a\n     * limitation in TypeScript which means it is not possible to call a\n     * superclass getter (e.g. `super.updateComplete.then(...)`) when the target\n     * language is ES5 (https://github.com/microsoft/TypeScript/issues/338).\n     * This method should be overridden instead. For example:\n     *\n     *   class MyElement extends LitElement {\n     *     async _getUpdateComplete() {\n     *       await super._getUpdateComplete();\n     *       await this._myChild.updateComplete;\n     *     }\n     *   }\n     */\n    _getUpdateComplete() {\n        return this._updatePromise;\n    }\n    /**\n     * Controls whether or not `update` should be called when the element requests\n     * an update. By default, this method always returns `true`, but this can be\n     * customized to control when to update.\n     *\n     * * @param _changedProperties Map of changed properties with old values\n     */\n    shouldUpdate(_changedProperties) {\n        return true;\n    }\n    /**\n     * Updates the element. This method reflects property values to attributes.\n     * It can be overridden to render and keep updated element DOM.\n     * Setting properties inside this method will *not* trigger\n     * another update.\n     *\n     * * @param _changedProperties Map of changed properties with old values\n     */\n    update(_changedProperties) {\n        if (this._reflectingProperties !== undefined &&\n            this._reflectingProperties.size > 0) {\n            // Use forEach so this works even if for/of loops are compiled to for\n            // loops expecting arrays\n            this._reflectingProperties.forEach((v, k) => this._propertyToAttribute(k, this[k], v));\n            this._reflectingProperties = undefined;\n        }\n    }\n    /**\n     * Invoked whenever the element is updated. Implement to perform\n     * post-updating tasks via DOM APIs, for example, focusing an element.\n     *\n     * Setting properties inside this method will trigger the element to update\n     * again after this update cycle completes.\n     *\n     * * @param _changedProperties Map of changed properties with old values\n     */\n    updated(_changedProperties) {\n    }\n    /**\n     * Invoked when the element is first updated. Implement to perform one time\n     * work on the element after update.\n     *\n     * Setting properties inside this method will trigger the element to update\n     * again after this update cycle completes.\n     *\n     * * @param _changedProperties Map of changed properties with old values\n     */\n    firstUpdated(_changedProperties) {\n    }\n}\n_a = finalized;\n/**\n * Marks class as having finished creating properties.\n */\nUpdatingElement[_a] = true;\n//# sourceMappingURL=updating-element.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-element/lib/updating-element.js?")},"./node_modules/lit-element/lit-element.js":
/*!*************************************************!*\
  !*** ./node_modules/lit-element/lit-element.js ***!
  \*************************************************/
/*! exports provided: defaultConverter, notEqual, UpdatingElement, customElement, property, query, queryAll, eventOptions, html, svg, TemplateResult, SVGTemplateResult, supportsAdoptingStyleSheets, CSSResult, unsafeCSS, css, LitElement */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LitElement", function() { return LitElement; });\n/* harmony import */ var lit_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-html */ "./node_modules/lit-html/lit-html.js");\n/* harmony import */ var lit_html_lib_shady_render_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-html/lib/shady-render.js */ "./node_modules/lit-html/lib/shady-render.js");\n/* harmony import */ var _lib_updating_element_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/updating-element.js */ "./node_modules/lit-element/lib/updating-element.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultConverter", function() { return _lib_updating_element_js__WEBPACK_IMPORTED_MODULE_2__["defaultConverter"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "notEqual", function() { return _lib_updating_element_js__WEBPACK_IMPORTED_MODULE_2__["notEqual"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UpdatingElement", function() { return _lib_updating_element_js__WEBPACK_IMPORTED_MODULE_2__["UpdatingElement"]; });\n\n/* harmony import */ var _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/decorators.js */ "./node_modules/lit-element/lib/decorators.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customElement", function() { return _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__["customElement"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "property", function() { return _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__["property"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "query", function() { return _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__["query"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queryAll", function() { return _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__["queryAll"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventOptions", function() { return _lib_decorators_js__WEBPACK_IMPORTED_MODULE_3__["eventOptions"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return lit_html__WEBPACK_IMPORTED_MODULE_0__["html"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return lit_html__WEBPACK_IMPORTED_MODULE_0__["svg"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TemplateResult", function() { return lit_html__WEBPACK_IMPORTED_MODULE_0__["TemplateResult"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SVGTemplateResult", function() { return lit_html__WEBPACK_IMPORTED_MODULE_0__["SVGTemplateResult"]; });\n\n/* harmony import */ var _lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/css-tag.js */ "./node_modules/lit-element/lib/css-tag.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsAdoptingStyleSheets", function() { return _lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__["supportsAdoptingStyleSheets"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CSSResult", function() { return _lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__["CSSResult"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "unsafeCSS", function() { return _lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__["unsafeCSS"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "css", function() { return _lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__["css"]; });\n\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n\n\n\n\n\n\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for LitElement usage.\n// TODO(justinfagnani): inject version number at build time\n(window[\'litElementVersions\'] || (window[\'litElementVersions\'] = []))\n    .push(\'2.2.1\');\n/**\n * Minimal implementation of Array.prototype.flat\n * @param arr the array to flatten\n * @param result the accumlated result\n */\nfunction arrayFlat(styles, result = []) {\n    for (let i = 0, length = styles.length; i < length; i++) {\n        const value = styles[i];\n        if (Array.isArray(value)) {\n            arrayFlat(value, result);\n        }\n        else {\n            result.push(value);\n        }\n    }\n    return result;\n}\n/** Deeply flattens styles array. Uses native flat if available. */\nconst flattenStyles = (styles) => styles.flat ? styles.flat(Infinity) : arrayFlat(styles);\nclass LitElement extends _lib_updating_element_js__WEBPACK_IMPORTED_MODULE_2__["UpdatingElement"] {\n    /** @nocollapse */\n    static finalize() {\n        // The Closure JS Compiler does not always preserve the correct "this"\n        // when calling static super methods (b/137460243), so explicitly bind.\n        super.finalize.call(this);\n        // Prepare styling that is stamped at first render time. Styling\n        // is built from user provided `styles` or is inherited from the superclass.\n        this._styles =\n            this.hasOwnProperty(JSCompiler_renameProperty(\'styles\', this)) ?\n                this._getUniqueStyles() :\n                this._styles || [];\n    }\n    /** @nocollapse */\n    static _getUniqueStyles() {\n        // Take care not to call `this.styles` multiple times since this generates\n        // new CSSResults each time.\n        // TODO(sorvell): Since we do not cache CSSResults by input, any\n        // shared styles will generate new stylesheet objects, which is wasteful.\n        // This should be addressed when a browser ships constructable\n        // stylesheets.\n        const userStyles = this.styles;\n        const styles = [];\n        if (Array.isArray(userStyles)) {\n            const flatStyles = flattenStyles(userStyles);\n            // As a performance optimization to avoid duplicated styling that can\n            // occur especially when composing via subclassing, de-duplicate styles\n            // preserving the last item in the list. The last item is kept to\n            // try to preserve cascade order with the assumption that it\'s most\n            // important that last added styles override previous styles.\n            const styleSet = flatStyles.reduceRight((set, s) => {\n                set.add(s);\n                // on IE set.add does not return the set.\n                return set;\n            }, new Set());\n            // Array.from does not work on Set in IE\n            styleSet.forEach((v) => styles.unshift(v));\n        }\n        else if (userStyles) {\n            styles.push(userStyles);\n        }\n        return styles;\n    }\n    /**\n     * Performs element initialization. By default this calls `createRenderRoot`\n     * to create the element `renderRoot` node and captures any pre-set values for\n     * registered properties.\n     */\n    initialize() {\n        super.initialize();\n        this.renderRoot =\n            this.createRenderRoot();\n        // Note, if renderRoot is not a shadowRoot, styles would/could apply to the\n        // element\'s getRootNode(). While this could be done, we\'re choosing not to\n        // support this now since it would require different logic around de-duping.\n        if (window.ShadowRoot && this.renderRoot instanceof window.ShadowRoot) {\n            this.adoptStyles();\n        }\n    }\n    /**\n     * Returns the node into which the element should render and by default\n     * creates and returns an open shadowRoot. Implement to customize where the\n     * element\'s DOM is rendered. For example, to render into the element\'s\n     * childNodes, return `this`.\n     * @returns {Element|DocumentFragment} Returns a node into which to render.\n     */\n    createRenderRoot() {\n        return this.attachShadow({ mode: \'open\' });\n    }\n    /**\n     * Applies styling to the element shadowRoot using the `static get styles`\n     * property. Styling will apply using `shadowRoot.adoptedStyleSheets` where\n     * available and will fallback otherwise. When Shadow DOM is polyfilled,\n     * ShadyCSS scopes styles and adds them to the document. When Shadow DOM\n     * is available but `adoptedStyleSheets` is not, styles are appended to the\n     * end of the `shadowRoot` to [mimic spec\n     * behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n     */\n    adoptStyles() {\n        const styles = this.constructor._styles;\n        if (styles.length === 0) {\n            return;\n        }\n        // There are three separate cases here based on Shadow DOM support.\n        // (1) shadowRoot polyfilled: use ShadyCSS\n        // (2) shadowRoot.adoptedStyleSheets available: use it.\n        // (3) shadowRoot.adoptedStyleSheets polyfilled: append styles after\n        // rendering\n        if (window.ShadyCSS !== undefined && !window.ShadyCSS.nativeShadow) {\n            window.ShadyCSS.ScopingShim.prepareAdoptedCssText(styles.map((s) => s.cssText), this.localName);\n        }\n        else if (_lib_css_tag_js__WEBPACK_IMPORTED_MODULE_4__["supportsAdoptingStyleSheets"]) {\n            this.renderRoot.adoptedStyleSheets =\n                styles.map((s) => s.styleSheet);\n        }\n        else {\n            // This must be done after rendering so the actual style insertion is done\n            // in `update`.\n            this._needsShimAdoptedStyleSheets = true;\n        }\n    }\n    connectedCallback() {\n        super.connectedCallback();\n        // Note, first update/render handles styleElement so we only call this if\n        // connected after first update.\n        if (this.hasUpdated && window.ShadyCSS !== undefined) {\n            window.ShadyCSS.styleElement(this);\n        }\n    }\n    /**\n     * Updates the element. This method reflects property values to attributes\n     * and calls `render` to render DOM via lit-html. Setting properties inside\n     * this method will *not* trigger another update.\n     * * @param _changedProperties Map of changed properties with old values\n     */\n    update(changedProperties) {\n        super.update(changedProperties);\n        const templateResult = this.render();\n        if (templateResult instanceof lit_html__WEBPACK_IMPORTED_MODULE_0__["TemplateResult"]) {\n            this.constructor\n                .render(templateResult, this.renderRoot, { scopeName: this.localName, eventContext: this });\n        }\n        // When native Shadow DOM is used but adoptedStyles are not supported,\n        // insert styling after rendering to ensure adoptedStyles have highest\n        // priority.\n        if (this._needsShimAdoptedStyleSheets) {\n            this._needsShimAdoptedStyleSheets = false;\n            this.constructor._styles.forEach((s) => {\n                const style = document.createElement(\'style\');\n                style.textContent = s.cssText;\n                this.renderRoot.appendChild(style);\n            });\n        }\n    }\n    /**\n     * Invoked on each update to perform rendering tasks. This method must return\n     * a lit-html TemplateResult. Setting properties inside this method will *not*\n     * trigger the element to update.\n     */\n    render() {\n    }\n}\n/**\n * Ensure this class is marked as `finalized` as an optimization ensuring\n * it will not needlessly try to `finalize`.\n *\n * Note this property name is a string to prevent breaking Closure JS Compiler\n * optimizations. See updating-element.ts for more information.\n */\nLitElement[\'finalized\'] = true;\n/**\n * Render method used to render the lit-html TemplateResult to the element\'s\n * DOM.\n * @param {TemplateResult} Template to render.\n * @param {Element|DocumentFragment} Node into which to render.\n * @param {String} Element name.\n * @nocollapse\n */\nLitElement.render = lit_html_lib_shady_render_js__WEBPACK_IMPORTED_MODULE_1__["render"];\n//# sourceMappingURL=lit-element.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-element/lit-element.js?')},"./node_modules/lit-html/directives/repeat.js":
/*!****************************************************!*\
  !*** ./node_modules/lit-html/directives/repeat.js ***!
  \****************************************************/
/*! exports provided: repeat */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; });\n/* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lit-html.js */ "./node_modules/lit-html/lit-html.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n// Helper functions for manipulating parts\n// TODO(kschaaf): Refactor into Part API?\nconst createAndInsertPart = (containerPart, beforePart) => {\n    const container = containerPart.startNode.parentNode;\n    const beforeNode = beforePart === undefined ? containerPart.endNode :\n        beforePart.startNode;\n    const startNode = container.insertBefore(Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["createMarker"])(), beforeNode);\n    container.insertBefore(Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["createMarker"])(), beforeNode);\n    const newPart = new _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["NodePart"](containerPart.options);\n    newPart.insertAfterNode(startNode);\n    return newPart;\n};\nconst updatePart = (part, value) => {\n    part.setValue(value);\n    part.commit();\n    return part;\n};\nconst insertPartBefore = (containerPart, part, ref) => {\n    const container = containerPart.startNode.parentNode;\n    const beforeNode = ref ? ref.startNode : containerPart.endNode;\n    const endNode = part.endNode.nextSibling;\n    if (endNode !== beforeNode) {\n        Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["reparentNodes"])(container, part.startNode, endNode, beforeNode);\n    }\n};\nconst removePart = (part) => {\n    Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["removeNodes"])(part.startNode.parentNode, part.startNode, part.endNode.nextSibling);\n};\n// Helper for generating a map of array item to its index over a subset\n// of an array (used to lazily generate `newKeyToIndexMap` and\n// `oldKeyToIndexMap`)\nconst generateMap = (list, start, end) => {\n    const map = new Map();\n    for (let i = start; i <= end; i++) {\n        map.set(list[i], i);\n    }\n    return map;\n};\n// Stores previous ordered list of parts and map of key to index\nconst partListCache = new WeakMap();\nconst keyListCache = new WeakMap();\n/**\n * A directive that repeats a series of values (usually `TemplateResults`)\n * generated from an iterable, and updates those items efficiently when the\n * iterable changes based on user-provided `keys` associated with each item.\n *\n * Note that if a `keyFn` is provided, strict key-to-DOM mapping is maintained,\n * meaning previous DOM for a given key is moved into the new position if\n * needed, and DOM will never be reused with values for different keys (new DOM\n * will always be created for new keys). This is generally the most efficient\n * way to use `repeat` since it performs minimum unnecessary work for insertions\n * amd removals.\n *\n * IMPORTANT: If providing a `keyFn`, keys *must* be unique for all items in a\n * given call to `repeat`. The behavior when two or more items have the same key\n * is undefined.\n *\n * If no `keyFn` is provided, this directive will perform similar to mapping\n * items to values, and DOM will be reused against potentially different items.\n */\nconst repeat = Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__["directive"])((items, keyFnOrTemplate, template) => {\n    let keyFn;\n    if (template === undefined) {\n        template = keyFnOrTemplate;\n    }\n    else if (keyFnOrTemplate !== undefined) {\n        keyFn = keyFnOrTemplate;\n    }\n    return (containerPart) => {\n        if (!(containerPart instanceof _lit_html_js__WEBPACK_IMPORTED_MODULE_0__["NodePart"])) {\n            throw new Error(\'repeat can only be used in text bindings\');\n        }\n        // Old part & key lists are retrieved from the last update\n        // (associated with the part for this instance of the directive)\n        const oldParts = partListCache.get(containerPart) || [];\n        const oldKeys = keyListCache.get(containerPart) || [];\n        // New part list will be built up as we go (either reused from\n        // old parts or created for new keys in this update). This is\n        // saved in the above cache at the end of the update.\n        const newParts = [];\n        // New value list is eagerly generated from items along with a\n        // parallel array indicating its key.\n        const newValues = [];\n        const newKeys = [];\n        let index = 0;\n        for (const item of items) {\n            newKeys[index] = keyFn ? keyFn(item, index) : index;\n            newValues[index] = template(item, index);\n            index++;\n        }\n        // Maps from key to index for current and previous update; these\n        // are generated lazily only when needed as a performance\n        // optimization, since they are only required for multiple\n        // non-contiguous changes in the list, which are less common.\n        let newKeyToIndexMap;\n        let oldKeyToIndexMap;\n        // Head and tail pointers to old parts and new values\n        let oldHead = 0;\n        let oldTail = oldParts.length - 1;\n        let newHead = 0;\n        let newTail = newValues.length - 1;\n        // Overview of O(n) reconciliation algorithm (general approach\n        // based on ideas found in ivi, vue, snabbdom, etc.):\n        //\n        // * We start with the list of old parts and new values (and\n        //   arrays of their respective keys), head/tail pointers into\n        //   each, and we build up the new list of parts by updating\n        //   (and when needed, moving) old parts or creating new ones.\n        //   The initial scenario might look like this (for brevity of\n        //   the diagrams, the numbers in the array reflect keys\n        //   associated with the old parts or new values, although keys\n        //   and parts/values are actually stored in parallel arrays\n        //   indexed using the same head/tail pointers):\n        //\n        //      oldHead v                 v oldTail\n        //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n        //   newParts: [ ,  ,  ,  ,  ,  ,  ]\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6] <- reflects the user\'s new\n        //                                      item order\n        //      newHead ^                 ^ newTail\n        //\n        // * Iterate old & new lists from both sides, updating,\n        //   swapping, or removing parts at the head/tail locations\n        //   until neither head nor tail can move.\n        //\n        // * Example below: keys at head pointers match, so update old\n        //   part 0 in-place (no need to move it) and record part 0 in\n        //   the `newParts` list. The last thing we do is advance the\n        //   `oldHead` and `newHead` pointers (will be reflected in the\n        //   next diagram).\n        //\n        //      oldHead v                 v oldTail\n        //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n        //   newParts: [0,  ,  ,  ,  ,  ,  ] <- heads matched: update 0\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldHead\n        //                                      & newHead\n        //      newHead ^                 ^ newTail\n        //\n        // * Example below: head pointers don\'t match, but tail\n        //   pointers do, so update part 6 in place (no need to move\n        //   it), and record part 6 in the `newParts` list. Last,\n        //   advance the `oldTail` and `oldHead` pointers.\n        //\n        //         oldHead v              v oldTail\n        //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n        //   newParts: [0,  ,  ,  ,  ,  , 6] <- tails matched: update 6\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldTail\n        //                                      & newTail\n        //         newHead ^              ^ newTail\n        //\n        // * If neither head nor tail match; next check if one of the\n        //   old head/tail items was removed. We first need to generate\n        //   the reverse map of new keys to index (`newKeyToIndexMap`),\n        //   which is done once lazily as a performance optimization,\n        //   since we only hit this case if multiple non-contiguous\n        //   changes were made. Note that for contiguous removal\n        //   anywhere in the list, the head and tails would advance\n        //   from either end and pass each other before we get to this\n        //   case and removals would be handled in the final while loop\n        //   without needing to generate the map.\n        //\n        // * Example below: The key at `oldTail` was removed (no longer\n        //   in the `newKeyToIndexMap`), so remove that part from the\n        //   DOM and advance just the `oldTail` pointer.\n        //\n        //         oldHead v           v oldTail\n        //   oldKeys:  [0, 1, 2, 3, 4, 5, 6]\n        //   newParts: [0,  ,  ,  ,  ,  , 6] <- 5 not in new map: remove\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    5 and advance oldTail\n        //         newHead ^           ^ newTail\n        //\n        // * Once head and tail cannot move, any mismatches are due to\n        //   either new or moved items; if a new key is in the previous\n        //   "old key to old index" map, move the old part to the new\n        //   location, otherwise create and insert a new part. Note\n        //   that when moving an old part we null its position in the\n        //   oldParts array if it lies between the head and tail so we\n        //   know to skip it when the pointers get there.\n        //\n        // * Example below: neither head nor tail match, and neither\n        //   were removed; so find the `newHead` key in the\n        //   `oldKeyToIndexMap`, and move that old part\'s DOM into the\n        //   next head position (before `oldParts[oldHead]`). Last,\n        //   null the part in the `oldPart` array since it was\n        //   somewhere in the remaining oldParts still to be scanned\n        //   (between the head and tail pointers) so that we know to\n        //   skip that old part on future iterations.\n        //\n        //         oldHead v        v oldTail\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n        //   newParts: [0, 2,  ,  ,  ,  , 6] <- stuck: update & move 2\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    into place and advance\n        //                                      newHead\n        //         newHead ^           ^ newTail\n        //\n        // * Note that for moves/insertions like the one above, a part\n        //   inserted at the head pointer is inserted before the\n        //   current `oldParts[oldHead]`, and a part inserted at the\n        //   tail pointer is inserted before `newParts[newTail+1]`. The\n        //   seeming asymmetry lies in the fact that new parts are\n        //   moved into place outside in, so to the right of the head\n        //   pointer are old parts, and to the right of the tail\n        //   pointer are new parts.\n        //\n        // * We always restart back from the top of the algorithm,\n        //   allowing matching and simple updates in place to\n        //   continue...\n        //\n        // * Example below: the head pointers once again match, so\n        //   simply update part 1 and record it in the `newParts`\n        //   array.  Last, advance both head pointers.\n        //\n        //         oldHead v        v oldTail\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n        //   newParts: [0, 2, 1,  ,  ,  , 6] <- heads matched: update 1\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance both oldHead\n        //                                      & newHead\n        //            newHead ^        ^ newTail\n        //\n        // * As mentioned above, items that were moved as a result of\n        //   being stuck (the final else clause in the code below) are\n        //   marked with null, so we always advance old pointers over\n        //   these so we\'re comparing the next actual old value on\n        //   either end.\n        //\n        // * Example below: `oldHead` is null (already placed in\n        //   newParts), so advance `oldHead`.\n        //\n        //            oldHead v     v oldTail\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6] <- old head already used:\n        //   newParts: [0, 2, 1,  ,  ,  , 6]    advance oldHead\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]\n        //               newHead ^     ^ newTail\n        //\n        // * Note it\'s not critical to mark old parts as null when they\n        //   are moved from head to tail or tail to head, since they\n        //   will be outside the pointer range and never visited again.\n        //\n        // * Example below: Here the old tail key matches the new head\n        //   key, so the part at the `oldTail` position and move its\n        //   DOM to the new head position (before `oldParts[oldHead]`).\n        //   Last, advance `oldTail` and `newHead` pointers.\n        //\n        //               oldHead v  v oldTail\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n        //   newParts: [0, 2, 1, 4,  ,  , 6] <- old tail matches new\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]   head: update & move 4,\n        //                                     advance oldTail & newHead\n        //               newHead ^     ^ newTail\n        //\n        // * Example below: Old and new head keys match, so update the\n        //   old head part in place, and advance the `oldHead` and\n        //   `newHead` pointers.\n        //\n        //               oldHead v oldTail\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n        //   newParts: [0, 2, 1, 4, 3,   ,6] <- heads match: update 3\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]    and advance oldHead &\n        //                                      newHead\n        //                  newHead ^  ^ newTail\n        //\n        // * Once the new or old pointers move past each other then all\n        //   we have left is additions (if old list exhausted) or\n        //   removals (if new list exhausted). Those are handled in the\n        //   final while loops at the end.\n        //\n        // * Example below: `oldHead` exceeded `oldTail`, so we\'re done\n        //   with the main loop.  Create the remaining part and insert\n        //   it at the new head position, and the update is complete.\n        //\n        //                   (oldHead > oldTail)\n        //   oldKeys:  [0, 1, -, 3, 4, 5, 6]\n        //   newParts: [0, 2, 1, 4, 3, 7 ,6] <- create and insert 7\n        //   newKeys:  [0, 2, 1, 4, 3, 7, 6]\n        //                     newHead ^ newTail\n        //\n        // * Note that the order of the if/else clauses is not\n        //   important to the algorithm, as long as the null checks\n        //   come first (to ensure we\'re always working on valid old\n        //   parts) and that the final else clause comes last (since\n        //   that\'s where the expensive moves occur). The order of\n        //   remaining clauses is is just a simple guess at which cases\n        //   will be most common.\n        //\n        // * TODO(kschaaf) Note, we could calculate the longest\n        //   increasing subsequence (LIS) of old items in new position,\n        //   and only move those not in the LIS set. However that costs\n        //   O(nlogn) time and adds a bit more code, and only helps\n        //   make rare types of mutations require fewer moves. The\n        //   above handles removes, adds, reversal, swaps, and single\n        //   moves of contiguous items in linear time, in the minimum\n        //   number of moves. As the number of multiple moves where LIS\n        //   might help approaches a random shuffle, the LIS\n        //   optimization becomes less helpful, so it seems not worth\n        //   the code at this point. Could reconsider if a compelling\n        //   case arises.\n        while (oldHead <= oldTail && newHead <= newTail) {\n            if (oldParts[oldHead] === null) {\n                // `null` means old part at head has already been used\n                // below; skip\n                oldHead++;\n            }\n            else if (oldParts[oldTail] === null) {\n                // `null` means old part at tail has already been used\n                // below; skip\n                oldTail--;\n            }\n            else if (oldKeys[oldHead] === newKeys[newHead]) {\n                // Old head matches new head; update in place\n                newParts[newHead] =\n                    updatePart(oldParts[oldHead], newValues[newHead]);\n                oldHead++;\n                newHead++;\n            }\n            else if (oldKeys[oldTail] === newKeys[newTail]) {\n                // Old tail matches new tail; update in place\n                newParts[newTail] =\n                    updatePart(oldParts[oldTail], newValues[newTail]);\n                oldTail--;\n                newTail--;\n            }\n            else if (oldKeys[oldHead] === newKeys[newTail]) {\n                // Old head matches new tail; update and move to new tail\n                newParts[newTail] =\n                    updatePart(oldParts[oldHead], newValues[newTail]);\n                insertPartBefore(containerPart, oldParts[oldHead], newParts[newTail + 1]);\n                oldHead++;\n                newTail--;\n            }\n            else if (oldKeys[oldTail] === newKeys[newHead]) {\n                // Old tail matches new head; update and move to new head\n                newParts[newHead] =\n                    updatePart(oldParts[oldTail], newValues[newHead]);\n                insertPartBefore(containerPart, oldParts[oldTail], oldParts[oldHead]);\n                oldTail--;\n                newHead++;\n            }\n            else {\n                if (newKeyToIndexMap === undefined) {\n                    // Lazily generate key-to-index maps, used for removals &\n                    // moves below\n                    newKeyToIndexMap = generateMap(newKeys, newHead, newTail);\n                    oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);\n                }\n                if (!newKeyToIndexMap.has(oldKeys[oldHead])) {\n                    // Old head is no longer in new list; remove\n                    removePart(oldParts[oldHead]);\n                    oldHead++;\n                }\n                else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {\n                    // Old tail is no longer in new list; remove\n                    removePart(oldParts[oldTail]);\n                    oldTail--;\n                }\n                else {\n                    // Any mismatches at this point are due to additions or\n                    // moves; see if we have an old part we can reuse and move\n                    // into place\n                    const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);\n                    const oldPart = oldIndex !== undefined ? oldParts[oldIndex] : null;\n                    if (oldPart === null) {\n                        // No old part for this value; create a new one and\n                        // insert it\n                        const newPart = createAndInsertPart(containerPart, oldParts[oldHead]);\n                        updatePart(newPart, newValues[newHead]);\n                        newParts[newHead] = newPart;\n                    }\n                    else {\n                        // Reuse old part\n                        newParts[newHead] =\n                            updatePart(oldPart, newValues[newHead]);\n                        insertPartBefore(containerPart, oldPart, oldParts[oldHead]);\n                        // This marks the old part as having been used, so that\n                        // it will be skipped in the first two checks above\n                        oldParts[oldIndex] = null;\n                    }\n                    newHead++;\n                }\n            }\n        }\n        // Add parts for any remaining new values\n        while (newHead <= newTail) {\n            // For all remaining additions, we insert before last new\n            // tail, since old pointers are no longer valid\n            const newPart = createAndInsertPart(containerPart, newParts[newTail + 1]);\n            updatePart(newPart, newValues[newHead]);\n            newParts[newHead++] = newPart;\n        }\n        // Remove any remaining unused old parts\n        while (oldHead <= oldTail) {\n            const oldPart = oldParts[oldHead++];\n            if (oldPart !== null) {\n                removePart(oldPart);\n            }\n        }\n        // Save order of new parts for next round\n        partListCache.set(containerPart, newParts);\n        keyListCache.set(containerPart, newKeys);\n    };\n});\n//# sourceMappingURL=repeat.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/directives/repeat.js?')},"./node_modules/lit-html/directives/style-map.js":
/*!*******************************************************!*\
  !*** ./node_modules/lit-html/directives/style-map.js ***!
  \*******************************************************/
/*! exports provided: styleMap */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"styleMap\", function() { return styleMap; });\n/* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lit-html.js */ \"./node_modules/lit-html/lit-html.js\");\n/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Stores the StyleInfo object applied to a given AttributePart.\n * Used to unset existing values when a new StyleInfo object is applied.\n */\nconst styleMapCache = new WeakMap();\n/**\n * A directive that applies CSS properties to an element.\n *\n * `styleMap` can only be used in the `style` attribute and must be the only\n * expression in the attribute. It takes the property names in the `styleInfo`\n * object and adds the property values as CSS propertes. Property names with\n * dashes (`-`) are assumed to be valid CSS property names and set on the\n * element's style object using `setProperty()`. Names without dashes are\n * assumed to be camelCased JavaScript property names and set on the element's\n * style object using property assignment, allowing the style object to\n * translate JavaScript-style names to CSS property names.\n *\n * For example `styleMap({backgroundColor: 'red', 'border-top': '5px', '--size':\n * '0'})` sets the `background-color`, `border-top` and `--size` properties.\n *\n * @param styleInfo {StyleInfo}\n */\nconst styleMap = Object(_lit_html_js__WEBPACK_IMPORTED_MODULE_0__[\"directive\"])((styleInfo) => (part) => {\n    if (!(part instanceof _lit_html_js__WEBPACK_IMPORTED_MODULE_0__[\"AttributePart\"]) || (part instanceof _lit_html_js__WEBPACK_IMPORTED_MODULE_0__[\"PropertyPart\"]) ||\n        part.committer.name !== 'style' || part.committer.parts.length > 1) {\n        throw new Error('The `styleMap` directive must be used in the style attribute ' +\n            'and must be the only part in the attribute.');\n    }\n    const { committer } = part;\n    const { style } = committer.element;\n    // Handle static styles the first time we see a Part\n    if (!styleMapCache.has(part)) {\n        style.cssText = committer.strings.join(' ');\n    }\n    // Remove old properties that no longer exist in styleInfo\n    const oldInfo = styleMapCache.get(part);\n    for (const name in oldInfo) {\n        if (!(name in styleInfo)) {\n            if (name.indexOf('-') === -1) {\n                // tslint:disable-next-line:no-any\n                style[name] = null;\n            }\n            else {\n                style.removeProperty(name);\n            }\n        }\n    }\n    // Add or update properties\n    for (const name in styleInfo) {\n        if (name.indexOf('-') === -1) {\n            // tslint:disable-next-line:no-any\n            style[name] = styleInfo[name];\n        }\n        else {\n            style.setProperty(name, styleInfo[name]);\n        }\n    }\n    styleMapCache.set(part, styleInfo);\n});\n//# sourceMappingURL=style-map.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/directives/style-map.js?")},"./node_modules/lit-html/lib/default-template-processor.js":
/*!*****************************************************************!*\
  !*** ./node_modules/lit-html/lib/default-template-processor.js ***!
  \*****************************************************************/
/*! exports provided: DefaultTemplateProcessor, defaultTemplateProcessor */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefaultTemplateProcessor", function() { return DefaultTemplateProcessor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultTemplateProcessor", function() { return defaultTemplateProcessor; });\n/* harmony import */ var _parts_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parts.js */ "./node_modules/lit-html/lib/parts.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Creates Parts when a template is instantiated.\n */\nclass DefaultTemplateProcessor {\n    /**\n     * Create parts for an attribute-position binding, given the event, attribute\n     * name, and string literals.\n     *\n     * @param element The element containing the binding\n     * @param name  The attribute name\n     * @param strings The string literals. There are always at least two strings,\n     *   event for fully-controlled bindings with a single expression.\n     */\n    handleAttributeExpressions(element, name, strings, options) {\n        const prefix = name[0];\n        if (prefix === \'.\') {\n            const committer = new _parts_js__WEBPACK_IMPORTED_MODULE_0__["PropertyCommitter"](element, name.slice(1), strings);\n            return committer.parts;\n        }\n        if (prefix === \'@\') {\n            return [new _parts_js__WEBPACK_IMPORTED_MODULE_0__["EventPart"](element, name.slice(1), options.eventContext)];\n        }\n        if (prefix === \'?\') {\n            return [new _parts_js__WEBPACK_IMPORTED_MODULE_0__["BooleanAttributePart"](element, name.slice(1), strings)];\n        }\n        const committer = new _parts_js__WEBPACK_IMPORTED_MODULE_0__["AttributeCommitter"](element, name, strings);\n        return committer.parts;\n    }\n    /**\n     * Create parts for a text-position binding.\n     * @param templateFactory\n     */\n    handleTextExpression(options) {\n        return new _parts_js__WEBPACK_IMPORTED_MODULE_0__["NodePart"](options);\n    }\n}\nconst defaultTemplateProcessor = new DefaultTemplateProcessor();\n//# sourceMappingURL=default-template-processor.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/default-template-processor.js?')},"./node_modules/lit-html/lib/directive.js":
/*!************************************************!*\
  !*** ./node_modules/lit-html/lib/directive.js ***!
  \************************************************/
/*! exports provided: directive, isDirective */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"directive\", function() { return directive; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isDirective\", function() { return isDirective; });\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\nconst directives = new WeakMap();\n/**\n * Brands a function as a directive factory function so that lit-html will call\n * the function during template rendering, rather than passing as a value.\n *\n * A _directive_ is a function that takes a Part as an argument. It has the\n * signature: `(part: Part) => void`.\n *\n * A directive _factory_ is a function that takes arguments for data and\n * configuration and returns a directive. Users of directive usually refer to\n * the directive factory as the directive. For example, \"The repeat directive\".\n *\n * Usually a template author will invoke a directive factory in their template\n * with relevant arguments, which will then return a directive function.\n *\n * Here's an example of using the `repeat()` directive factory that takes an\n * array and a function to render an item:\n *\n * ```js\n * html`<ul><${repeat(items, (item) => html`<li>${item}</li>`)}</ul>`\n * ```\n *\n * When `repeat` is invoked, it returns a directive function that closes over\n * `items` and the template function. When the outer template is rendered, the\n * return directive function is called with the Part for the expression.\n * `repeat` then performs it's custom logic to render multiple items.\n *\n * @param f The directive factory function. Must be a function that returns a\n * function of the signature `(part: Part) => void`. The returned function will\n * be called with the part object.\n *\n * @example\n *\n * import {directive, html} from 'lit-html';\n *\n * const immutable = directive((v) => (part) => {\n *   if (part.value !== v) {\n *     part.setValue(v)\n *   }\n * });\n */\nconst directive = (f) => ((...args) => {\n    const d = f(...args);\n    directives.set(d, true);\n    return d;\n});\nconst isDirective = (o) => {\n    return typeof o === 'function' && directives.has(o);\n};\n//# sourceMappingURL=directive.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/directive.js?")},"./node_modules/lit-html/lib/dom.js":
/*!******************************************!*\
  !*** ./node_modules/lit-html/lib/dom.js ***!
  \******************************************/
/*! exports provided: isCEPolyfill, reparentNodes, removeNodes */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCEPolyfill", function() { return isCEPolyfill; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reparentNodes", function() { return reparentNodes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeNodes", function() { return removeNodes; });\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * True if the custom elements polyfill is in use.\n */\nconst isCEPolyfill = window.customElements !== undefined &&\n    window.customElements.polyfillWrapFlushCallback !==\n        undefined;\n/**\n * Reparents nodes, starting from `start` (inclusive) to `end` (exclusive),\n * into another container (could be the same container), before `before`. If\n * `before` is null, it appends the nodes to the container.\n */\nconst reparentNodes = (container, start, end = null, before = null) => {\n    while (start !== end) {\n        const n = start.nextSibling;\n        container.insertBefore(start, before);\n        start = n;\n    }\n};\n/**\n * Removes nodes, starting from `start` (inclusive) to `end` (exclusive), from\n * `container`.\n */\nconst removeNodes = (container, start, end = null) => {\n    while (start !== end) {\n        const n = start.nextSibling;\n        container.removeChild(start);\n        start = n;\n    }\n};\n//# sourceMappingURL=dom.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/dom.js?')},"./node_modules/lit-html/lib/modify-template.js":
/*!******************************************************!*\
  !*** ./node_modules/lit-html/lib/modify-template.js ***!
  \******************************************************/
/*! exports provided: removeNodesFromTemplate, insertNodeIntoTemplate */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeNodesFromTemplate", function() { return removeNodesFromTemplate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertNodeIntoTemplate", function() { return insertNodeIntoTemplate; });\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module shady-render\n */\n\nconst walkerNodeFilter = 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */;\n/**\n * Removes the list of nodes from a Template safely. In addition to removing\n * nodes from the Template, the Template part indices are updated to match\n * the mutated Template DOM.\n *\n * As the template is walked the removal state is tracked and\n * part indices are adjusted as needed.\n *\n * div\n *   div#1 (remove) <-- start removing (removing node is div#1)\n *     div\n *       div#2 (remove)  <-- continue removing (removing node is still div#1)\n *         div\n * div <-- stop removing since previous sibling is the removing node (div#1,\n * removed 4 nodes)\n */\nfunction removeNodesFromTemplate(template, nodesToRemove) {\n    const { element: { content }, parts } = template;\n    const walker = document.createTreeWalker(content, walkerNodeFilter, null, false);\n    let partIndex = nextActiveIndexInTemplateParts(parts);\n    let part = parts[partIndex];\n    let nodeIndex = -1;\n    let removeCount = 0;\n    const nodesToRemoveInTemplate = [];\n    let currentRemovingNode = null;\n    while (walker.nextNode()) {\n        nodeIndex++;\n        const node = walker.currentNode;\n        // End removal if stepped past the removing node\n        if (node.previousSibling === currentRemovingNode) {\n            currentRemovingNode = null;\n        }\n        // A node to remove was found in the template\n        if (nodesToRemove.has(node)) {\n            nodesToRemoveInTemplate.push(node);\n            // Track node we\'re removing\n            if (currentRemovingNode === null) {\n                currentRemovingNode = node;\n            }\n        }\n        // When removing, increment count by which to adjust subsequent part indices\n        if (currentRemovingNode !== null) {\n            removeCount++;\n        }\n        while (part !== undefined && part.index === nodeIndex) {\n            // If part is in a removed node deactivate it by setting index to -1 or\n            // adjust the index as needed.\n            part.index = currentRemovingNode !== null ? -1 : part.index - removeCount;\n            // go to the next active part.\n            partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n            part = parts[partIndex];\n        }\n    }\n    nodesToRemoveInTemplate.forEach((n) => n.parentNode.removeChild(n));\n}\nconst countNodes = (node) => {\n    let count = (node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? 0 : 1;\n    const walker = document.createTreeWalker(node, walkerNodeFilter, null, false);\n    while (walker.nextNode()) {\n        count++;\n    }\n    return count;\n};\nconst nextActiveIndexInTemplateParts = (parts, startIndex = -1) => {\n    for (let i = startIndex + 1; i < parts.length; i++) {\n        const part = parts[i];\n        if (Object(_template_js__WEBPACK_IMPORTED_MODULE_0__["isTemplatePartActive"])(part)) {\n            return i;\n        }\n    }\n    return -1;\n};\n/**\n * Inserts the given node into the Template, optionally before the given\n * refNode. In addition to inserting the node into the Template, the Template\n * part indices are updated to match the mutated Template DOM.\n */\nfunction insertNodeIntoTemplate(template, node, refNode = null) {\n    const { element: { content }, parts } = template;\n    // If there\'s no refNode, then put node at end of template.\n    // No part indices need to be shifted in this case.\n    if (refNode === null || refNode === undefined) {\n        content.appendChild(node);\n        return;\n    }\n    const walker = document.createTreeWalker(content, walkerNodeFilter, null, false);\n    let partIndex = nextActiveIndexInTemplateParts(parts);\n    let insertCount = 0;\n    let walkerIndex = -1;\n    while (walker.nextNode()) {\n        walkerIndex++;\n        const walkerNode = walker.currentNode;\n        if (walkerNode === refNode) {\n            insertCount = countNodes(node);\n            refNode.parentNode.insertBefore(node, refNode);\n        }\n        while (partIndex !== -1 && parts[partIndex].index === walkerIndex) {\n            // If we\'ve inserted the node, simply adjust all subsequent parts\n            if (insertCount > 0) {\n                while (partIndex !== -1) {\n                    parts[partIndex].index += insertCount;\n                    partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n                }\n                return;\n            }\n            partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n        }\n    }\n}\n//# sourceMappingURL=modify-template.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/modify-template.js?')},"./node_modules/lit-html/lib/part.js":
/*!*******************************************!*\
  !*** ./node_modules/lit-html/lib/part.js ***!
  \*******************************************/
/*! exports provided: noChange, nothing */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noChange", function() { return noChange; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nothing", function() { return nothing; });\n/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nconst noChange = {};\n/**\n * A sentinel value that signals a NodePart to fully clear its content.\n */\nconst nothing = {};\n//# sourceMappingURL=part.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/part.js?')},"./node_modules/lit-html/lib/parts.js":
/*!********************************************!*\
  !*** ./node_modules/lit-html/lib/parts.js ***!
  \********************************************/
/*! exports provided: isPrimitive, isIterable, AttributeCommitter, AttributePart, NodePart, BooleanAttributePart, PropertyCommitter, PropertyPart, EventPart */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return isPrimitive; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttributeCommitter", function() { return AttributeCommitter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AttributePart", function() { return AttributePart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodePart", function() { return NodePart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BooleanAttributePart", function() { return BooleanAttributePart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropertyCommitter", function() { return PropertyCommitter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PropertyPart", function() { return PropertyPart; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventPart", function() { return EventPart; });\n/* harmony import */ var _directive_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./directive.js */ "./node_modules/lit-html/lib/directive.js");\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony import */ var _part_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./part.js */ "./node_modules/lit-html/lib/part.js");\n/* harmony import */ var _template_instance_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./template-instance.js */ "./node_modules/lit-html/lib/template-instance.js");\n/* harmony import */ var _template_result_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./template-result.js */ "./node_modules/lit-html/lib/template-result.js");\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\n\n\n\n\n\n\nconst isPrimitive = (value) => {\n    return (value === null ||\n        !(typeof value === \'object\' || typeof value === \'function\'));\n};\nconst isIterable = (value) => {\n    return Array.isArray(value) ||\n        // tslint:disable-next-line:no-any\n        !!(value && value[Symbol.iterator]);\n};\n/**\n * Writes attribute values to the DOM for a group of AttributeParts bound to a\n * single attibute. The value is only set once even if there are multiple parts\n * for an attribute.\n */\nclass AttributeCommitter {\n    constructor(element, name, strings) {\n        this.dirty = true;\n        this.element = element;\n        this.name = name;\n        this.strings = strings;\n        this.parts = [];\n        for (let i = 0; i < strings.length - 1; i++) {\n            this.parts[i] = this._createPart();\n        }\n    }\n    /**\n     * Creates a single part. Override this to create a differnt type of part.\n     */\n    _createPart() {\n        return new AttributePart(this);\n    }\n    _getValue() {\n        const strings = this.strings;\n        const l = strings.length - 1;\n        let text = \'\';\n        for (let i = 0; i < l; i++) {\n            text += strings[i];\n            const part = this.parts[i];\n            if (part !== undefined) {\n                const v = part.value;\n                if (isPrimitive(v) || !isIterable(v)) {\n                    text += typeof v === \'string\' ? v : String(v);\n                }\n                else {\n                    for (const t of v) {\n                        text += typeof t === \'string\' ? t : String(t);\n                    }\n                }\n            }\n        }\n        text += strings[l];\n        return text;\n    }\n    commit() {\n        if (this.dirty) {\n            this.dirty = false;\n            this.element.setAttribute(this.name, this._getValue());\n        }\n    }\n}\n/**\n * A Part that controls all or part of an attribute value.\n */\nclass AttributePart {\n    constructor(committer) {\n        this.value = undefined;\n        this.committer = committer;\n    }\n    setValue(value) {\n        if (value !== _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"] && (!isPrimitive(value) || value !== this.value)) {\n            this.value = value;\n            // If the value is a not a directive, dirty the committer so that it\'ll\n            // call setAttribute. If the value is a directive, it\'ll dirty the\n            // committer if it calls setValue().\n            if (!Object(_directive_js__WEBPACK_IMPORTED_MODULE_0__["isDirective"])(value)) {\n                this.committer.dirty = true;\n            }\n        }\n    }\n    commit() {\n        while (Object(_directive_js__WEBPACK_IMPORTED_MODULE_0__["isDirective"])(this.value)) {\n            const directive = this.value;\n            this.value = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n            directive(this);\n        }\n        if (this.value === _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"]) {\n            return;\n        }\n        this.committer.commit();\n    }\n}\n/**\n * A Part that controls a location within a Node tree. Like a Range, NodePart\n * has start and end locations and can set and update the Nodes between those\n * locations.\n *\n * NodeParts support several value types: primitives, Nodes, TemplateResults,\n * as well as arrays and iterables of those types.\n */\nclass NodePart {\n    constructor(options) {\n        this.value = undefined;\n        this.__pendingValue = undefined;\n        this.options = options;\n    }\n    /**\n     * Appends this part into a container.\n     *\n     * This part must be empty, as its contents are not automatically moved.\n     */\n    appendInto(container) {\n        this.startNode = container.appendChild(Object(_template_js__WEBPACK_IMPORTED_MODULE_5__["createMarker"])());\n        this.endNode = container.appendChild(Object(_template_js__WEBPACK_IMPORTED_MODULE_5__["createMarker"])());\n    }\n    /**\n     * Inserts this part after the `ref` node (between `ref` and `ref`\'s next\n     * sibling). Both `ref` and its next sibling must be static, unchanging nodes\n     * such as those that appear in a literal section of a template.\n     *\n     * This part must be empty, as its contents are not automatically moved.\n     */\n    insertAfterNode(ref) {\n        this.startNode = ref;\n        this.endNode = ref.nextSibling;\n    }\n    /**\n     * Appends this part into a parent part.\n     *\n     * This part must be empty, as its contents are not automatically moved.\n     */\n    appendIntoPart(part) {\n        part.__insert(this.startNode = Object(_template_js__WEBPACK_IMPORTED_MODULE_5__["createMarker"])());\n        part.__insert(this.endNode = Object(_template_js__WEBPACK_IMPORTED_MODULE_5__["createMarker"])());\n    }\n    /**\n     * Inserts this part after the `ref` part.\n     *\n     * This part must be empty, as its contents are not automatically moved.\n     */\n    insertAfterPart(ref) {\n        ref.__insert(this.startNode = Object(_template_js__WEBPACK_IMPORTED_MODULE_5__["createMarker"])());\n        this.endNode = ref.endNode;\n        ref.endNode = this.startNode;\n    }\n    setValue(value) {\n        this.__pendingValue = value;\n    }\n    commit() {\n        while (Object(_directive_js__WEBPACK_IMPORTED_MODULE_0__["isDirective"])(this.__pendingValue)) {\n            const directive = this.__pendingValue;\n            this.__pendingValue = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n            directive(this);\n        }\n        const value = this.__pendingValue;\n        if (value === _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"]) {\n            return;\n        }\n        if (isPrimitive(value)) {\n            if (value !== this.value) {\n                this.__commitText(value);\n            }\n        }\n        else if (value instanceof _template_result_js__WEBPACK_IMPORTED_MODULE_4__["TemplateResult"]) {\n            this.__commitTemplateResult(value);\n        }\n        else if (value instanceof Node) {\n            this.__commitNode(value);\n        }\n        else if (isIterable(value)) {\n            this.__commitIterable(value);\n        }\n        else if (value === _part_js__WEBPACK_IMPORTED_MODULE_2__["nothing"]) {\n            this.value = _part_js__WEBPACK_IMPORTED_MODULE_2__["nothing"];\n            this.clear();\n        }\n        else {\n            // Fallback, will render the string representation\n            this.__commitText(value);\n        }\n    }\n    __insert(node) {\n        this.endNode.parentNode.insertBefore(node, this.endNode);\n    }\n    __commitNode(value) {\n        if (this.value === value) {\n            return;\n        }\n        this.clear();\n        this.__insert(value);\n        this.value = value;\n    }\n    __commitText(value) {\n        const node = this.startNode.nextSibling;\n        value = value == null ? \'\' : value;\n        // If `value` isn\'t already a string, we explicitly convert it here in case\n        // it can\'t be implicitly converted - i.e. it\'s a symbol.\n        const valueAsString = typeof value === \'string\' ? value : String(value);\n        if (node === this.endNode.previousSibling &&\n            node.nodeType === 3 /* Node.TEXT_NODE */) {\n            // If we only have a single text node between the markers, we can just\n            // set its value, rather than replacing it.\n            // TODO(justinfagnani): Can we just check if this.value is primitive?\n            node.data = valueAsString;\n        }\n        else {\n            this.__commitNode(document.createTextNode(valueAsString));\n        }\n        this.value = value;\n    }\n    __commitTemplateResult(value) {\n        const template = this.options.templateFactory(value);\n        if (this.value instanceof _template_instance_js__WEBPACK_IMPORTED_MODULE_3__["TemplateInstance"] &&\n            this.value.template === template) {\n            this.value.update(value.values);\n        }\n        else {\n            // Make sure we propagate the template processor from the TemplateResult\n            // so that we use its syntax extension, etc. The template factory comes\n            // from the render function options so that it can control template\n            // caching and preprocessing.\n            const instance = new _template_instance_js__WEBPACK_IMPORTED_MODULE_3__["TemplateInstance"](template, value.processor, this.options);\n            const fragment = instance._clone();\n            instance.update(value.values);\n            this.__commitNode(fragment);\n            this.value = instance;\n        }\n    }\n    __commitIterable(value) {\n        // For an Iterable, we create a new InstancePart per item, then set its\n        // value to the item. This is a little bit of overhead for every item in\n        // an Iterable, but it lets us recurse easily and efficiently update Arrays\n        // of TemplateResults that will be commonly returned from expressions like:\n        // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n        // If _value is an array, then the previous render was of an\n        // iterable and _value will contain the NodeParts from the previous\n        // render. If _value is not an array, clear this part and make a new\n        // array for NodeParts.\n        if (!Array.isArray(this.value)) {\n            this.value = [];\n            this.clear();\n        }\n        // Lets us keep track of how many items we stamped so we can clear leftover\n        // items from a previous render\n        const itemParts = this.value;\n        let partIndex = 0;\n        let itemPart;\n        for (const item of value) {\n            // Try to reuse an existing part\n            itemPart = itemParts[partIndex];\n            // If no existing part, create a new one\n            if (itemPart === undefined) {\n                itemPart = new NodePart(this.options);\n                itemParts.push(itemPart);\n                if (partIndex === 0) {\n                    itemPart.appendIntoPart(this);\n                }\n                else {\n                    itemPart.insertAfterPart(itemParts[partIndex - 1]);\n                }\n            }\n            itemPart.setValue(item);\n            itemPart.commit();\n            partIndex++;\n        }\n        if (partIndex < itemParts.length) {\n            // Truncate the parts array so _value reflects the current state\n            itemParts.length = partIndex;\n            this.clear(itemPart && itemPart.endNode);\n        }\n    }\n    clear(startNode = this.startNode) {\n        Object(_dom_js__WEBPACK_IMPORTED_MODULE_1__["removeNodes"])(this.startNode.parentNode, startNode.nextSibling, this.endNode);\n    }\n}\n/**\n * Implements a boolean attribute, roughly as defined in the HTML\n * specification.\n *\n * If the value is truthy, then the attribute is present with a value of\n * \'\'. If the value is falsey, the attribute is removed.\n */\nclass BooleanAttributePart {\n    constructor(element, name, strings) {\n        this.value = undefined;\n        this.__pendingValue = undefined;\n        if (strings.length !== 2 || strings[0] !== \'\' || strings[1] !== \'\') {\n            throw new Error(\'Boolean attributes can only contain a single expression\');\n        }\n        this.element = element;\n        this.name = name;\n        this.strings = strings;\n    }\n    setValue(value) {\n        this.__pendingValue = value;\n    }\n    commit() {\n        while (Object(_directive_js__WEBPACK_IMPORTED_MODULE_0__["isDirective"])(this.__pendingValue)) {\n            const directive = this.__pendingValue;\n            this.__pendingValue = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n            directive(this);\n        }\n        if (this.__pendingValue === _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"]) {\n            return;\n        }\n        const value = !!this.__pendingValue;\n        if (this.value !== value) {\n            if (value) {\n                this.element.setAttribute(this.name, \'\');\n            }\n            else {\n                this.element.removeAttribute(this.name);\n            }\n            this.value = value;\n        }\n        this.__pendingValue = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n    }\n}\n/**\n * Sets attribute values for PropertyParts, so that the value is only set once\n * even if there are multiple parts for a property.\n *\n * If an expression controls the whole property value, then the value is simply\n * assigned to the property under control. If there are string literals or\n * multiple expressions, then the strings are expressions are interpolated into\n * a string first.\n */\nclass PropertyCommitter extends AttributeCommitter {\n    constructor(element, name, strings) {\n        super(element, name, strings);\n        this.single =\n            (strings.length === 2 && strings[0] === \'\' && strings[1] === \'\');\n    }\n    _createPart() {\n        return new PropertyPart(this);\n    }\n    _getValue() {\n        if (this.single) {\n            return this.parts[0].value;\n        }\n        return super._getValue();\n    }\n    commit() {\n        if (this.dirty) {\n            this.dirty = false;\n            // tslint:disable-next-line:no-any\n            this.element[this.name] = this._getValue();\n        }\n    }\n}\nclass PropertyPart extends AttributePart {\n}\n// Detect event listener options support. If the `capture` property is read\n// from the options object, then options are supported. If not, then the thrid\n// argument to add/removeEventListener is interpreted as the boolean capture\n// value so we should only pass the `capture` property.\nlet eventOptionsSupported = false;\ntry {\n    const options = {\n        get capture() {\n            eventOptionsSupported = true;\n            return false;\n        }\n    };\n    // tslint:disable-next-line:no-any\n    window.addEventListener(\'test\', options, options);\n    // tslint:disable-next-line:no-any\n    window.removeEventListener(\'test\', options, options);\n}\ncatch (_e) {\n}\nclass EventPart {\n    constructor(element, eventName, eventContext) {\n        this.value = undefined;\n        this.__pendingValue = undefined;\n        this.element = element;\n        this.eventName = eventName;\n        this.eventContext = eventContext;\n        this.__boundHandleEvent = (e) => this.handleEvent(e);\n    }\n    setValue(value) {\n        this.__pendingValue = value;\n    }\n    commit() {\n        while (Object(_directive_js__WEBPACK_IMPORTED_MODULE_0__["isDirective"])(this.__pendingValue)) {\n            const directive = this.__pendingValue;\n            this.__pendingValue = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n            directive(this);\n        }\n        if (this.__pendingValue === _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"]) {\n            return;\n        }\n        const newListener = this.__pendingValue;\n        const oldListener = this.value;\n        const shouldRemoveListener = newListener == null ||\n            oldListener != null &&\n                (newListener.capture !== oldListener.capture ||\n                    newListener.once !== oldListener.once ||\n                    newListener.passive !== oldListener.passive);\n        const shouldAddListener = newListener != null && (oldListener == null || shouldRemoveListener);\n        if (shouldRemoveListener) {\n            this.element.removeEventListener(this.eventName, this.__boundHandleEvent, this.__options);\n        }\n        if (shouldAddListener) {\n            this.__options = getOptions(newListener);\n            this.element.addEventListener(this.eventName, this.__boundHandleEvent, this.__options);\n        }\n        this.value = newListener;\n        this.__pendingValue = _part_js__WEBPACK_IMPORTED_MODULE_2__["noChange"];\n    }\n    handleEvent(event) {\n        if (typeof this.value === \'function\') {\n            this.value.call(this.eventContext || this.element, event);\n        }\n        else {\n            this.value.handleEvent(event);\n        }\n    }\n}\n// We copy options because of the inconsistent behavior of browsers when reading\n// the third argument of add/removeEventListener. IE11 doesn\'t support options\n// at all. Chrome 41 only reads `capture` if the argument is an object.\nconst getOptions = (o) => o &&\n    (eventOptionsSupported ?\n        { capture: o.capture, passive: o.passive, once: o.once } :\n        o.capture);\n//# sourceMappingURL=parts.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/parts.js?')},"./node_modules/lit-html/lib/render.js":
/*!*********************************************!*\
  !*** ./node_modules/lit-html/lib/render.js ***!
  \*********************************************/
/*! exports provided: parts, render */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parts", function() { return parts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony import */ var _parts_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parts.js */ "./node_modules/lit-html/lib/parts.js");\n/* harmony import */ var _template_factory_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./template-factory.js */ "./node_modules/lit-html/lib/template-factory.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\n\n\n\nconst parts = new WeakMap();\n/**\n * Renders a template result or other value to a container.\n *\n * To update a container with new values, reevaluate the template literal and\n * call `render` with the new result.\n *\n * @param result Any value renderable by NodePart - typically a TemplateResult\n *     created by evaluating a template tag like `html` or `svg`.\n * @param container A DOM parent to render to. The entire contents are either\n *     replaced, or efficiently updated if the same result type was previous\n *     rendered there.\n * @param options RenderOptions for the entire render tree rendered to this\n *     container. Render options must *not* change between renders to the same\n *     container, as those changes will not effect previously rendered DOM.\n */\nconst render = (result, container, options) => {\n    let part = parts.get(container);\n    if (part === undefined) {\n        Object(_dom_js__WEBPACK_IMPORTED_MODULE_0__["removeNodes"])(container, container.firstChild);\n        parts.set(container, part = new _parts_js__WEBPACK_IMPORTED_MODULE_1__["NodePart"](Object.assign({ templateFactory: _template_factory_js__WEBPACK_IMPORTED_MODULE_2__["templateFactory"] }, options)));\n        part.appendInto(container);\n    }\n    part.setValue(result);\n    part.commit();\n};\n//# sourceMappingURL=render.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/render.js?')},"./node_modules/lit-html/lib/shady-render.js":
/*!***************************************************!*\
  !*** ./node_modules/lit-html/lib/shady-render.js ***!
  \***************************************************/
/*! exports provided: html, svg, TemplateResult, render */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony import */ var _modify_template_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modify-template.js */ "./node_modules/lit-html/lib/modify-template.js");\n/* harmony import */ var _render_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./render.js */ "./node_modules/lit-html/lib/render.js");\n/* harmony import */ var _template_factory_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./template-factory.js */ "./node_modules/lit-html/lib/template-factory.js");\n/* harmony import */ var _template_instance_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./template-instance.js */ "./node_modules/lit-html/lib/template-instance.js");\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/* harmony import */ var _lit_html_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../lit-html.js */ "./node_modules/lit-html/lit-html.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_6__["html"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_6__["svg"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TemplateResult", function() { return _lit_html_js__WEBPACK_IMPORTED_MODULE_6__["TemplateResult"]; });\n\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * Module to add shady DOM/shady CSS polyfill support to lit-html template\n * rendering. See the [[render]] method for details.\n *\n * @module shady-render\n * @preferred\n */\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\n\n\n\n\n\n\n\n// Get a key to lookup in `templateCaches`.\nconst getTemplateCacheKey = (type, scopeName) => `${type}--${scopeName}`;\nlet compatibleShadyCSSVersion = true;\nif (typeof window.ShadyCSS === \'undefined\') {\n    compatibleShadyCSSVersion = false;\n}\nelse if (typeof window.ShadyCSS.prepareTemplateDom === \'undefined\') {\n    console.warn(`Incompatible ShadyCSS version detected. ` +\n        `Please update to at least @webcomponents/webcomponentsjs@2.0.2 and ` +\n        `@webcomponents/shadycss@1.3.1.`);\n    compatibleShadyCSSVersion = false;\n}\n/**\n * Template factory which scopes template DOM using ShadyCSS.\n * @param scopeName {string}\n */\nconst shadyTemplateFactory = (scopeName) => (result) => {\n    const cacheKey = getTemplateCacheKey(result.type, scopeName);\n    let templateCache = _template_factory_js__WEBPACK_IMPORTED_MODULE_3__["templateCaches"].get(cacheKey);\n    if (templateCache === undefined) {\n        templateCache = {\n            stringsArray: new WeakMap(),\n            keyString: new Map()\n        };\n        _template_factory_js__WEBPACK_IMPORTED_MODULE_3__["templateCaches"].set(cacheKey, templateCache);\n    }\n    let template = templateCache.stringsArray.get(result.strings);\n    if (template !== undefined) {\n        return template;\n    }\n    const key = result.strings.join(_template_js__WEBPACK_IMPORTED_MODULE_5__["marker"]);\n    template = templateCache.keyString.get(key);\n    if (template === undefined) {\n        const element = result.getTemplateElement();\n        if (compatibleShadyCSSVersion) {\n            window.ShadyCSS.prepareTemplateDom(element, scopeName);\n        }\n        template = new _template_js__WEBPACK_IMPORTED_MODULE_5__["Template"](result, element);\n        templateCache.keyString.set(key, template);\n    }\n    templateCache.stringsArray.set(result.strings, template);\n    return template;\n};\nconst TEMPLATE_TYPES = [\'html\', \'svg\'];\n/**\n * Removes all style elements from Templates for the given scopeName.\n */\nconst removeStylesFromLitTemplates = (scopeName) => {\n    TEMPLATE_TYPES.forEach((type) => {\n        const templates = _template_factory_js__WEBPACK_IMPORTED_MODULE_3__["templateCaches"].get(getTemplateCacheKey(type, scopeName));\n        if (templates !== undefined) {\n            templates.keyString.forEach((template) => {\n                const { element: { content } } = template;\n                // IE 11 doesn\'t support the iterable param Set constructor\n                const styles = new Set();\n                Array.from(content.querySelectorAll(\'style\')).forEach((s) => {\n                    styles.add(s);\n                });\n                Object(_modify_template_js__WEBPACK_IMPORTED_MODULE_1__["removeNodesFromTemplate"])(template, styles);\n            });\n        }\n    });\n};\nconst shadyRenderSet = new Set();\n/**\n * For the given scope name, ensures that ShadyCSS style scoping is performed.\n * This is done just once per scope name so the fragment and template cannot\n * be modified.\n * (1) extracts styles from the rendered fragment and hands them to ShadyCSS\n * to be scoped and appended to the document\n * (2) removes style elements from all lit-html Templates for this scope name.\n *\n * Note, <style> elements can only be placed into templates for the\n * initial rendering of the scope. If <style> elements are included in templates\n * dynamically rendered to the scope (after the first scope render), they will\n * not be scoped and the <style> will be left in the template and rendered\n * output.\n */\nconst prepareTemplateStyles = (scopeName, renderedDOM, template) => {\n    shadyRenderSet.add(scopeName);\n    // If `renderedDOM` is stamped from a Template, then we need to edit that\n    // Template\'s underlying template element. Otherwise, we create one here\n    // to give to ShadyCSS, which still requires one while scoping.\n    const templateElement = !!template ? template.element : document.createElement(\'template\');\n    // Move styles out of rendered DOM and store.\n    const styles = renderedDOM.querySelectorAll(\'style\');\n    const { length } = styles;\n    // If there are no styles, skip unnecessary work\n    if (length === 0) {\n        // Ensure prepareTemplateStyles is called to support adding\n        // styles via `prepareAdoptedCssText` since that requires that\n        // `prepareTemplateStyles` is called.\n        //\n        // ShadyCSS will only update styles containing @apply in the template\n        // given to `prepareTemplateStyles`. If no lit Template was given,\n        // ShadyCSS will not be able to update uses of @apply in any relevant\n        // template. However, this is not a problem because we only create the\n        // template for the purpose of supporting `prepareAdoptedCssText`,\n        // which doesn\'t support @apply at all.\n        window.ShadyCSS.prepareTemplateStyles(templateElement, scopeName);\n        return;\n    }\n    const condensedStyle = document.createElement(\'style\');\n    // Collect styles into a single style. This helps us make sure ShadyCSS\n    // manipulations will not prevent us from being able to fix up template\n    // part indices.\n    // NOTE: collecting styles is inefficient for browsers but ShadyCSS\n    // currently does this anyway. When it does not, this should be changed.\n    for (let i = 0; i < length; i++) {\n        const style = styles[i];\n        style.parentNode.removeChild(style);\n        condensedStyle.textContent += style.textContent;\n    }\n    // Remove styles from nested templates in this scope.\n    removeStylesFromLitTemplates(scopeName);\n    // And then put the condensed style into the "root" template passed in as\n    // `template`.\n    const content = templateElement.content;\n    if (!!template) {\n        Object(_modify_template_js__WEBPACK_IMPORTED_MODULE_1__["insertNodeIntoTemplate"])(template, condensedStyle, content.firstChild);\n    }\n    else {\n        content.insertBefore(condensedStyle, content.firstChild);\n    }\n    // Note, it\'s important that ShadyCSS gets the template that `lit-html`\n    // will actually render so that it can update the style inside when\n    // needed (e.g. @apply native Shadow DOM case).\n    window.ShadyCSS.prepareTemplateStyles(templateElement, scopeName);\n    const style = content.querySelector(\'style\');\n    if (window.ShadyCSS.nativeShadow && style !== null) {\n        // When in native Shadow DOM, ensure the style created by ShadyCSS is\n        // included in initially rendered output (`renderedDOM`).\n        renderedDOM.insertBefore(style.cloneNode(true), renderedDOM.firstChild);\n    }\n    else if (!!template) {\n        // When no style is left in the template, parts will be broken as a\n        // result. To fix this, we put back the style node ShadyCSS removed\n        // and then tell lit to remove that node from the template.\n        // There can be no style in the template in 2 cases (1) when Shady DOM\n        // is in use, ShadyCSS removes all styles, (2) when native Shadow DOM\n        // is in use ShadyCSS removes the style if it contains no content.\n        // NOTE, ShadyCSS creates its own style so we can safely add/remove\n        // `condensedStyle` here.\n        content.insertBefore(condensedStyle, content.firstChild);\n        const removes = new Set();\n        removes.add(condensedStyle);\n        Object(_modify_template_js__WEBPACK_IMPORTED_MODULE_1__["removeNodesFromTemplate"])(template, removes);\n    }\n};\n/**\n * Extension to the standard `render` method which supports rendering\n * to ShadowRoots when the ShadyDOM (https://github.com/webcomponents/shadydom)\n * and ShadyCSS (https://github.com/webcomponents/shadycss) polyfills are used\n * or when the webcomponentsjs\n * (https://github.com/webcomponents/webcomponentsjs) polyfill is used.\n *\n * Adds a `scopeName` option which is used to scope element DOM and stylesheets\n * when native ShadowDOM is unavailable. The `scopeName` will be added to\n * the class attribute of all rendered DOM. In addition, any style elements will\n * be automatically re-written with this `scopeName` selector and moved out\n * of the rendered DOM and into the document `<head>`.\n *\n * It is common to use this render method in conjunction with a custom element\n * which renders a shadowRoot. When this is done, typically the element\'s\n * `localName` should be used as the `scopeName`.\n *\n * In addition to DOM scoping, ShadyCSS also supports a basic shim for css\n * custom properties (needed only on older browsers like IE11) and a shim for\n * a deprecated feature called `@apply` that supports applying a set of css\n * custom properties to a given location.\n *\n * Usage considerations:\n *\n * * Part values in `<style>` elements are only applied the first time a given\n * `scopeName` renders. Subsequent changes to parts in style elements will have\n * no effect. Because of this, parts in style elements should only be used for\n * values that will never change, for example parts that set scope-wide theme\n * values or parts which render shared style elements.\n *\n * * Note, due to a limitation of the ShadyDOM polyfill, rendering in a\n * custom element\'s `constructor` is not supported. Instead rendering should\n * either done asynchronously, for example at microtask timing (for example\n * `Promise.resolve()`), or be deferred until the first time the element\'s\n * `connectedCallback` runs.\n *\n * Usage considerations when using shimmed custom properties or `@apply`:\n *\n * * Whenever any dynamic changes are made which affect\n * css custom properties, `ShadyCSS.styleElement(element)` must be called\n * to update the element. There are two cases when this is needed:\n * (1) the element is connected to a new parent, (2) a class is added to the\n * element that causes it to match different custom properties.\n * To address the first case when rendering a custom element, `styleElement`\n * should be called in the element\'s `connectedCallback`.\n *\n * * Shimmed custom properties may only be defined either for an entire\n * shadowRoot (for example, in a `:host` rule) or via a rule that directly\n * matches an element with a shadowRoot. In other words, instead of flowing from\n * parent to child as do native css custom properties, shimmed custom properties\n * flow only from shadowRoots to nested shadowRoots.\n *\n * * When using `@apply` mixing css shorthand property names with\n * non-shorthand names (for example `border` and `border-width`) is not\n * supported.\n */\nconst render = (result, container, options) => {\n    if (!options || typeof options !== \'object\' || !options.scopeName) {\n        throw new Error(\'The `scopeName` option is required.\');\n    }\n    const scopeName = options.scopeName;\n    const hasRendered = _render_js__WEBPACK_IMPORTED_MODULE_2__["parts"].has(container);\n    const needsScoping = compatibleShadyCSSVersion &&\n        container.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */ &&\n        !!container.host;\n    // Handle first render to a scope specially...\n    const firstScopeRender = needsScoping && !shadyRenderSet.has(scopeName);\n    // On first scope render, render into a fragment; this cannot be a single\n    // fragment that is reused since nested renders can occur synchronously.\n    const renderContainer = firstScopeRender ? document.createDocumentFragment() : container;\n    Object(_render_js__WEBPACK_IMPORTED_MODULE_2__["render"])(result, renderContainer, Object.assign({ templateFactory: shadyTemplateFactory(scopeName) }, options));\n    // When performing first scope render,\n    // (1) We\'ve rendered into a fragment so that there\'s a chance to\n    // `prepareTemplateStyles` before sub-elements hit the DOM\n    // (which might cause them to render based on a common pattern of\n    // rendering in a custom element\'s `connectedCallback`);\n    // (2) Scope the template with ShadyCSS one time only for this scope.\n    // (3) Render the fragment into the container and make sure the\n    // container knows its `part` is the one we just rendered. This ensures\n    // DOM will be re-used on subsequent renders.\n    if (firstScopeRender) {\n        const part = _render_js__WEBPACK_IMPORTED_MODULE_2__["parts"].get(renderContainer);\n        _render_js__WEBPACK_IMPORTED_MODULE_2__["parts"].delete(renderContainer);\n        // ShadyCSS might have style sheets (e.g. from `prepareAdoptedCssText`)\n        // that should apply to `renderContainer` even if the rendered value is\n        // not a TemplateInstance. However, it will only insert scoped styles\n        // into the document if `prepareTemplateStyles` has already been called\n        // for the given scope name.\n        const template = part.value instanceof _template_instance_js__WEBPACK_IMPORTED_MODULE_4__["TemplateInstance"] ?\n            part.value.template :\n            undefined;\n        prepareTemplateStyles(scopeName, renderContainer, template);\n        Object(_dom_js__WEBPACK_IMPORTED_MODULE_0__["removeNodes"])(container, container.firstChild);\n        container.appendChild(renderContainer);\n        _render_js__WEBPACK_IMPORTED_MODULE_2__["parts"].set(container, part);\n    }\n    // After elements have hit the DOM, update styling if this is the\n    // initial render to this container.\n    // This is needed whenever dynamic changes are made so it would be\n    // safest to do every render; however, this would regress performance\n    // so we leave it up to the user to call `ShadyCSS.styleElement`\n    // for dynamic changes.\n    if (!hasRendered && needsScoping) {\n        window.ShadyCSS.styleElement(container.host);\n    }\n};\n//# sourceMappingURL=shady-render.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/shady-render.js?')},"./node_modules/lit-html/lib/template-factory.js":
/*!*******************************************************!*\
  !*** ./node_modules/lit-html/lib/template-factory.js ***!
  \*******************************************************/
/*! exports provided: templateFactory, templateCaches */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "templateFactory", function() { return templateFactory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "templateCaches", function() { return templateCaches; });\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * The default TemplateFactory which caches Templates keyed on\n * result.type and result.strings.\n */\nfunction templateFactory(result) {\n    let templateCache = templateCaches.get(result.type);\n    if (templateCache === undefined) {\n        templateCache = {\n            stringsArray: new WeakMap(),\n            keyString: new Map()\n        };\n        templateCaches.set(result.type, templateCache);\n    }\n    let template = templateCache.stringsArray.get(result.strings);\n    if (template !== undefined) {\n        return template;\n    }\n    // If the TemplateStringsArray is new, generate a key from the strings\n    // This key is shared between all templates with identical content\n    const key = result.strings.join(_template_js__WEBPACK_IMPORTED_MODULE_0__["marker"]);\n    // Check if we already have a Template for this key\n    template = templateCache.keyString.get(key);\n    if (template === undefined) {\n        // If we have not seen this key before, create a new Template\n        template = new _template_js__WEBPACK_IMPORTED_MODULE_0__["Template"](result, result.getTemplateElement());\n        // Cache the Template for this key\n        templateCache.keyString.set(key, template);\n    }\n    // Cache all future queries for this TemplateStringsArray\n    templateCache.stringsArray.set(result.strings, template);\n    return template;\n}\nconst templateCaches = new Map();\n//# sourceMappingURL=template-factory.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/template-factory.js?')},"./node_modules/lit-html/lib/template-instance.js":
/*!********************************************************!*\
  !*** ./node_modules/lit-html/lib/template-instance.js ***!
  \********************************************************/
/*! exports provided: TemplateInstance */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplateInstance", function() { return TemplateInstance; });\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\n\n\n/**\n * An instance of a `Template` that can be attached to the DOM and updated\n * with new values.\n */\nclass TemplateInstance {\n    constructor(template, processor, options) {\n        this.__parts = [];\n        this.template = template;\n        this.processor = processor;\n        this.options = options;\n    }\n    update(values) {\n        let i = 0;\n        for (const part of this.__parts) {\n            if (part !== undefined) {\n                part.setValue(values[i]);\n            }\n            i++;\n        }\n        for (const part of this.__parts) {\n            if (part !== undefined) {\n                part.commit();\n            }\n        }\n    }\n    _clone() {\n        // There are a number of steps in the lifecycle of a template instance\'s\n        // DOM fragment:\n        //  1. Clone - create the instance fragment\n        //  2. Adopt - adopt into the main document\n        //  3. Process - find part markers and create parts\n        //  4. Upgrade - upgrade custom elements\n        //  5. Update - set node, attribute, property, etc., values\n        //  6. Connect - connect to the document. Optional and outside of this\n        //     method.\n        //\n        // We have a few constraints on the ordering of these steps:\n        //  * We need to upgrade before updating, so that property values will pass\n        //    through any property setters.\n        //  * We would like to process before upgrading so that we\'re sure that the\n        //    cloned fragment is inert and not disturbed by self-modifying DOM.\n        //  * We want custom elements to upgrade even in disconnected fragments.\n        //\n        // Given these constraints, with full custom elements support we would\n        // prefer the order: Clone, Process, Adopt, Upgrade, Update, Connect\n        //\n        // But Safari dooes not implement CustomElementRegistry#upgrade, so we\n        // can not implement that order and still have upgrade-before-update and\n        // upgrade disconnected fragments. So we instead sacrifice the\n        // process-before-upgrade constraint, since in Custom Elements v1 elements\n        // must not modify their light DOM in the constructor. We still have issues\n        // when co-existing with CEv0 elements like Polymer 1, and with polyfills\n        // that don\'t strictly adhere to the no-modification rule because shadow\n        // DOM, which may be created in the constructor, is emulated by being placed\n        // in the light DOM.\n        //\n        // The resulting order is on native is: Clone, Adopt, Upgrade, Process,\n        // Update, Connect. document.importNode() performs Clone, Adopt, and Upgrade\n        // in one step.\n        //\n        // The Custom Elements v1 polyfill supports upgrade(), so the order when\n        // polyfilled is the more ideal: Clone, Process, Adopt, Upgrade, Update,\n        // Connect.\n        const fragment = _dom_js__WEBPACK_IMPORTED_MODULE_0__["isCEPolyfill"] ?\n            this.template.element.content.cloneNode(true) :\n            document.importNode(this.template.element.content, true);\n        const stack = [];\n        const parts = this.template.parts;\n        // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n        const walker = document.createTreeWalker(fragment, 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */, null, false);\n        let partIndex = 0;\n        let nodeIndex = 0;\n        let part;\n        let node = walker.nextNode();\n        // Loop through all the nodes and parts of a template\n        while (partIndex < parts.length) {\n            part = parts[partIndex];\n            if (!Object(_template_js__WEBPACK_IMPORTED_MODULE_1__["isTemplatePartActive"])(part)) {\n                this.__parts.push(undefined);\n                partIndex++;\n                continue;\n            }\n            // Progress the tree walker until we find our next part\'s node.\n            // Note that multiple parts may share the same node (attribute parts\n            // on a single element), so this loop may not run at all.\n            while (nodeIndex < part.index) {\n                nodeIndex++;\n                if (node.nodeName === \'TEMPLATE\') {\n                    stack.push(node);\n                    walker.currentNode = node.content;\n                }\n                if ((node = walker.nextNode()) === null) {\n                    // We\'ve exhausted the content inside a nested template element.\n                    // Because we still have parts (the outer for-loop), we know:\n                    // - There is a template in the stack\n                    // - The walker will find a nextNode outside the template\n                    walker.currentNode = stack.pop();\n                    node = walker.nextNode();\n                }\n            }\n            // We\'ve arrived at our part\'s node.\n            if (part.type === \'node\') {\n                const part = this.processor.handleTextExpression(this.options);\n                part.insertAfterNode(node.previousSibling);\n                this.__parts.push(part);\n            }\n            else {\n                this.__parts.push(...this.processor.handleAttributeExpressions(node, part.name, part.strings, this.options));\n            }\n            partIndex++;\n        }\n        if (_dom_js__WEBPACK_IMPORTED_MODULE_0__["isCEPolyfill"]) {\n            document.adoptNode(fragment);\n            customElements.upgrade(fragment);\n        }\n        return fragment;\n    }\n}\n//# sourceMappingURL=template-instance.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/template-instance.js?')},"./node_modules/lit-html/lib/template-result.js":
/*!******************************************************!*\
  !*** ./node_modules/lit-html/lib/template-result.js ***!
  \******************************************************/
/*! exports provided: TemplateResult, SVGTemplateResult */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TemplateResult", function() { return TemplateResult; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SVGTemplateResult", function() { return SVGTemplateResult; });\n/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony import */ var _template_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./template.js */ "./node_modules/lit-html/lib/template.js");\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * @module lit-html\n */\n\n\nconst commentMarker = ` ${_template_js__WEBPACK_IMPORTED_MODULE_1__["marker"]} `;\n/**\n * The return type of `html`, which holds a Template and the values from\n * interpolated expressions.\n */\nclass TemplateResult {\n    constructor(strings, values, type, processor) {\n        this.strings = strings;\n        this.values = values;\n        this.type = type;\n        this.processor = processor;\n    }\n    /**\n     * Returns a string of HTML used to create a `<template>` element.\n     */\n    getHTML() {\n        const l = this.strings.length - 1;\n        let html = \'\';\n        let isCommentBinding = false;\n        for (let i = 0; i < l; i++) {\n            const s = this.strings[i];\n            // For each binding we want to determine the kind of marker to insert\n            // into the template source before it\'s parsed by the browser\'s HTML\n            // parser. The marker type is based on whether the expression is in an\n            // attribute, text, or comment poisition.\n            //   * For node-position bindings we insert a comment with the marker\n            //     sentinel as its text content, like \x3c!--{{lit-guid}}--\x3e.\n            //   * For attribute bindings we insert just the marker sentinel for the\n            //     first binding, so that we support unquoted attribute bindings.\n            //     Subsequent bindings can use a comment marker because multi-binding\n            //     attributes must be quoted.\n            //   * For comment bindings we insert just the marker sentinel so we don\'t\n            //     close the comment.\n            //\n            // The following code scans the template source, but is *not* an HTML\n            // parser. We don\'t need to track the tree structure of the HTML, only\n            // whether a binding is inside a comment, and if not, if it appears to be\n            // the first binding in an attribute.\n            const commentOpen = s.lastIndexOf(\'\x3c!--\');\n            // We\'re in comment position if we have a comment open with no following\n            // comment close. Because <-- can appear in an attribute value there can\n            // be false positives.\n            isCommentBinding = (commentOpen > -1 || isCommentBinding) &&\n                s.indexOf(\'--\x3e\', commentOpen + 1) === -1;\n            // Check to see if we have an attribute-like sequence preceeding the\n            // expression. This can match "name=value" like structures in text,\n            // comments, and attribute values, so there can be false-positives.\n            const attributeMatch = _template_js__WEBPACK_IMPORTED_MODULE_1__["lastAttributeNameRegex"].exec(s);\n            if (attributeMatch === null) {\n                // We\'re only in this branch if we don\'t have a attribute-like\n                // preceeding sequence. For comments, this guards against unusual\n                // attribute values like <div foo="\x3c!--${\'bar\'}">. Cases like\n                // \x3c!-- foo=${\'bar\'}--\x3e are handled correctly in the attribute branch\n                // below.\n                html += s + (isCommentBinding ? commentMarker : _template_js__WEBPACK_IMPORTED_MODULE_1__["nodeMarker"]);\n            }\n            else {\n                // For attributes we use just a marker sentinel, and also append a\n                // $lit$ suffix to the name to opt-out of attribute-specific parsing\n                // that IE and Edge do for style and certain SVG attributes.\n                html += s.substr(0, attributeMatch.index) + attributeMatch[1] +\n                    attributeMatch[2] + _template_js__WEBPACK_IMPORTED_MODULE_1__["boundAttributeSuffix"] + attributeMatch[3] +\n                    _template_js__WEBPACK_IMPORTED_MODULE_1__["marker"];\n            }\n        }\n        html += this.strings[l];\n        return html;\n    }\n    getTemplateElement() {\n        const template = document.createElement(\'template\');\n        template.innerHTML = this.getHTML();\n        return template;\n    }\n}\n/**\n * A TemplateResult for SVG fragments.\n *\n * This class wraps HTML in an `<svg>` tag in order to parse its contents in the\n * SVG namespace, then modifies the template to remove the `<svg>` tag so that\n * clones only container the original fragment.\n */\nclass SVGTemplateResult extends TemplateResult {\n    getHTML() {\n        return `<svg>${super.getHTML()}</svg>`;\n    }\n    getTemplateElement() {\n        const template = super.getTemplateElement();\n        const content = template.content;\n        const svgElement = content.firstChild;\n        content.removeChild(svgElement);\n        Object(_dom_js__WEBPACK_IMPORTED_MODULE_0__["reparentNodes"])(content, svgElement.firstChild);\n        return template;\n    }\n}\n//# sourceMappingURL=template-result.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/template-result.js?')},"./node_modules/lit-html/lib/template.js":
/*!***********************************************!*\
  !*** ./node_modules/lit-html/lib/template.js ***!
  \***********************************************/
/*! exports provided: marker, nodeMarker, markerRegex, boundAttributeSuffix, Template, isTemplatePartActive, createMarker, lastAttributeNameRegex */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "marker", function() { return marker; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nodeMarker", function() { return nodeMarker; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "markerRegex", function() { return markerRegex; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "boundAttributeSuffix", function() { return boundAttributeSuffix; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Template", function() { return Template; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTemplatePartActive", function() { return isTemplatePartActive; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createMarker", function() { return createMarker; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lastAttributeNameRegex", function() { return lastAttributeNameRegex; });\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n * An expression marker with embedded unique key to avoid collision with\n * possible text in templates.\n */\nconst marker = `{{lit-${String(Math.random()).slice(2)}}}`;\n/**\n * An expression marker used text-positions, multi-binding attributes, and\n * attributes with markup-like text values.\n */\nconst nodeMarker = `\x3c!--${marker}--\x3e`;\nconst markerRegex = new RegExp(`${marker}|${nodeMarker}`);\n/**\n * Suffix appended to all bound attribute names.\n */\nconst boundAttributeSuffix = \'$lit$\';\n/**\n * An updateable Template that tracks the location of dynamic parts.\n */\nclass Template {\n    constructor(result, element) {\n        this.parts = [];\n        this.element = element;\n        const nodesToRemove = [];\n        const stack = [];\n        // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be null\n        const walker = document.createTreeWalker(element.content, 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */, null, false);\n        // Keeps track of the last index associated with a part. We try to delete\n        // unnecessary nodes, but we never want to associate two different parts\n        // to the same index. They must have a constant node between.\n        let lastPartIndex = 0;\n        let index = -1;\n        let partIndex = 0;\n        const { strings, values: { length } } = result;\n        while (partIndex < length) {\n            const node = walker.nextNode();\n            if (node === null) {\n                // We\'ve exhausted the content inside a nested template element.\n                // Because we still have parts (the outer for-loop), we know:\n                // - There is a template in the stack\n                // - The walker will find a nextNode outside the template\n                walker.currentNode = stack.pop();\n                continue;\n            }\n            index++;\n            if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {\n                if (node.hasAttributes()) {\n                    const attributes = node.attributes;\n                    const { length } = attributes;\n                    // Per\n                    // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap,\n                    // attributes are not guaranteed to be returned in document order.\n                    // In particular, Edge/IE can return them out of order, so we cannot\n                    // assume a correspondence between part index and attribute index.\n                    let count = 0;\n                    for (let i = 0; i < length; i++) {\n                        if (endsWith(attributes[i].name, boundAttributeSuffix)) {\n                            count++;\n                        }\n                    }\n                    while (count-- > 0) {\n                        // Get the template literal section leading up to the first\n                        // expression in this attribute\n                        const stringForPart = strings[partIndex];\n                        // Find the attribute name\n                        const name = lastAttributeNameRegex.exec(stringForPart)[2];\n                        // Find the corresponding attribute\n                        // All bound attributes have had a suffix added in\n                        // TemplateResult#getHTML to opt out of special attribute\n                        // handling. To look up the attribute value we also need to add\n                        // the suffix.\n                        const attributeLookupName = name.toLowerCase() + boundAttributeSuffix;\n                        const attributeValue = node.getAttribute(attributeLookupName);\n                        node.removeAttribute(attributeLookupName);\n                        const statics = attributeValue.split(markerRegex);\n                        this.parts.push({ type: \'attribute\', index, name, strings: statics });\n                        partIndex += statics.length - 1;\n                    }\n                }\n                if (node.tagName === \'TEMPLATE\') {\n                    stack.push(node);\n                    walker.currentNode = node.content;\n                }\n            }\n            else if (node.nodeType === 3 /* Node.TEXT_NODE */) {\n                const data = node.data;\n                if (data.indexOf(marker) >= 0) {\n                    const parent = node.parentNode;\n                    const strings = data.split(markerRegex);\n                    const lastIndex = strings.length - 1;\n                    // Generate a new text node for each literal section\n                    // These nodes are also used as the markers for node parts\n                    for (let i = 0; i < lastIndex; i++) {\n                        let insert;\n                        let s = strings[i];\n                        if (s === \'\') {\n                            insert = createMarker();\n                        }\n                        else {\n                            const match = lastAttributeNameRegex.exec(s);\n                            if (match !== null && endsWith(match[2], boundAttributeSuffix)) {\n                                s = s.slice(0, match.index) + match[1] +\n                                    match[2].slice(0, -boundAttributeSuffix.length) + match[3];\n                            }\n                            insert = document.createTextNode(s);\n                        }\n                        parent.insertBefore(insert, node);\n                        this.parts.push({ type: \'node\', index: ++index });\n                    }\n                    // If there\'s no text, we must insert a comment to mark our place.\n                    // Else, we can trust it will stick around after cloning.\n                    if (strings[lastIndex] === \'\') {\n                        parent.insertBefore(createMarker(), node);\n                        nodesToRemove.push(node);\n                    }\n                    else {\n                        node.data = strings[lastIndex];\n                    }\n                    // We have a part for each match found\n                    partIndex += lastIndex;\n                }\n            }\n            else if (node.nodeType === 8 /* Node.COMMENT_NODE */) {\n                if (node.data === marker) {\n                    const parent = node.parentNode;\n                    // Add a new marker node to be the startNode of the Part if any of\n                    // the following are true:\n                    //  * We don\'t have a previousSibling\n                    //  * The previousSibling is already the start of a previous part\n                    if (node.previousSibling === null || index === lastPartIndex) {\n                        index++;\n                        parent.insertBefore(createMarker(), node);\n                    }\n                    lastPartIndex = index;\n                    this.parts.push({ type: \'node\', index });\n                    // If we don\'t have a nextSibling, keep this node so we have an end.\n                    // Else, we can remove it to save future costs.\n                    if (node.nextSibling === null) {\n                        node.data = \'\';\n                    }\n                    else {\n                        nodesToRemove.push(node);\n                        index--;\n                    }\n                    partIndex++;\n                }\n                else {\n                    let i = -1;\n                    while ((i = node.data.indexOf(marker, i + 1)) !== -1) {\n                        // Comment node has a binding marker inside, make an inactive part\n                        // The binding won\'t work, but subsequent bindings will\n                        // TODO (justinfagnani): consider whether it\'s even worth it to\n                        // make bindings in comments work\n                        this.parts.push({ type: \'node\', index: -1 });\n                        partIndex++;\n                    }\n                }\n            }\n        }\n        // Remove text binding nodes after the walk to not disturb the TreeWalker\n        for (const n of nodesToRemove) {\n            n.parentNode.removeChild(n);\n        }\n    }\n}\nconst endsWith = (str, suffix) => {\n    const index = str.length - suffix.length;\n    return index >= 0 && str.slice(index) === suffix;\n};\nconst isTemplatePartActive = (part) => part.index !== -1;\n// Allows `document.createComment(\'\')` to be renamed for a\n// small manual size-savings.\nconst createMarker = () => document.createComment(\'\');\n/**\n * This regex extracts the attribute name preceding an attribute-position\n * expression. It does this by matching the syntax allowed for attributes\n * against the string literal directly preceding the expression, assuming that\n * the expression is in an attribute-value position.\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#elements-attributes\n *\n * " \\x09\\x0a\\x0c\\x0d" are HTML space characters:\n * https://www.w3.org/TR/html5/infrastructure.html#space-characters\n *\n * "\\0-\\x1F\\x7F-\\x9F" are Unicode control characters, which includes every\n * space character except " ".\n *\n * So an attribute is:\n *  * The name: any character except a control character, space character, (\'),\n *    ("), ">", "=", or "/"\n *  * Followed by zero or more space characters\n *  * Followed by "="\n *  * Followed by zero or more space characters\n *  * Followed by:\n *    * Any character except space, (\'), ("), "<", ">", "=", (`), or\n *    * (") then any non-("), or\n *    * (\') then any non-(\')\n */\nconst lastAttributeNameRegex = /([ \\x09\\x0a\\x0c\\x0d])([^\\0-\\x1F\\x7F-\\x9F "\'>=/]+)([ \\x09\\x0a\\x0c\\x0d]*=[ \\x09\\x0a\\x0c\\x0d]*(?:[^ \\x09\\x0a\\x0c\\x0d"\'`<>=]*|"[^"]*|\'[^\']*))$/;\n//# sourceMappingURL=template.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lib/template.js?')},"./node_modules/lit-html/lit-html.js":
/*!*******************************************!*\
  !*** ./node_modules/lit-html/lit-html.js ***!
  \*******************************************/
/*! exports provided: DefaultTemplateProcessor, defaultTemplateProcessor, directive, isDirective, removeNodes, reparentNodes, noChange, nothing, AttributeCommitter, AttributePart, BooleanAttributePart, EventPart, isIterable, isPrimitive, NodePart, PropertyCommitter, PropertyPart, parts, render, templateCaches, templateFactory, TemplateInstance, SVGTemplateResult, TemplateResult, createMarker, isTemplatePartActive, Template, html, svg */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "html", function() { return html; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return svg; });\n/* harmony import */ var _lib_default_template_processor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/default-template-processor.js */ "./node_modules/lit-html/lib/default-template-processor.js");\n/* harmony import */ var _lib_template_result_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/template-result.js */ "./node_modules/lit-html/lib/template-result.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DefaultTemplateProcessor", function() { return _lib_default_template_processor_js__WEBPACK_IMPORTED_MODULE_0__["DefaultTemplateProcessor"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultTemplateProcessor", function() { return _lib_default_template_processor_js__WEBPACK_IMPORTED_MODULE_0__["defaultTemplateProcessor"]; });\n\n/* harmony import */ var _lib_directive_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/directive.js */ "./node_modules/lit-html/lib/directive.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "directive", function() { return _lib_directive_js__WEBPACK_IMPORTED_MODULE_2__["directive"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDirective", function() { return _lib_directive_js__WEBPACK_IMPORTED_MODULE_2__["isDirective"]; });\n\n/* harmony import */ var _lib_dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/dom.js */ "./node_modules/lit-html/lib/dom.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeNodes", function() { return _lib_dom_js__WEBPACK_IMPORTED_MODULE_3__["removeNodes"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reparentNodes", function() { return _lib_dom_js__WEBPACK_IMPORTED_MODULE_3__["reparentNodes"]; });\n\n/* harmony import */ var _lib_part_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/part.js */ "./node_modules/lit-html/lib/part.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noChange", function() { return _lib_part_js__WEBPACK_IMPORTED_MODULE_4__["noChange"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nothing", function() { return _lib_part_js__WEBPACK_IMPORTED_MODULE_4__["nothing"]; });\n\n/* harmony import */ var _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/parts.js */ "./node_modules/lit-html/lib/parts.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AttributeCommitter", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["AttributeCommitter"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AttributePart", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["AttributePart"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BooleanAttributePart", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["BooleanAttributePart"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EventPart", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["EventPart"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["isIterable"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["isPrimitive"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NodePart", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["NodePart"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PropertyCommitter", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["PropertyCommitter"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PropertyPart", function() { return _lib_parts_js__WEBPACK_IMPORTED_MODULE_5__["PropertyPart"]; });\n\n/* harmony import */ var _lib_render_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/render.js */ "./node_modules/lit-html/lib/render.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parts", function() { return _lib_render_js__WEBPACK_IMPORTED_MODULE_6__["parts"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _lib_render_js__WEBPACK_IMPORTED_MODULE_6__["render"]; });\n\n/* harmony import */ var _lib_template_factory_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lib/template-factory.js */ "./node_modules/lit-html/lib/template-factory.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "templateCaches", function() { return _lib_template_factory_js__WEBPACK_IMPORTED_MODULE_7__["templateCaches"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "templateFactory", function() { return _lib_template_factory_js__WEBPACK_IMPORTED_MODULE_7__["templateFactory"]; });\n\n/* harmony import */ var _lib_template_instance_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lib/template-instance.js */ "./node_modules/lit-html/lib/template-instance.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TemplateInstance", function() { return _lib_template_instance_js__WEBPACK_IMPORTED_MODULE_8__["TemplateInstance"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SVGTemplateResult", function() { return _lib_template_result_js__WEBPACK_IMPORTED_MODULE_1__["SVGTemplateResult"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TemplateResult", function() { return _lib_template_result_js__WEBPACK_IMPORTED_MODULE_1__["TemplateResult"]; });\n\n/* harmony import */ var _lib_template_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lib/template.js */ "./node_modules/lit-html/lib/template.js");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createMarker", function() { return _lib_template_js__WEBPACK_IMPORTED_MODULE_9__["createMarker"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isTemplatePartActive", function() { return _lib_template_js__WEBPACK_IMPORTED_MODULE_9__["isTemplatePartActive"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Template", function() { return _lib_template_js__WEBPACK_IMPORTED_MODULE_9__["Template"]; });\n\n/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n/**\n *\n * Main lit-html module.\n *\n * Main exports:\n *\n * -  [[html]]\n * -  [[svg]]\n * -  [[render]]\n *\n * @module lit-html\n * @preferred\n */\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\n\n\n\n\n// TODO(justinfagnani): remove line when we get NodePart moving methods\n\n\n\n\n\n\n\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n// TODO(justinfagnani): inject version number at build time\n(window[\'litHtmlVersions\'] || (window[\'litHtmlVersions\'] = [])).push(\'1.1.2\');\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n */\nconst html = (strings, ...values) => new _lib_template_result_js__WEBPACK_IMPORTED_MODULE_1__["TemplateResult"](strings, values, \'html\', _lib_default_template_processor_js__WEBPACK_IMPORTED_MODULE_0__["defaultTemplateProcessor"]);\n/**\n * Interprets a template literal as an SVG template that can efficiently\n * render to and update a container.\n */\nconst svg = (strings, ...values) => new _lib_template_result_js__WEBPACK_IMPORTED_MODULE_1__["SVGTemplateResult"](strings, values, \'svg\', _lib_default_template_processor_js__WEBPACK_IMPORTED_MODULE_0__["defaultTemplateProcessor"]);\n//# sourceMappingURL=lit-html.js.map\n\n//# sourceURL=webpack:///./node_modules/lit-html/lit-html.js?')},"./src/demoData/bigData.js":
/*!*********************************!*\
  !*** ./src/demoData/bigData.js ***!
  \*********************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _main_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../main/constants */ "./src/main/constants.js");\n/* harmony import */ var _main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../main/helpers/DateManager */ "./src/main/helpers/DateManager.js");\n\n\n\nconst getRandom = (min = 0, max = 100) => {\n  return Math.floor(Math.random() * (+max - +min) + +min);\n};\n\nconst getTasks = () => {\n  const tasks = [];\n  let curDate = Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getDate"])("2020-01-01");\n\n  try {\n    for (let idx = 0; idx < 1000; idx++) {\n      let startDate = Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getFormattedDate"])(curDate, "YYYY-MM-DD");\n      let endDate = Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getNextUnit"])(curDate, "day", 100);\n      let _endDate = Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getFormattedDate"])(endDate, "YYYY-MM-DD");\n\n      tasks.push({\n        id: idx + 1,\n        name: `Task#${idx + 1}`,\n        percentDone: getRandom(0, 100),\n        type: idx === 0 ? "parent" : _main_constants__WEBPACK_IMPORTED_MODULE_0__["TASK_TYPES"][getRandom(1, 3)],\n        parent: idx === 0 ? null : 1,\n        startDate,\n        endDate: _endDate\n      });\n\n      curDate = Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getDate"])(startDate);\n    }\n  } catch (e) {\n    console.log(e);\n  }\n\n  return tasks;\n};\n\nconst getPositionMap = ({ tasks, config }) => {\n  const positionMap = {};\n\n  tasks.forEach(task => {\n    positionMap[task.id] = {\n      width: Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getDuration"])(task.startDate, task.endDate) * 50,\n      left: Object(_main_helpers_DateManager__WEBPACK_IMPORTED_MODULE_1__["getDuration"])("2019-01-01", task.startDate) * 50\n    };\n  });\n\n  return positionMap;\n};\n\n/* harmony default export */ __webpack_exports__["default"] = (({ config }) => {\n  const taskData = getTasks();\n\n  const startDate = taskData[0].startDate;\n  const endDate = taskData[taskData.length - 1].endDate;\n\n  return {\n    taskPositionMap: getPositionMap({\n      tasks: taskData,\n      config\n    }),\n    taskData,\n    startDate,\n    endDate\n  };\n});\n\n\n//# sourceURL=webpack:///./src/demoData/bigData.js?')},"./src/demoData/columns.js":
/*!*********************************!*\
  !*** ./src/demoData/columns.js ***!
  \*********************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__["default"] = (Object.freeze([\n  {\n    label: "Name",\n    name: "name",\n    width: 300,\n    type: "name"\n  },\n  {\n    label: "Percent Done",\n    name: "percentDone",\n    width: 80,\n    type: "percent"\n  },\n  {\n    label: "Type",\n    name: "type",\n    width: 100\n  }\n]));\n\n\n//# sourceURL=webpack:///./src/demoData/columns.js?')},"./src/demoData/config.js":
/*!********************************!*\
  !*** ./src/demoData/config.js ***!
  \********************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__["default"] = (Object.freeze({\n  headerHeight: 50,\n  gridWidth: 250,\n  rowHeight: 50,\n  barHeight: 24,\n  dateFormat: "YYYY-MM-DD",\n  startDate: "2020-01-01",\n  endDate: "2021-01-01"\n}));\n\n\n//# sourceURL=webpack:///./src/demoData/config.js?')},"./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/*! no exports provided */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./main */ "./src/main/index.js");\n\n\n\n//# sourceURL=webpack:///./src/index.js?')},"./src/main/constants.js":
/*!*******************************!*\
  !*** ./src/main/constants.js ***!
  \*******************************/
/*! exports provided: OVERSCAN_COUNT, GRID_SYNC_ELEMENTS, TIMELINE_SYNC_ELEMENTS, HEIRARCHY_PADDING, COLUMN_TYPES, ICON_TYPES, CELL_EXPAND_OR_COLLAPSE, TASK_TYPES */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OVERSCAN_COUNT", function() { return OVERSCAN_COUNT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GRID_SYNC_ELEMENTS", function() { return GRID_SYNC_ELEMENTS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TIMELINE_SYNC_ELEMENTS", function() { return TIMELINE_SYNC_ELEMENTS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HEIRARCHY_PADDING", function() { return HEIRARCHY_PADDING; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COLUMN_TYPES", function() { return COLUMN_TYPES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICON_TYPES", function() { return ICON_TYPES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CELL_EXPAND_OR_COLLAPSE", function() { return CELL_EXPAND_OR_COLLAPSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TASK_TYPES", function() { return TASK_TYPES; });\nconst OVERSCAN_COUNT = 1;\nconst GRID_SYNC_ELEMENTS = Object.freeze([\n  "#grid-header",\n  "#grid-body",\n  "#grid-virtual-scroller"\n]);\nconst TIMELINE_SYNC_ELEMENTS = Object.freeze([\n  "#timeline-header",\n  "#timeline-body",\n  "#timeline-virtual-scroller"\n]);\nconst HEIRARCHY_PADDING = 12;\nconst COLUMN_TYPES = Object.freeze({\n  NAME: "name",\n  PERCENT: "percent"\n});\nconst ICON_TYPES = Object.freeze({\n  ARROW_DOWN: "arrow-down",\n  ARROW_RIGHT: "arrow-right",\n  DOT: "dot"\n});\nconst CELL_EXPAND_OR_COLLAPSE = "CELL_EXPAND_OR_COLLAPSE";\nconst TASK_TYPES = Object.freeze(["parent", "task", "milestone"]);\n\n\n//# sourceURL=webpack:///./src/main/constants.js?')},"./src/main/helpers/DateManager.js":
/*!*****************************************!*\
  !*** ./src/main/helpers/DateManager.js ***!
  \*****************************************/
/*! exports provided: configureFormat, getDate, getFormattedDate, getNextUnit, getDuration */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "configureFormat", function() { return configureFormat; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDate", function() { return getDate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFormattedDate", function() { return getFormattedDate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNextUnit", function() { return getNextUnit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDuration", function() { return getDuration; });\nlet format = "YYYY-MM-DD HH:mm:ss";\nconst formatMap = {\n  YYYY: 0,\n  MM: 1,\n  DD: 2,\n  HH: 3,\n  mm: 4,\n  ss: 5\n};\nlet formatTokens = [];\n\nlet monthFullNames = {\n  0: "January",\n  1: "Febraury",\n  2: "March",\n  3: "April",\n  4: "May",\n  5: "June",\n  6: "July",\n  7: "August",\n  8: "September",\n  9: "October",\n  10: "November",\n  11: "December"\n};\n\nconst getFormatTokens = (f, excludeChar = true) => {\n  let str = "";\n  const arr = f.split("");\n  const result = [];\n\n  arr.forEach(a => {\n    if (a.match(/[A-Za-z]/)) {\n      str += a;\n    } else {\n      result.push(str);\n\n      if (!excludeChar) {\n        result.push(a);\n      }\n\n      str = "";\n    }\n  });\n\n  result.push(str);\n\n  return result;\n};\n\nconst configureFormat = f => {\n  format = f;\n\n  formatTokens = getFormatTokens(f);\n};\n\nconfigureFormat("DD/MM/YYYY HH:mm:ss");\n\nconst getDateTokens = d => {\n  let str = "";\n  const arr = d.split("");\n  const result = new Array(formatTokens.length).fill(null);\n  let counter = 0;\n\n  arr.forEach(a => {\n    if (!isNaN(parseInt(a))) {\n      str += a;\n    } else {\n      if (str) {\n        result[formatMap[formatTokens[counter]]] = str;\n        str = "";\n        counter++;\n      } else {\n        return;\n      }\n    }\n  });\n\n  if (str) {\n    result[formatMap[formatTokens[counter]]] = str;\n  }\n\n  result[1] = result[1] - 1;\n\n  return result;\n};\n\nconst getDate = d => {\n  return new Date(...getDateTokens(d));\n};\n\nconst padStr = val => {\n  return val < 10 ? "0" + val : val;\n};\n\nconst getFormattedDate = (date, fr) => {\n  const tokens = getFormatTokens(fr, false);\n\n  const result = tokens.map(token => {\n    switch (token) {\n      case "YYYY": {\n        return date.getFullYear();\n      }\n      case "MMMM": {\n        return monthFullNames[date.getMonth()];\n      }\n      case "MM": {\n        return padStr(date.getMonth() + 1);\n      }\n      case "DD": {\n        return padStr(date.getDate());\n      }\n      case "HH": {\n        return padStr(date.getHours());\n      }\n      case "mm": {\n        return padStr(date.getMinutes());\n      }\n      case "ss": {\n        return padStr(date.getSeconds());\n      }\n      default: {\n        return token;\n      }\n    }\n  });\n\n  return result\n    .join("")\n    .replace(/{/g, "")\n    .replace(/}/g, "");\n};\n\nconst getNextUnit = (date, unit = "day", count = 1) => {\n  switch (unit) {\n    case "day": {\n      return new Date(date.setDate(date.getDate() + count));\n    }\n    case "month": {\n      return new Date(date.setMonth(date.getMonth() + count));\n    }\n    case "year": {\n      return new Date(date.setFullYear(date.getFullYear() + count));\n    }\n  }\n};\n\nconst getDiff = (start, end) => {\n  return Math.abs(getDate(start).getTime() - getDate(end).getTime());\n};\n\nconst getDuration = (start, end, unit = "day") => {\n  switch (unit) {\n    case "day": {\n      return getDiff(start, end) / (1000 * 60 * 60 * 24);\n    }\n  }\n};\n\n\n\n\n//# sourceURL=webpack:///./src/main/helpers/DateManager.js?')},"./src/main/helpers/ElementManager.js":
/*!********************************************!*\
  !*** ./src/main/helpers/ElementManager.js ***!
  \********************************************/
/*! exports provided: querySelector, querySelectorAll, getAvaiableHeight, getAvailableWidth */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "querySelector", function() { return querySelector; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "querySelectorAll", function() { return querySelectorAll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAvaiableHeight", function() { return getAvaiableHeight; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAvailableWidth", function() { return getAvailableWidth; });\nconst querySelector = (shadowRoot, selector) => {\n  return shadowRoot.querySelector(selector);\n};\n\nconst querySelectorAll = (shadowRoot, selectors) => {\n  return selectors.map(selector => querySelector(shadowRoot, selector));\n};\n\nconst getAvaiableHeight = (shadowRoot, selector) => {\n  return querySelector(shadowRoot, selector).getBoundingClientRect().height;\n};\n\nconst getAvailableWidth = (shadowRoot, selector) => {\n  if (selector instanceof HTMLElement) {\n    return selector.getBoundingClientRect().width;\n  }\n\n  return querySelector(shadowRoot, selector).getBoundingClientRect().width;\n};\n\n\n//# sourceURL=webpack:///./src/main/helpers/ElementManager.js?')},"./src/main/helpers/IconManager.js":
/*!*****************************************!*\
  !*** ./src/main/helpers/IconManager.js ***!
  \*****************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "./src/main/constants.js");\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n\n\n\nconst { ARROW_DOWN, ARROW_RIGHT } = _constants__WEBPACK_IMPORTED_MODULE_0__["ICON_TYPES"];\n\nconst getRightArrow = () => {\n  return lit_element__WEBPACK_IMPORTED_MODULE_1__["html"]`\n    <svg height="8" width="8">\n      <polygon points="0,0,0,8,8,4" style="fill:black;"></polygon>\n      Sorry, your browser does not support inline SVG.\n    </svg>\n  `;\n};\n\nconst getDownArrow = () => {\n  return lit_element__WEBPACK_IMPORTED_MODULE_1__["html"]`\n    <svg height="8" width="8">\n      <polygon points="0,0,4,8,8,0" style="fill:black;" />\n      Sorry, your browser does not support inline SVG.\n    </svg>\n  `;\n};\n\nconst getCircle = () => {\n  return lit_element__WEBPACK_IMPORTED_MODULE_1__["html"]`\n    <svg height="10" width="10">\n      <circle cx="4" cy="4" r="3" fill="black" />\n      Sorry, your browser does not support inline SVG.\n    </svg>\n  `;\n};\n\nconst getIcon = icon => {\n  switch (icon) {\n    case ARROW_DOWN: {\n      return getDownArrow();\n    }\n    case ARROW_RIGHT: {\n      return getRightArrow();\n    }\n    default: {\n      return getCircle();\n    }\n  }\n};\n\n/* harmony default export */ __webpack_exports__["default"] = (getIcon);\n\n\n//# sourceURL=webpack:///./src/main/helpers/IconManager.js?')},"./src/main/helpers/ScrollSyncManager.js":
/*!***********************************************!*\
  !*** ./src/main/helpers/ScrollSyncManager.js ***!
  \***********************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScrollSyncManager; });\nclass ScrollSyncManager {\n  constructor(elements) {\n    this.elements = elements;\n    this.init();\n  }\n\n  init() {\n    const self = this;\n    let timeout;\n\n    this.elements.forEach(sync => {\n      sync.addEventListener("scroll", function callback(event) {\n        clearTimeout(timeout);\n\n        const source = event.target;\n        let targets;\n\n        if (event.target === self.elements[0]) {\n          targets = self.elements.slice(1);\n        } else if (event.target === self.elements[1]) {\n          targets = [self.elements[0], self.elements[2]];\n        } else {\n          targets = self.elements.slice(0, 2);\n        }\n\n        targets.forEach(target => {\n          target.removeEventListener("scroll", callback);\n          target.scrollLeft = source.scrollLeft;\n        });\n\n        timeout = setTimeout(() => {\n          targets.forEach(target => {\n            target.addEventListener("scroll", callback);\n          });\n        }, 100);\n      });\n    });\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/helpers/ScrollSyncManager.js?')},"./src/main/helpers/TimelineManager.js":
/*!*********************************************!*\
  !*** ./src/main/helpers/TimelineManager.js ***!
  \*********************************************/
/*! exports provided: getScaleData */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getScaleData", function() { return getScaleData; });\n/* harmony import */ var _DateManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./DateManager */ "./src/main/helpers/DateManager.js");\n\n\nconst getScaleData = (start, end) => {\n  const startDate = Object(_DateManager__WEBPACK_IMPORTED_MODULE_0__["getDate"])(start);\n  const endDate = Object(_DateManager__WEBPACK_IMPORTED_MODULE_0__["getDate"])(end).getTime();\n  let curDate = startDate;\n  let prevMonth = "";\n  let curMonth = curDate.getMonth();\n  const months = {};\n  let bottomCounterInTop = 0;\n  let monthsCounter = 0;\n  let days = [];\n\n  while (curDate.getTime() < endDate) {\n    curMonth = curDate.getMonth();\n\n    if (prevMonth !== curMonth) {\n      prevMonth = curMonth;\n\n      months[`${curDate.getFullYear()} - ${curDate.getMonth()}`] = {\n        label: Object(_DateManager__WEBPACK_IMPORTED_MODULE_0__["getFormattedDate"])(curDate, "MMMM, YYYY"),\n        index: monthsCounter\n      };\n\n      monthsCounter++;\n\n      bottomCounterInTop = 0;\n    }\n\n    bottomCounterInTop++;\n\n    days.push({\n      label: Object(_DateManager__WEBPACK_IMPORTED_MODULE_0__["getFormattedDate"])(curDate, "DD"),\n      index: days.length\n    });\n\n    months[`${curDate.getFullYear()} - ${curDate.getMonth()}`].width =\n      bottomCounterInTop * 50;\n\n    curDate = Object(_DateManager__WEBPACK_IMPORTED_MODULE_0__["getNextUnit"])(curDate);\n  }\n\n  return {\n    top: Object.values(months),\n    bottom: days\n  };\n};\n\n\n//# sourceURL=webpack:///./src/main/helpers/TimelineManager.js?')},"./src/main/helpers/WindowManager.js":
/*!*******************************************!*\
  !*** ./src/main/helpers/WindowManager.js ***!
  \*******************************************/
/*! exports provided: getEndPosition, getScrollWindow */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEndPosition", function() { return getEndPosition; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getScrollWindow", function() { return getScrollWindow; });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "./src/main/constants.js");\n\n\nconst isForward = (oldVal, newVal) => {\n  return newVal > oldVal;\n};\n\nconst getBottom = (visibleArea, newScroll) => {\n  return visibleArea + newScroll;\n};\n\nconst getPosition = (visibleArea, unitWidth) => {\n  return Math.ceil(visibleArea / unitWidth);\n};\n\nconst getEndPosition = ({ visibleArea, newScroll, unitWidth }) => {\n  return getPosition(getBottom(visibleArea, newScroll), unitWidth);\n};\n\nconst getScrollWindow = ({\n  oldScroll,\n  newScroll,\n  unitWidth,\n  visibleArea,\n  totalCount\n}) => {\n  const hasForward = isForward(oldScroll, newScroll);\n\n  let start = Math.floor(oldScroll / unitWidth);\n  let end = getEndPosition({\n    visibleArea,\n    newScroll,\n    unitWidth\n  });\n\n  if (hasForward) {\n    end += _constants__WEBPACK_IMPORTED_MODULE_0__["OVERSCAN_COUNT"];\n  } else {\n    start -= _constants__WEBPACK_IMPORTED_MODULE_0__["OVERSCAN_COUNT"];\n  }\n\n  start = start < 0 ? 0 : start;\n  end = end > totalCount ? totalCount : end;\n\n  return {\n    start,\n    end\n  };\n};\n\n\n//# sourceURL=webpack:///./src/main/helpers/WindowManager.js?')},"./src/main/index.js":
/*!***************************!*\
  !*** ./src/main/index.js ***!
  \***************************/
/*! no exports provided */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n/* harmony import */ var lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-html/directives/style-map */ "./node_modules/lit-html/directives/style-map.js");\n/* harmony import */ var _styles_index_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./styles/index.scss */ "./src/main/styles/index.scss");\n/* harmony import */ var lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lit-html/directives/repeat */ "./node_modules/lit-html/directives/repeat.js");\n/* harmony import */ var _demoData_config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../demoData/config */ "./src/demoData/config.js");\n/* harmony import */ var _demoData_columns__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../demoData/columns */ "./src/demoData/columns.js");\n/* harmony import */ var _helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers/WindowManager */ "./src/main/helpers/WindowManager.js");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./src/main/constants.js");\n/* harmony import */ var _helpers_ScrollSyncManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers/ScrollSyncManager */ "./src/main/helpers/ScrollSyncManager.js");\n/* harmony import */ var _helpers_ElementManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./helpers/ElementManager */ "./src/main/helpers/ElementManager.js");\n/* harmony import */ var _model_columns__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./model/columns */ "./src/main/model/columns/index.js");\n/* harmony import */ var _model_store_Tree__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./model/store/Tree */ "./src/main/model/store/Tree.js");\n/* harmony import */ var _helpers_TimelineManager__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./helpers/TimelineManager */ "./src/main/helpers/TimelineManager.js");\n/* harmony import */ var _helpers_DateManager__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./helpers/DateManager */ "./src/main/helpers/DateManager.js");\n/* harmony import */ var _demoData_bigData__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../demoData/bigData */ "./src/demoData/bigData.js");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass GanttElement extends lit_element__WEBPACK_IMPORTED_MODULE_0__["LitElement"] {\n  static get styles() {\n    return [_styles_index_scss__WEBPACK_IMPORTED_MODULE_2__["default"]];\n  }\n\n  static get properties() {\n    return {\n      config: {\n        type: Object\n      },\n      columns: {\n        type: Array\n      },\n      scaleData: {\n        type: Object\n      },\n      viewportScaleData: {\n        type: Object\n      },\n      scrollLeft: {\n        type: Number\n      },\n      scrollTop: {\n        type: Number\n      },\n      availableHeight: {\n        type: Number\n      },\n      availableWidth: {\n        type: Number\n      },\n      viewportTasks: {\n        type: Array\n      },\n      flatList: {\n        type: Array\n      },\n      totalColumnsWidth: {\n        type: Number\n      },\n      totalTimelineWidth: {\n        type: Number\n      },\n      totalBodyHeight: {\n        type: Number\n      },\n      maxTopScaleWidth: {\n        type: Number\n      }\n    };\n  }\n\n  constructor() {\n    super();\n\n    this.config = _demoData_config__WEBPACK_IMPORTED_MODULE_4__["default"];\n    this.viewportScaleData = {\n      top: [],\n      bottom: []\n    };\n    this.bottomScaleWidth = 50;\n    this.scrollLeft = 0;\n    this.scrollTop = 0;\n    this.availableWidth = 0;\n    this.availableHeight = 0;\n    this.totalTimelineWidth = 0;\n    this.totalBodyHeight = 0;\n    this.viewportTasks = [];\n    this.columns = Object(_model_columns__WEBPACK_IMPORTED_MODULE_10__["default"])(_demoData_columns__WEBPACK_IMPORTED_MODULE_5__["default"]);\n    this.taskPositionMap = {};\n    //this.taskPositionMap = taskPositionMap;\n    this.scaleData = [];\n    this.totalColumnsWidth = this.getTotalColumnsWidth();\n    this.tree = null;\n  }\n\n  get gridHeaderTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <section\n        class="fixed-container grid-header hide-scroll"\n        style="width: ${this.config.gridWidth}px; min-width: ${this.config\n          .gridWidth}px"\n        id="grid-header"\n      >\n        <div class="grid-inner-scroller">\n          ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n            this.columns,\n            column => column.name,\n            column => {\n              return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n                <div class="grid__cell" style="width: ${column.width}px">\n                  ${column.label}\n                </div>\n              `;\n            }\n          )}\n        </div>\n      </section>\n    `;\n  }\n\n  get topScaleTemplate() {\n    const scaleHeight = this.config.headerHeight / 2;\n    let awayFromYAxix = 0;\n\n    if (this.viewportScaleData.top.length > 0) {\n      const index = this.viewportScaleData.top[0].index;\n\n      for (let idx = 0; idx < index; idx++) {\n        awayFromYAxix += this.scaleData.top[idx].width;\n      }\n    }\n\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <div\n        class="scale"\n        style="height: ${scaleHeight}px; line-height: ${scaleHeight}px"\n      >\n        ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n          this.viewportScaleData.top,\n          item => item.index,\n          scale => {\n            const template = lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n              <div\n                class="scale__cell"\n                style="min-width: ${scale.width}px;width: ${scale.width}px; transform: translate(${awayFromYAxix}px, 0px);"\n                data-index="${scale.index}"\n              >\n                ${scale.label}\n              </div>\n            `;\n\n            awayFromYAxix += scale.width;\n\n            return template;\n          }\n        )}\n      </div>\n    `;\n  }\n\n  get timelineHeaderTemplate() {\n    const scaleHeight = this.config.headerHeight / 2;\n\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <section\n        class="flexible-container hide-scroll"\n        id="timeline-header"\n        @scroll="${this.handleTimelineHorizontalScroll}"\n      >\n        <div\n          class="scroll-area scale-area"\n          style=${Object(lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__["styleMap"])(this.timelineWidthStyles)}\n        >\n          ${this.topScaleTemplate}\n          <div\n            class="scale"\n            style="height: ${scaleHeight}px; line-height: ${scaleHeight}px"\n          >\n            ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n              this.viewportScaleData.bottom,\n              item => item.index,\n              scale => {\n                return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n                  <div\n                    class="scale__cell"\n                    style="min-width: ${this.bottomScaleWidth}px;width: ${this\n                      .bottomScaleWidth}px; transform: translate(${scale.index *\n                      this.bottomScaleWidth}px, 0px)"\n                    data-index="${scale.index}"\n                  >\n                    ${scale.label}\n                  </div>\n                `;\n              }\n            )}\n          </div>\n        </div>\n      </section>\n    `;\n  }\n\n  get headerTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <header\n        class="header grid"\n        style="height: ${this.config.headerHeight}px; min-height: ${this.config\n          .headerHeight}px"\n      >\n        ${this.gridHeaderTemplate} ${this.timelineHeaderTemplate}\n      </header>\n    `;\n  }\n\n  get gridBodyTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <section\n        class="fixed-container grid-body hide-scroll"\n        style="width: ${this.config.gridWidth}px; min-width: ${this.config\n          .gridWidth}px; height: ${this.totalBodyHeight}px"\n        id="grid-body"\n      >\n        <div\n          class="grid-inner-scroller"\n          style="width: ${this.totalColumnsWidth}px"\n        >\n          ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n            this.viewportTasks,\n            item => item.get("id"),\n            taskNode => {\n              return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n                <div\n                  class="grid__row"\n                  style="transform: translate(0px, ${taskNode.$index *\n                    this.config.rowHeight}px); height: ${this.config\n                    .rowHeight}px"\n                  data-index="${taskNode.$index}"\n                >\n                  ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n                    this.columns,\n                    column => column.name,\n                    column => column.render(taskNode)\n                  )}\n                </div>\n              `;\n            }\n          )}\n        </div>\n      </section>\n    `;\n  }\n\n  get timelineBodyTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <section\n            style="height: ${this.totalBodyHeight}px; background-size: 1px ${\n      this.config.rowHeight\n    }px; background-position: left 1px top ${this.config.rowHeight - 1}px"\n            class="body-main-container hide-scroll"\n            id="timeline-body"\n            @scroll="${this.handleTimelineHorizontalScroll}"\n          >\n            <div class="body-main-wrapper" style=${Object(lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__["styleMap"])(\n              this.timelineWidthStyles\n            )}>\n              <div\n                class="scroll-area timeline-body"\n                style=${Object(lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__["styleMap"])({\n                  ...this.timelineWidthStyles,\n                  backgroundSize: `${this.bottomScaleWidth}px 1px`,\n                  backgroundPosition: `left ${this.bottomScaleWidth -\n                    1}px top 1px`\n                })}\n              >\n                <div class="area__bars timeline-layer">\n                  ${Object(lit_html_directives_repeat__WEBPACK_IMPORTED_MODULE_3__["repeat"])(\n                    this.viewportTasks,\n                    item => item.get("id"),\n                    taskNode => {\n                      const position = this.taskPositionMap[taskNode.get("id")];\n                      const isMilestone = taskNode.get("type") === "milestone";\n\n                      return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n                        <div\n                          class="timeline__row"\n                          style="transform: translate(0px, ${taskNode.$index *\n                            this.config.rowHeight}px); height: ${this.config\n                            .rowHeight}px"\n                          data-index="${taskNode.get("id")}"\n                        >\n                          <div\n                            class="task__container"\n                            style=${Object(lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__["styleMap"])({\n                              height: `${this.config.barHeight}px`,\n                              transform: `translateX(${position.left}px)`,\n                              width: `${\n                                isMilestone\n                                  ? this.config.barHeight\n                                  : position.width\n                              }px`\n                            })}\n                          >\n                            <div class="task__wrapper">\n                              <div\n                                class="task${taskNode.get("type") === "parent"\n                                  ? " task__parent"\n                                  : ""}${isMilestone ? " task__milestone" : ""}"\n                              >\n                                <div\n                                  class="task__progress"\n                                  style="width: ${taskNode.get("percentDone")}%"\n                                ></div>\n                              </div>\n                            </div>\n                          </div>\n                        </div>\n                      `;\n                    }\n                  )}\n                </div>\n              </div>\n            </div>\n          </section>\n        </section>\n    `;\n  }\n\n  get virtualScrollTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <footer class="grid virtual-scroll">\n        <section\n          class="fixed-container enable-scroll"\n          style="width: ${this.config.gridWidth}px; min-width: ${this.config\n            .gridWidth}px"\n          id="grid-virtual-scroller"\n        >\n          <div\n            class="scroll-area"\n            style="width: ${this.totalColumnsWidth}px;min-width: ${this\n              .totalColumnsWidth}px;"\n          ></div>\n        </section>\n        <section class="flexible-container" id="timeline-virtual-scroller">\n          <div\n            class="scroll-area"\n            style=${Object(lit_html_directives_style_map__WEBPACK_IMPORTED_MODULE_1__["styleMap"])(this.timelineWidthStyles)}\n          ></div>\n        </section>\n      </footer>\n    `;\n  }\n\n  get bodyTemplate() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <section class="body-container">\n        <section class="inner-scroller" @scroll="${this.handleVerticalScroll}">\n          ${this.gridBodyTemplate} ${this.timelineBodyTemplate}\n        </section>\n        ${this.virtualScrollTemplate}\n      </section>\n    `;\n  }\n\n  render() {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <div class="container">\n        ${this.headerTemplate} ${this.bodyTemplate}\n        <div class="x-resizer" style="left: ${this.config.gridWidth}px"></div>\n      </div>\n    `;\n  }\n\n  getTotalBodyHeight() {\n    const bodyHeight = this.flatList.length * this.config.rowHeight;\n\n    return bodyHeight < this.availableHeight\n      ? this.availableHeight\n      : bodyHeight;\n  }\n\n  getTotalTimelineWidth() {\n    return this.scaleData.bottom.length * this.bottomScaleWidth;\n  }\n\n  getMaxTopScaleWidth() {\n    const top = this.scaleData.top;\n    let max = -Infinity;\n\n    for (let idx = 0; idx < top.length; idx++) {\n      if (top[idx].width > max) {\n        max = top[idx].width;\n      }\n    }\n\n    return max;\n  }\n\n  getTotalColumnsWidth() {\n    const length = this.columns.length;\n    let sum = 0;\n\n    for (let idx = 0; idx < length; idx++) {\n      sum += this.columns[idx].width;\n    }\n\n    return sum;\n  }\n\n  handleVerticalScroll(e) {\n    const indices = Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getScrollWindow"])({\n      oldScroll: this.scrollTop,\n      newScroll: e.target.scrollTop,\n      visibleArea: this.availableHeight,\n      totalCount: this.flatList.length,\n      unitWidth: this.config.rowHeight\n    });\n\n    this.scrollTop = e.target.scrollTop;\n    this.viewportTasks = this.flatList.slice(indices.start, indices.end);\n  }\n\n  handleTimelineHorizontalScroll(e) {\n    if (this.scrollLeft === e.target.scrollLeft) {\n      return;\n    }\n\n    const topIndices = Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getScrollWindow"])({\n      oldScroll: this.scrollLeft,\n      newScroll: e.target.scrollLeft,\n      visibleArea: this.availableWidth,\n      totalCount: this.scaleData.top.length,\n      unitWidth: this.maxTopScaleWidth\n    });\n    const bottomIndices = Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getScrollWindow"])({\n      oldScroll: this.scrollLeft,\n      newScroll: e.target.scrollLeft,\n      visibleArea: this.availableWidth,\n      totalCount: this.scaleData.bottom.length,\n      unitWidth: this.bottomScaleWidth\n    });\n\n    this.scrollLeft = e.target.scrollLeft;\n    this.viewportScaleData = {\n      top: this.scaleData.top.slice(topIndices.start, topIndices.end),\n      bottom: this.scaleData.bottom.slice(\n        bottomIndices.start,\n        bottomIndices.end\n      )\n    };\n  }\n\n  updateViewportTasks() {\n    this.flatList = this.tree.getFlatList();\n\n    this.viewportTasks = this.flatList.slice(\n      0,\n      Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getEndPosition"])({\n        visibleArea: this.availableHeight,\n        newScroll: this.scrollTop,\n        unitWidth: this.config.rowHeight\n      }) + _constants__WEBPACK_IMPORTED_MODULE_7__["OVERSCAN_COUNT"]\n    );\n\n    this.totalBodyHeight = this.getTotalBodyHeight();\n  }\n\n  firstUpdated() {\n    const timelineSyncElements = Object(_helpers_ElementManager__WEBPACK_IMPORTED_MODULE_9__["querySelectorAll"])(\n      this.shadowRoot,\n      _constants__WEBPACK_IMPORTED_MODULE_7__["TIMELINE_SYNC_ELEMENTS"]\n    );\n    const gridSyncElements = Object(_helpers_ElementManager__WEBPACK_IMPORTED_MODULE_9__["querySelectorAll"])(\n      this.shadowRoot,\n      _constants__WEBPACK_IMPORTED_MODULE_7__["GRID_SYNC_ELEMENTS"]\n    );\n\n    // Enable scroll sync for grid and timeline\n    new _helpers_ScrollSyncManager__WEBPACK_IMPORTED_MODULE_8__["default"](timelineSyncElements);\n    new _helpers_ScrollSyncManager__WEBPACK_IMPORTED_MODULE_8__["default"](gridSyncElements);\n\n    // Calculate available width of timeline and height of body container\n    this.availableHeight = Object(_helpers_ElementManager__WEBPACK_IMPORTED_MODULE_9__["getAvaiableHeight"])(\n      this.shadowRoot,\n      ".body-container"\n    );\n    this.availableWidth = Object(_helpers_ElementManager__WEBPACK_IMPORTED_MODULE_9__["getAvailableWidth"])(\n      this.shadowRoot,\n      timelineSyncElements[0]\n    );\n\n    Object(_helpers_DateManager__WEBPACK_IMPORTED_MODULE_13__["configureFormat"])(this.config.dateFormat);\n    const myData = Object(_demoData_bigData__WEBPACK_IMPORTED_MODULE_14__["default"])({\n      config: this.config\n    });\n    this.taskPositionMap = myData.taskPositionMap;\n    this.tree = new _model_store_Tree__WEBPACK_IMPORTED_MODULE_11__["default"](myData.taskData);\n    this.scaleData = Object(_helpers_TimelineManager__WEBPACK_IMPORTED_MODULE_12__["getScaleData"])("2019-01-01", "2022-01-01");\n\n    // Viewport task list\n    this.updateViewportTasks();\n\n    // Total width of timeline\n    this.totalTimelineWidth = this.getTotalTimelineWidth();\n\n    // Calculate timescale data\n    this.maxTopScaleWidth = this.getMaxTopScaleWidth();\n    this.viewportScaleData = {\n      top: this.scaleData.top.slice(\n        0,\n        Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getEndPosition"])({\n          visibleArea: this.availableWidth,\n          newScroll: this.scrollLeft,\n          unitWidth: this.maxTopScaleWidth\n        }) + _constants__WEBPACK_IMPORTED_MODULE_7__["OVERSCAN_COUNT"]\n      ),\n      bottom: this.scaleData.bottom.slice(\n        0,\n        Object(_helpers_WindowManager__WEBPACK_IMPORTED_MODULE_6__["getEndPosition"])({\n          visibleArea: this.availableWidth,\n          newScroll: this.scrollLeft,\n          unitWidth: this.bottomScaleWidth\n        }) + _constants__WEBPACK_IMPORTED_MODULE_7__["OVERSCAN_COUNT"]\n      )\n    };\n\n    this.timelineWidthStyles = {\n      width: `${this.totalTimelineWidth}px`,\n      minWidth: `${this.totalTimelineWidth}px`\n    };\n\n    this.shadowRoot.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_7__["CELL_EXPAND_OR_COLLAPSE"], event => {\n      const taskNode = event.detail;\n\n      taskNode.$expanded = !taskNode.$expanded;\n      this.updateViewportTasks();\n    });\n  }\n}\n\nwindow.customElements.define("dr-gantt", GanttElement);\n\n\n//# sourceURL=webpack:///./src/main/index.js?')},"./src/main/model/columns/Column.js":
/*!******************************************!*\
  !*** ./src/main/model/columns/Column.js ***!
  \******************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Column; });\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n\n\nclass Column {\n  constructor({ name, width = 100, type, label }) {\n    this.name = name;\n    this.label = label;\n    this.width = width;\n    this.type = type;\n  }\n\n  render(taskNode) {\n    return lit_element__WEBPACK_IMPORTED_MODULE_0__["html"]`\n      <div class="grid__cell" style="width: ${this.width}px">\n        ${taskNode.get(this.name)}\n      </div>\n    `;\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/model/columns/Column.js?')},"./src/main/model/columns/Name.js":
/*!****************************************!*\
  !*** ./src/main/model/columns/Name.js ***!
  \****************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Name; });\n/* harmony import */ var _Column__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Column */ "./src/main/model/columns/Column.js");\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../constants */ "./src/main/constants.js");\n/* harmony import */ var _helpers_IconManager__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../helpers/IconManager */ "./src/main/helpers/IconManager.js");\n\n\n\n\n\nconst { ARROW_DOWN, ARROW_RIGHT, DOT } = _constants__WEBPACK_IMPORTED_MODULE_2__["ICON_TYPES"];\n\nclass Name extends _Column__WEBPACK_IMPORTED_MODULE_0__["default"] {\n  constructor(column) {\n    super(column);\n  }\n\n  onClick(event, taskNode) {\n    const ev = new CustomEvent(_constants__WEBPACK_IMPORTED_MODULE_2__["CELL_EXPAND_OR_COLLAPSE"], {\n      detail: taskNode\n    });\n\n    event.target.getRootNode().dispatchEvent(ev);\n  }\n\n  render(taskNode) {\n    return lit_element__WEBPACK_IMPORTED_MODULE_1__["html"]`\n      <div class="grid__cell" style="width: ${this.width}px">\n        <div\n          class="grid__cell__inner"\n          style="padding-left: ${taskNode.$level * _constants__WEBPACK_IMPORTED_MODULE_2__["HEIRARCHY_PADDING"]}px"\n        >\n          <span\n            class="grid__cell__icon${taskNode.length === 0 ? " leaf" : ""}"\n            @click="${taskNode.length === 0\n              ? null\n              : e => this.onClick(e, taskNode)}"\n            tabindex="${taskNode.length === 0 ? -1 : 0}"\n          >\n            ${taskNode.get("type") !== "parent"\n              ? Object(_helpers_IconManager__WEBPACK_IMPORTED_MODULE_3__["default"])(DOT)\n              : !taskNode.$expanded\n              ? Object(_helpers_IconManager__WEBPACK_IMPORTED_MODULE_3__["default"])(ARROW_RIGHT)\n              : Object(_helpers_IconManager__WEBPACK_IMPORTED_MODULE_3__["default"])(ARROW_DOWN)}\n          </span>\n          ${taskNode.get(this.name)}\n        </div>\n      </div>\n    `;\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/model/columns/Name.js?')},"./src/main/model/columns/Percent.js":
/*!*******************************************!*\
  !*** ./src/main/model/columns/Percent.js ***!
  \*******************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Percent; });\n/* harmony import */ var _Column__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Column */ "./src/main/model/columns/Column.js");\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n\n\n\nclass Percent extends _Column__WEBPACK_IMPORTED_MODULE_0__["default"] {\n  constructor(column) {\n    super(column);\n  }\n\n  render(taskNode) {\n    return lit_element__WEBPACK_IMPORTED_MODULE_1__["html"]`\n      <div class="grid__cell" style="width: ${this.width}px">\n        <div class="grid__cell__percent">\n          <div\n            class="grid__cell__progress"\n            style="width: ${taskNode.get("percentDone")}%;"\n          ></div>\n        </div>\n      </div>\n    `;\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/model/columns/Percent.js?')},"./src/main/model/columns/index.js":
/*!*****************************************!*\
  !*** ./src/main/model/columns/index.js ***!
  \*****************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Name__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Name */ "./src/main/model/columns/Name.js");\n/* harmony import */ var _Column__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Column */ "./src/main/model/columns/Column.js");\n/* harmony import */ var _Percent__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Percent */ "./src/main/model/columns/Percent.js");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../constants */ "./src/main/constants.js");\n\n\n\n\n\nconst { NAME, PERCENT } = _constants__WEBPACK_IMPORTED_MODULE_3__["COLUMN_TYPES"];\n\n/* harmony default export */ __webpack_exports__["default"] = (columns => {\n  return columns.map(column => {\n    switch (column.type) {\n      case NAME: {\n        return new _Name__WEBPACK_IMPORTED_MODULE_0__["default"](column);\n      }\n      case PERCENT: {\n        return new _Percent__WEBPACK_IMPORTED_MODULE_2__["default"](column);\n      }\n      default: {\n        return new _Column__WEBPACK_IMPORTED_MODULE_1__["default"](column);\n      }\n    }\n  });\n});\n\n\n//# sourceURL=webpack:///./src/main/model/columns/index.js?')},"./src/main/model/store/Node.js":
/*!**************************************!*\
  !*** ./src/main/model/store/Node.js ***!
  \**************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Node; });\nclass Node {\n  constructor(data) {\n    this.data = data;\n    this.length = 0;\n    this.children = [];\n    this.parent = null;\n    this.$index = null;\n    this.$level = null;\n    this.$expanded = true;\n  }\n\n  set(key, value) {\n    return !!(this.data[key] = value);\n  }\n\n  get(key) {\n    return this.data[key];\n  }\n\n  add(child) {\n    const node = child instanceof Node ? child : new Node(child);\n\n    node.parent = this;\n    this.children.push(node);\n    this.length++;\n\n    return this.length;\n  }\n\n  remove(id) {\n    const idx = this.findIndex(id);\n    const removedItems = [];\n\n    if (idx > -1) {\n      const removedItem = this.children[idx];\n\n      this.children.splice(idx, 1);\n      this.length--;\n\n      removedItems.push(removedItem);\n    }\n\n    return removedItems;\n  }\n\n  findIndex(id) {\n    for (let i = 0; i < this.children.length; i++) {\n      if (this.children[i].id === id) {\n        return i;\n      }\n    }\n\n    return -1;\n  }\n\n  getPath() {\n    let current = this;\n    let path = [];\n\n    while (current && current.parent) {\n      path.push(current.get("id"));\n      current = current.parent;\n    }\n\n    return path;\n  }\n\n  getLevel() {\n    return this.getPath().length - 1;\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/model/store/Node.js?')},"./src/main/model/store/Tree.js":
/*!**************************************!*\
  !*** ./src/main/model/store/Tree.js ***!
  \**************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Tree; });\n/* harmony import */ var _Node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Node */ "./src/main/model/store/Node.js");\n\n\nclass Tree {\n  constructor(tasks = []) {\n    this.head = new _Node__WEBPACK_IMPORTED_MODULE_0__["default"](null);\n    this.head.$expanded = true;\n    this.nodeList = {};\n\n    tasks.forEach(task => {\n      const node = new _Node__WEBPACK_IMPORTED_MODULE_0__["default"](task);\n\n      this.nodeList[node.get("id")] = node;\n    });\n\n    this.buildTree(tasks);\n  }\n\n  getTask(id) {\n    return this.nodeList[id];\n  }\n\n  buildTree(tasks) {\n    tasks.forEach(task => {\n      const node = this.getTask(task.id);\n\n      if (node.get("parent") === null) {\n        this.head.add(node);\n      } else {\n        const parent = this.getTask(node.get("parent"));\n\n        parent.add(node);\n      }\n    });\n  }\n\n  getFlatList() {\n    const list = [];\n    let counter = 0;\n\n    const buildFlatList = currentNode => {\n      for (let idx = 0; idx < currentNode.children.length; idx++) {\n        if (currentNode.$expanded) {\n          const node = currentNode.children[idx];\n\n          node.$index = counter;\n          node.$level = node.getLevel();\n\n          list.push(node);\n\n          counter++;\n          buildFlatList(currentNode.children[idx]);\n        }\n      }\n    };\n\n    buildFlatList(this.head);\n\n    return list;\n  }\n}\n\n\n//# sourceURL=webpack:///./src/main/model/store/Tree.js?')},"./src/main/styles/index.scss":
/*!************************************!*\
  !*** ./src/main/styles/index.scss ***!
  \************************************/
/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var lit_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lit-element */ "./node_modules/lit-element/lit-element.js");\n /* harmony default export */ __webpack_exports__["default"] = (lit_element__WEBPACK_IMPORTED_MODULE_0__["css"]`*{box-sizing:border-box;color:#424242}.container,.flexible-container,.fluid-container,.grid,:host{width:100%;height:100%}.align-items-center{align-items:center}.justify-content-center{justify-content:center}.container,.flex-container,.grid{display:-webkit-box;display:-ms-flexbox;display:flex}.flex-rows,.grid{-ms-flex-direction:row;flex-direction:row}.container,.flex-columns{-ms-flex-direction:column;flex-direction:column}:host{position:relative}.container{overflow:hidden;position:relative}.hide-scroll{-ms-overflow-style:none;scrollbar-width:none}.hide-scroll::-webkit-scrollbar{display:none}.scroll-container{overflow-x:auto}.flexible-container{overflow-x:auto;overscroll-behavior:none}.scroll-area{height:inherit}.header{background-color:#c0c0c026;border-bottom:1px solid #eee}.body{overflow-y:auto}.scale{position:relative;border-bottom:1px solid #fafafa;background-color:#fafafa;font-weight:700;display:block}.scale:last-child{border-bottom:none;font-weight:400;background-color:#fff}.scale__cell{height:inherit;border-right:1px solid #eee;position:absolute;display:table-cell;overflow:hidden;white-space:nowrap;text-align:center;vertical-align:middle;padding:0 3px}.timeline-body{height:100%;background:transparent url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><line stroke-width="2" stroke="rgb(238,238,238)" x1="0" y1="0" x2="0" y2="5"></line></svg>\') 50% repeat}.virtual-scroll{height:16px;position:absolute;bottom:0}.virtual-scroll .fixed-container{border-right:none}.body-container{position:relative;height:100%;width:100%;display:flex;flex:1}.inner-scroller{position:absolute;height:100%;width:100%;top:0;left:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:row}.body-main-container{overflow-x:auto;overflow-y:hidden;position:relative;background:transparent url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg"><line stroke-width="2" stroke="rgb(238,238,238)" x1="0" y1="0" x2="5" y2="0"></line></svg>\') 50% repeat}.body-main-wrapper{height:100%}.grid-header{display:flex;align-items:center;font-weight:700;overflow-x:auto;overflow-y:hidden}.grid-body{position:relative;overflow-x:auto;overflow-y:hidden;height:100%}.grid__row{position:absolute;width:100%;border-bottom:1px solid #eee;display:flex;align-items:center}.timeline__row{position:absolute;width:100%;display:flex;align-items:center;pointer-events:all}.timeline-layer{position:absolute;left:0;top:0;width:inherit;height:inherit;pointer-events:none}.task__container{position:absolute}.task__wrapper{height:100%;width:inherit}.task{border:1px solid #7e3ff2;height:100%;border-radius:3px;background-color:#d4bff9;position:absolute;top:0;left:0;width:inherit}.task__progress{position:absolute;height:100%;background-color:#9965f4}.task__parent{background-color:#9e9e9e;border-color:#424242;height:70%;border:none;border-radius:0}.task__parent::after{content:"";position:absolute;right:0;bottom:-8px;width:0;height:0;border-left:4px solid transparent;border-right:4px solid #9e9e9e;border-top:4px solid #9e9e9e;border-bottom:4px solid transparent;clear:both}.task__parent::before{content:"";position:absolute;left:0;bottom:-8px;width:0;height:0;border-left:4px solid #9e9e9e;border-right:4px solid transparent;border-top:4px solid #9e9e9e;border-bottom:4px solid transparent;clear:both}.task__parent .task__progress{background-color:#616161}.task__milestone{border-color:#ffaf49;background-color:#ffddb0;display:flex;align-items:center;justify-content:center}.task__milestone .task{display:flex;align-items:center;justify-content:center}.task__milestone .task__progress{background-color:#ff9e22;transform:rotate(45deg);display:flex;align-items:center;justify-content:center;border-radius:3px;border:1px solid orange;background-color:#fff;width:18px!important;height:18px!important}.grid-inner-scroller{display:flex;height:100%;position:relative}.grid__cell{display:flex;align-items:center;padding:10px;height:100%;border-right:1px solid #eee;background-color:#fff}.grid__cell:last-child{border-right:none}.grid__cell__inner{width:100%;height:100%;display:flex;align-items:center}.grid__cell__icon{display:flex;width:10px;margin-right:3px}.grid__cell__icon:hover:not(.leaf){cursor:pointer}.enable-scroll{overflow-x:auto;overflow-y:hidden}.enable-scroll .scroll-area{height:100%}.grid__cell__percent{background-color:#fafafa;width:100%;height:10px;display:flex;position:relative}.grid__cell__progress{position:absolute;background-color:#0091ea;height:100%}.x-resizer{position:absolute;height:100%;width:3px;background-color:#e0e0e0}`);\n    \n\n//# sourceURL=webpack:///./src/main/styles/index.scss?')}});
//# sourceMappingURL=/sm/4fb4a06db39870e0cc82a108055b314da62b8ed27e0260be7b7769383a9be333.map