<!-- @license Copyright (c) 2015 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><!-- @license Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><link rel="import" href="polymer-mini.html"><script>(function () { Polymer.nar = []; var disableUpgradeEnabled = Polymer.Settings.disableUpgradeEnabled; Polymer.Annotations = { parseAnnotations: function (template, stripWhiteSpace) { var list = []; var content = template._content || template.content; this._parseNodeAnnotations(content, list, stripWhiteSpace || template.hasAttribute('strip-whitespace')); return list; }, _parseNodeAnnotations: function (node, list, stripWhiteSpace) { return node.nodeType === Node.TEXT_NODE ? this._parseTextNodeAnnotation(node, list) : this._parseElementAnnotations(node, list, stripWhiteSpace); }, _bindingRegex: function () { var IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')'; var NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')'; var SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')'; var DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')'; var STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')'; var ARGUMENT = '(?:' + IDENT + '|' + NUMBER + '|' + STRING + '\\s*' + ')'; var ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')'; var ARGUMENT_LIST = '(?:' + '\\(\\s*' + '(?:' + ARGUMENTS + '?' + ')' + '\\)\\s*' + ')'; var BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')'; var OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*'; var CLOSE_BRACKET = '(?:]]|}})'; var NEGATE = '(?:(!)\\s*)?'; var EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET; return new RegExp(EXPRESSION, 'g'); }(), _parseBindings: function (text) { var re = this._bindingRegex; var parts = []; var lastIndex = 0; var m; while ((m = re.exec(text)) !== null) { if (m.index > lastIndex) { parts.push({ literal: text.slice(lastIndex, m.index) }); } var mode = m[1][0]; var negate = Boolean(m[2]); var value = m[3].trim(); var customEvent, notifyEvent, colon; if (mode == '{' && (colon = value.indexOf('::')) > 0) { notifyEvent = value.substring(colon + 2); value = value.substring(0, colon); customEvent = true; } parts.push({ compoundIndex: parts.length, value: value, mode: mode, negate: negate, event: notifyEvent, customEvent: customEvent }); lastIndex = re.lastIndex; } if (lastIndex && lastIndex < text.length) { var literal = text.substring(lastIndex); if (literal) { parts.push({ literal: literal }); } } if (parts.length) { return parts; } }, _literalFromParts: function (parts) { var s = ''; for (var i = 0; i < parts.length; i++) { var literal = parts[i].literal; s += literal || ''; } return s; }, _parseTextNodeAnnotation: function (node, list) { var parts = this._parseBindings(node.textContent); if (parts) { node.textContent = this._literalFromParts(parts) || ' '; var annote = { bindings: [{ kind: 'text', name: 'textContent', parts: parts, isCompound: parts.length !== 1 }] }; list.push(annote); return annote; } }, _parseElementAnnotations: function (element, list, stripWhiteSpace) { var annote = { bindings: [], events: [] }; if (element.localName === 'content') { list._hasContent = true; } this._parseChildNodesAnnotations(element, annote, list, stripWhiteSpace); if (element.attributes) { this._parseNodeAttributeAnnotations(element, annote, list); if (this.prepElement) { this.prepElement(element); } } if (annote.bindings.length || annote.events.length || annote.id) { list.push(annote); } return annote; }, _parseChildNodesAnnotations: function (root, annote, list, stripWhiteSpace) { if (root.firstChild) { var node = root.firstChild; var i = 0; while (node) { var next = node.nextSibling; if (node.localName === 'template' && !node.hasAttribute('preserve-content')) { this._parseTemplate(node, i, list, annote, stripWhiteSpace); } if (node.localName == 'slot') { node = this._replaceSlotWithContent(node); } if (node.nodeType === Node.TEXT_NODE) { var n = next; while (n && n.nodeType === Node.TEXT_NODE) { node.textContent += n.textContent; next = n.nextSibling; root.removeChild(n); n = next; } if (stripWhiteSpace && !node.textContent.trim()) { root.removeChild(node); i--; } } if (node.parentNode) { var childAnnotation = this._parseNodeAnnotations(node, list, stripWhiteSpace); if (childAnnotation) { childAnnotation.parent = annote; childAnnotation.index = i; } } node = next; i++; } } }, _replaceSlotWithContent: function (slot) { var content = slot.ownerDocument.createElement('content'); while (slot.firstChild) { content.appendChild(slot.firstChild); } var attrs = slot.attributes; for (var i = 0; i < attrs.length; i++) { var attr = attrs[i]; content.setAttribute(attr.name, attr.value); } var name = slot.getAttribute('name'); if (name) { content.setAttribute('select', '[slot=\'' + name + '\']'); } slot.parentNode.replaceChild(content, slot); return content; }, _parseTemplate: function (node, index, list, parent, stripWhiteSpace) { var content = document.createDocumentFragment(); content._notes = this.parseAnnotations(node, stripWhiteSpace); content.appendChild(node.content); list.push({ bindings: Polymer.nar, events: Polymer.nar, templateContent: content, parent: parent, index: index }); }, _parseNodeAttributeAnnotations: function (node, annotation) { var attrs = Array.prototype.slice.call(node.attributes); for (var i = attrs.length - 1, a; a = attrs[i]; i--) { var n = a.name; var v = a.value; var b; if (n.slice(0, 3) === 'on-') { node.removeAttribute(n); annotation.events.push({ name: n.slice(3), value: v }); } else if (b = this._parseNodeAttributeAnnotation(node, n, v)) { annotation.bindings.push(b); } else if (n === 'id') { annotation.id = v; } } }, _parseNodeAttributeAnnotation: function (node, name, value) { var parts = this._parseBindings(value); if (parts) { var origName = name; var kind = 'property'; if (name[name.length - 1] == '$') { name = name.slice(0, -1); kind = 'attribute'; } var literal = this._literalFromParts(parts); if (literal && kind == 'attribute') { node.setAttribute(name, literal); } if (node.localName === 'input' && origName === 'value') { node.setAttribute(origName, ''); } if (disableUpgradeEnabled && origName === 'disable-upgrade$') { node.setAttribute(name, ''); } node.removeAttribute(origName); var propertyName = Polymer.CaseMap.dashToCamelCase(name); if (kind === 'property') { name = propertyName; } return { kind: kind, name: name, propertyName: propertyName, parts: parts, literal: literal, isCompound: parts.length !== 1 }; } }, findAnnotatedNode: function (root, annote) { var parent = annote.parent && Polymer.Annotations.findAnnotatedNode(root, annote.parent); if (parent) { for (var n = parent.firstChild, i = 0; n; n = n.nextSibling) { if (annote.index === i++) { return n; } } } else { return root; } } }; }());Polymer.Path = { root: function (path) { var dotIndex = path.indexOf('.'); if (dotIndex === -1) { return path; } return path.slice(0, dotIndex); }, isDeep: function (path) { return path.indexOf('.') !== -1; }, isAncestor: function (base, path) { return base.indexOf(path + '.') === 0; }, isDescendant: function (base, path) { return path.indexOf(base + '.') === 0; }, translate: function (base, newBase, path) { return newBase + path.slice(base.length); }, matches: function (base, wildcard, path) { return base === path || this.isAncestor(base, path) || Boolean(wildcard) && this.isDescendant(base, path); } };Polymer.Base._addFeature({ _prepAnnotations: function () { if (!this._template) { this._notes = []; } else { var self = this; Polymer.Annotations.prepElement = function (element) { self._prepElement(element); }; if (this._template._content && this._template._content._notes) { this._notes = this._template._content._notes; } else { this._notes = Polymer.Annotations.parseAnnotations(this._template); this._processAnnotations(this._notes); } Polymer.Annotations.prepElement = null; } }, _processAnnotations: function (notes) { for (var i = 0; i < notes.length; i++) { var note = notes[i]; for (var j = 0; j < note.bindings.length; j++) { var b = note.bindings[j]; for (var k = 0; k < b.parts.length; k++) { var p = b.parts[k]; if (!p.literal) { var signature = this._parseMethod(p.value); if (signature) { p.signature = signature; } else { p.model = Polymer.Path.root(p.value); } } } } if (note.templateContent) { this._processAnnotations(note.templateContent._notes); var pp = note.templateContent._parentProps = this._discoverTemplateParentProps(note.templateContent._notes); var bindings = []; for (var prop in pp) { var name = '_parent_' + prop; bindings.push({ index: note.index, kind: 'property', name: name, propertyName: name, parts: [{ mode: '{', model: prop, value: prop }] }); } note.bindings = note.bindings.concat(bindings); } } }, _discoverTemplateParentProps: function (notes) { var pp = {}; for (var i = 0, n; i < notes.length && (n = notes[i]); i++) { for (var j = 0, b$ = n.bindings, b; j < b$.length && (b = b$[j]); j++) { for (var k = 0, p$ = b.parts, p; k < p$.length && (p = p$[k]); k++) { if (p.signature) { var args = p.signature.args; for (var kk = 0; kk < args.length; kk++) { var model = args[kk].model; if (model) { pp[model] = true; } } if (p.signature.dynamicFn) { pp[p.signature.method] = true; } } else { if (p.model) { pp[p.model] = true; } } } } if (n.templateContent) { var tpp = n.templateContent._parentProps; Polymer.Base.mixin(pp, tpp); } } return pp; }, _prepElement: function (element) { Polymer.ResolveUrl.resolveAttrs(element, this._template.ownerDocument); }, _findAnnotatedNode: Polymer.Annotations.findAnnotatedNode, _marshalAnnotationReferences: function () { if (this._template) { this._marshalIdNodes(); this._marshalAnnotatedNodes(); this._marshalAnnotatedListeners(); } }, _configureAnnotationReferences: function () { var notes = this._notes; var nodes = this._nodes; for (var i = 0; i < notes.length; i++) { var note = notes[i]; var node = nodes[i]; this._configureTemplateContent(note, node); this._configureCompoundBindings(note, node); } }, _configureTemplateContent: function (note, node) { if (note.templateContent) { node._content = note.templateContent; } }, _configureCompoundBindings: function (note, node) { var bindings = note.bindings; for (var i = 0; i < bindings.length; i++) { var binding = bindings[i]; if (binding.isCompound) { var storage = node.__compoundStorage__ || (node.__compoundStorage__ = {}); var parts = binding.parts; var literals = new Array(parts.length); for (var j = 0; j < parts.length; j++) { literals[j] = parts[j].literal; } var name = binding.name; storage[name] = literals; if (binding.literal && binding.kind == 'property') { if (node._configValue) { node._configValue(name, binding.literal); } else { node[name] = binding.literal; } } } } }, _marshalIdNodes: function () { this.$ = {}; for (var i = 0, l = this._notes.length, a; i < l && (a = this._notes[i]); i++) { if (a.id) { this.$[a.id] = this._findAnnotatedNode(this.root, a); } } }, _marshalAnnotatedNodes: function () { if (this._notes && this._notes.length) { var r = new Array(this._notes.length); for (var i = 0; i < this._notes.length; i++) { r[i] = this._findAnnotatedNode(this.root, this._notes[i]); } this._nodes = r; } }, _marshalAnnotatedListeners: function () { for (var i = 0, l = this._notes.length, a; i < l && (a = this._notes[i]); i++) { if (a.events && a.events.length) { var node = this._findAnnotatedNode(this.root, a); for (var j = 0, e$ = a.events, e; j < e$.length && (e = e$[j]); j++) { this.listen(node, e.name, e.value); } } } } });Polymer.Base._addFeature({ listeners: {}, _listenListeners: function (listeners) { var node, name, eventName; for (eventName in listeners) { if (eventName.indexOf('.') < 0) { node = this; name = eventName; } else { name = eventName.split('.'); node = this.$[name[0]]; name = name[1]; } this.listen(node, name, listeners[eventName]); } }, listen: function (node, eventName, methodName) { var handler = this._recallEventHandler(this, eventName, node, methodName); if (!handler) { handler = this._createEventHandler(node, eventName, methodName); } if (handler._listening) { return; } this._listen(node, eventName, handler); handler._listening = true; }, _boundListenerKey: function (eventName, methodName) { return eventName + ':' + methodName; }, _recordEventHandler: function (host, eventName, target, methodName, handler) { var hbl = host.__boundListeners; if (!hbl) { hbl = host.__boundListeners = new WeakMap(); } var bl = hbl.get(target); if (!bl) { bl = {}; if (!Polymer.Settings.isIE || target != window) { hbl.set(target, bl); } } var key = this._boundListenerKey(eventName, methodName); bl[key] = handler; }, _recallEventHandler: function (host, eventName, target, methodName) { var hbl = host.__boundListeners; if (!hbl) { return; } var bl = hbl.get(target); if (!bl) { return; } var key = this._boundListenerKey(eventName, methodName); return bl[key]; }, _createEventHandler: function (node, eventName, methodName) { var host = this; var handler = function (e) { if (host[methodName]) { host[methodName](e, e.detail); } else { host._warn(host._logf('_createEventHandler', 'listener method `' + methodName + '` not defined')); } }; handler._listening = false; this._recordEventHandler(host, eventName, node, methodName, handler); return handler; }, unlisten: function (node, eventName, methodName) { var handler = this._recallEventHandler(this, eventName, node, methodName); if (handler) { this._unlisten(node, eventName, handler); handler._listening = false; } }, _listen: function (node, eventName, handler) { node.addEventListener(eventName, handler); }, _unlisten: function (node, eventName, handler) { node.removeEventListener(eventName, handler); } });(function () { 'use strict'; var wrap = Polymer.DomApi.wrap; var HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string'; var GESTURE_KEY = '__polymerGestures'; var HANDLED_OBJ = '__polymerGesturesHandled'; var TOUCH_ACTION = '__polymerGesturesTouchAction'; var TAP_DISTANCE = 25; var TRACK_DISTANCE = 5; var TRACK_LENGTH = 2; var MOUSE_TIMEOUT = 2500; var MOUSE_EVENTS = [ 'mousedown', 'mousemove', 'mouseup', 'click' ]; var MOUSE_WHICH_TO_BUTTONS = [ 0, 1, 4, 2 ]; var MOUSE_HAS_BUTTONS = function () { try { return new MouseEvent('test', { buttons: 1 }).buttons === 1; } catch (e) { return false; } }(); function isMouseEvent(name) { return MOUSE_EVENTS.indexOf(name) > -1; } var SUPPORTS_PASSIVE = false; (function () { try { var opts = Object.defineProperty({}, 'passive', { get: function () { SUPPORTS_PASSIVE = true; } }); window.addEventListener('test', null, opts); window.removeEventListener('test', null, opts); } catch (e) { } }()); function PASSIVE_TOUCH(eventName) { if (isMouseEvent(eventName) || eventName === 'touchend') { return; } if (HAS_NATIVE_TA && SUPPORTS_PASSIVE && Polymer.Settings.passiveTouchGestures) { return { passive: true }; } } var IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/); var mouseCanceller = function (mouseEvent) { var sc = mouseEvent.sourceCapabilities; if (sc && !sc.firesTouchEvents) { return; } mouseEvent[HANDLED_OBJ] = { skip: true }; if (mouseEvent.type === 'click') { var path = Polymer.dom(mouseEvent).path; for (var i = 0; i < path.length; i++) { if (path[i] === POINTERSTATE.mouse.target) { return; } } mouseEvent.preventDefault(); mouseEvent.stopPropagation(); } }; function setupTeardownMouseCanceller(setup) { var events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS; for (var i = 0, en; i < events.length; i++) { en = events[i]; if (setup) { document.addEventListener(en, mouseCanceller, true); } else { document.removeEventListener(en, mouseCanceller, true); } } } function ignoreMouse(ev) { if (!POINTERSTATE.mouse.mouseIgnoreJob) { setupTeardownMouseCanceller(true); } var unset = function () { setupTeardownMouseCanceller(); POINTERSTATE.mouse.target = null; POINTERSTATE.mouse.mouseIgnoreJob = null; }; POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget; POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT); } function hasLeftMouseButton(ev) { var type = ev.type; if (!isMouseEvent(type)) { return false; } if (type === 'mousemove') { var buttons = ev.buttons === undefined ? 1 : ev.buttons; if (ev instanceof window.MouseEvent && !MOUSE_HAS_BUTTONS) { buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0; } return Boolean(buttons & 1); } else { var button = ev.button === undefined ? 0 : ev.button; return button === 0; } } function isSyntheticClick(ev) { if (ev.type === 'click') { if (ev.detail === 0) { return true; } var t = Gestures.findOriginalTarget(ev); var bcr = t.getBoundingClientRect(); var x = ev.pageX, y = ev.pageY; return !(x >= bcr.left && x <= bcr.right && (y >= bcr.top && y <= bcr.bottom)); } return false; } var POINTERSTATE = { mouse: { target: null, mouseIgnoreJob: null }, touch: { x: 0, y: 0, id: -1, scrollDecided: false } }; function firstTouchAction(ev) { var path = Polymer.dom(ev).path; var ta = 'auto'; for (var i = 0, n; i < path.length; i++) { n = path[i]; if (n[TOUCH_ACTION]) { ta = n[TOUCH_ACTION]; break; } } return ta; } function trackDocument(stateObj, movefn, upfn) { stateObj.movefn = movefn; stateObj.upfn = upfn; document.addEventListener('mousemove', movefn); document.addEventListener('mouseup', upfn); } function untrackDocument(stateObj) { document.removeEventListener('mousemove', stateObj.movefn); document.removeEventListener('mouseup', stateObj.upfn); stateObj.movefn = null; stateObj.upfn = null; } document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? { passive: true } : false); var Gestures = { gestures: {}, recognizers: [], deepTargetFind: function (x, y) { var node = document.elementFromPoint(x, y); var next = node; while (next && next.shadowRoot) { next = next.shadowRoot.elementFromPoint(x, y); if (next) { node = next; } } return node; }, findOriginalTarget: function (ev) { if (ev.path) { return ev.path[0]; } return ev.target; }, handleNative: function (ev) { var handled; var type = ev.type; var node = wrap(ev.currentTarget); var gobj = node[GESTURE_KEY]; if (!gobj) { return; } var gs = gobj[type]; if (!gs) { return; } if (!ev[HANDLED_OBJ]) { ev[HANDLED_OBJ] = {}; if (type.slice(0, 5) === 'touch') { var t = ev.changedTouches[0]; if (type === 'touchstart') { if (ev.touches.length === 1) { POINTERSTATE.touch.id = t.identifier; } } if (POINTERSTATE.touch.id !== t.identifier) { return; } if (!HAS_NATIVE_TA) { if (type === 'touchstart' || type === 'touchmove') { Gestures.handleTouchAction(ev); } } } } handled = ev[HANDLED_OBJ]; if (handled.skip) { return; } var recognizers = Gestures.recognizers; for (var i = 0, r; i < recognizers.length; i++) { r = recognizers[i]; if (gs[r.name] && !handled[r.name]) { if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) { r.reset(); } } } for (i = 0, r; i < recognizers.length; i++) { r = recognizers[i]; if (gs[r.name] && !handled[r.name]) { handled[r.name] = true; r[type](ev); } } }, handleTouchAction: function (ev) { var t = ev.changedTouches[0]; var type = ev.type; if (type === 'touchstart') { POINTERSTATE.touch.x = t.clientX; POINTERSTATE.touch.y = t.clientY; POINTERSTATE.touch.scrollDecided = false; } else if (type === 'touchmove') { if (POINTERSTATE.touch.scrollDecided) { return; } POINTERSTATE.touch.scrollDecided = true; var ta = firstTouchAction(ev); var prevent = false; var dx = Math.abs(POINTERSTATE.touch.x - t.clientX); var dy = Math.abs(POINTERSTATE.touch.y - t.clientY); if (!ev.cancelable) { } else if (ta === 'none') { prevent = true; } else if (ta === 'pan-x') { prevent = dy > dx; } else if (ta === 'pan-y') { prevent = dx > dy; } if (prevent) { ev.preventDefault(); } else { Gestures.prevent('track'); } } }, add: function (node, evType, handler) { node = wrap(node); var recognizer = this.gestures[evType]; var deps = recognizer.deps; var name = recognizer.name; var gobj = node[GESTURE_KEY]; if (!gobj) { node[GESTURE_KEY] = gobj = {}; } for (var i = 0, dep, gd; i < deps.length; i++) { dep = deps[i]; if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') { continue; } gd = gobj[dep]; if (!gd) { gobj[dep] = gd = { _count: 0 }; } if (gd._count === 0) { node.addEventListener(dep, this.handleNative, PASSIVE_TOUCH(dep)); } gd[name] = (gd[name] || 0) + 1; gd._count = (gd._count || 0) + 1; } node.addEventListener(evType, handler); if (recognizer.touchAction) { this.setTouchAction(node, recognizer.touchAction); } }, remove: function (node, evType, handler) { node = wrap(node); var recognizer = this.gestures[evType]; var deps = recognizer.deps; var name = recognizer.name; var gobj = node[GESTURE_KEY]; if (gobj) { for (var i = 0, dep, gd; i < deps.length; i++) { dep = deps[i]; gd = gobj[dep]; if (gd && gd[name]) { gd[name] = (gd[name] || 1) - 1; gd._count = (gd._count || 1) - 1; if (gd._count === 0) { node.removeEventListener(dep, this.handleNative, PASSIVE_TOUCH(dep)); } } } } node.removeEventListener(evType, handler); }, register: function (recog) { this.recognizers.push(recog); for (var i = 0; i < recog.emits.length; i++) { this.gestures[recog.emits[i]] = recog; } }, findRecognizerByEvent: function (evName) { for (var i = 0, r; i < this.recognizers.length; i++) { r = this.recognizers[i]; for (var j = 0, n; j < r.emits.length; j++) { n = r.emits[j]; if (n === evName) { return r; } } } return null; }, setTouchAction: function (node, value) { if (HAS_NATIVE_TA) { node.style.touchAction = value; } node[TOUCH_ACTION] = value; }, fire: function (target, type, detail) { var ev = Polymer.Base.fire(type, detail, { node: target, bubbles: true, cancelable: true }); if (ev.defaultPrevented) { var preventer = detail.preventer || detail.sourceEvent; if (preventer && preventer.preventDefault) { preventer.preventDefault(); } } }, prevent: function (evName) { var recognizer = this.findRecognizerByEvent(evName); if (recognizer.info) { recognizer.info.prevent = true; } }, resetMouseCanceller: function () { if (POINTERSTATE.mouse.mouseIgnoreJob) { POINTERSTATE.mouse.mouseIgnoreJob.complete(); } } }; Gestures.register({ name: 'downup', deps: [ 'mousedown', 'touchstart', 'touchend' ], flow: { start: [ 'mousedown', 'touchstart' ], end: [ 'mouseup', 'touchend' ] }, emits: [ 'down', 'up' ], info: { movefn: null, upfn: null }, reset: function () { untrackDocument(this.info); }, mousedown: function (e) { if (!hasLeftMouseButton(e)) { return; } var t = Gestures.findOriginalTarget(e); var self = this; var movefn = function movefn(e) { if (!hasLeftMouseButton(e)) { self.fire('up', t, e); untrackDocument(self.info); } }; var upfn = function upfn(e) { if (hasLeftMouseButton(e)) { self.fire('up', t, e); } untrackDocument(self.info); }; trackDocument(this.info, movefn, upfn); this.fire('down', t, e); }, touchstart: function (e) { this.fire('down', Gestures.findOriginalTarget(e), e.changedTouches[0], e); }, touchend: function (e) { this.fire('up', Gestures.findOriginalTarget(e), e.changedTouches[0], e); }, fire: function (type, target, event, preventer) { Gestures.fire(target, type, { x: event.clientX, y: event.clientY, sourceEvent: event, preventer: preventer, prevent: function (e) { return Gestures.prevent(e); } }); } }); Gestures.register({ name: 'track', touchAction: 'none', deps: [ 'mousedown', 'touchstart', 'touchmove', 'touchend' ], flow: { start: [ 'mousedown', 'touchstart' ], end: [ 'mouseup', 'touchend' ] }, emits: ['track'], info: { x: 0, y: 0, state: 'start', started: false, moves: [], addMove: function (move) { if (this.moves.length > TRACK_LENGTH) { this.moves.shift(); } this.moves.push(move); }, movefn: null, upfn: null, prevent: false }, reset: function () { this.info.state = 'start'; this.info.started = false; this.info.moves = []; this.info.x = 0; this.info.y = 0; this.info.prevent = false; untrackDocument(this.info); }, hasMovedEnough: function (x, y) { if (this.info.prevent) { return false; } if (this.info.started) { return true; } var dx = Math.abs(this.info.x - x); var dy = Math.abs(this.info.y - y); return dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE; }, mousedown: function (e) { if (!hasLeftMouseButton(e)) { return; } var t = Gestures.findOriginalTarget(e); var self = this; var movefn = function movefn(e) { var x = e.clientX, y = e.clientY; if (self.hasMovedEnough(x, y)) { self.info.state = self.info.started ? e.type === 'mouseup' ? 'end' : 'track' : 'start'; if (self.info.state === 'start') { Gestures.prevent('tap'); } self.info.addMove({ x: x, y: y }); if (!hasLeftMouseButton(e)) { self.info.state = 'end'; untrackDocument(self.info); } self.fire(t, e); self.info.started = true; } }; var upfn = function upfn(e) { if (self.info.started) { movefn(e); } untrackDocument(self.info); }; trackDocument(this.info, movefn, upfn); this.info.x = e.clientX; this.info.y = e.clientY; }, touchstart: function (e) { var ct = e.changedTouches[0]; this.info.x = ct.clientX; this.info.y = ct.clientY; }, touchmove: function (e) { var t = Gestures.findOriginalTarget(e); var ct = e.changedTouches[0]; var x = ct.clientX, y = ct.clientY; if (this.hasMovedEnough(x, y)) { if (this.info.state === 'start') { Gestures.prevent('tap'); } this.info.addMove({ x: x, y: y }); this.fire(t, ct); this.info.state = 'track'; this.info.started = true; } }, touchend: function (e) { var t = Gestures.findOriginalTarget(e); var ct = e.changedTouches[0]; if (this.info.started) { this.info.state = 'end'; this.info.addMove({ x: ct.clientX, y: ct.clientY }); this.fire(t, ct, e); } }, fire: function (target, touch, preventer) { var secondlast = this.info.moves[this.info.moves.length - 2]; var lastmove = this.info.moves[this.info.moves.length - 1]; var dx = lastmove.x - this.info.x; var dy = lastmove.y - this.info.y; var ddx, ddy = 0; if (secondlast) { ddx = lastmove.x - secondlast.x; ddy = lastmove.y - secondlast.y; } return Gestures.fire(target, 'track', { state: this.info.state, x: touch.clientX, y: touch.clientY, dx: dx, dy: dy, ddx: ddx, ddy: ddy, sourceEvent: touch, preventer: preventer, hover: function () { return Gestures.deepTargetFind(touch.clientX, touch.clientY); } }); } }); Gestures.register({ name: 'tap', deps: [ 'mousedown', 'click', 'touchstart', 'touchend' ], flow: { start: [ 'mousedown', 'touchstart' ], end: [ 'click', 'touchend' ] }, emits: ['tap'], info: { x: NaN, y: NaN, prevent: false }, reset: function () { this.info.x = NaN; this.info.y = NaN; this.info.prevent = false; }, save: function (e) { this.info.x = e.clientX; this.info.y = e.clientY; }, mousedown: function (e) { if (hasLeftMouseButton(e)) { this.save(e); } }, click: function (e) { if (hasLeftMouseButton(e)) { this.forward(e); } }, touchstart: function (e) { this.save(e.changedTouches[0], e); }, touchend: function (e) { this.forward(e.changedTouches[0], e); }, forward: function (e, preventer) { var dx = Math.abs(e.clientX - this.info.x); var dy = Math.abs(e.clientY - this.info.y); var t = Gestures.findOriginalTarget(e); if (isNaN(dx) || isNaN(dy) || dx <= TAP_DISTANCE && dy <= TAP_DISTANCE || isSyntheticClick(e)) { if (!this.info.prevent) { Gestures.fire(t, 'tap', { x: e.clientX, y: e.clientY, sourceEvent: e, preventer: preventer }); } } } }); var DIRECTION_MAP = { x: 'pan-x', y: 'pan-y', none: 'none', all: 'auto' }; Polymer.Base._addFeature({ _setupGestures: function () { this.__polymerGestures = null; }, _listen: function (node, eventName, handler) { if (Gestures.gestures[eventName]) { Gestures.add(node, eventName, handler); } else { node.addEventListener(eventName, handler); } }, _unlisten: function (node, eventName, handler) { if (Gestures.gestures[eventName]) { Gestures.remove(node, eventName, handler); } else { node.removeEventListener(eventName, handler); } }, setScrollDirection: function (direction, node) { node = node || this; Gestures.setTouchAction(node, DIRECTION_MAP[direction] || 'auto'); } }); Polymer.Gestures = Gestures; }());(function () { 'use strict'; Polymer.Base._addFeature({ $$: function (slctr) { return Polymer.dom(this.root).querySelector(slctr); }, toggleClass: function (name, bool, node) { node = node || this; if (arguments.length == 1) { bool = !node.classList.contains(name); } if (bool) { Polymer.dom(node).classList.add(name); } else { Polymer.dom(node).classList.remove(name); } }, toggleAttribute: function (name, bool, node) { node = node || this; if (arguments.length == 1) { bool = !node.hasAttribute(name); } if (bool) { Polymer.dom(node).setAttribute(name, ''); } else { Polymer.dom(node).removeAttribute(name); } }, classFollows: function (name, toElement, fromElement) { if (fromElement) { Polymer.dom(fromElement).classList.remove(name); } if (toElement) { Polymer.dom(toElement).classList.add(name); } }, attributeFollows: function (name, toElement, fromElement) { if (fromElement) { Polymer.dom(fromElement).removeAttribute(name); } if (toElement) { Polymer.dom(toElement).setAttribute(name, ''); } }, getEffectiveChildNodes: function () { return Polymer.dom(this).getEffectiveChildNodes(); }, getEffectiveChildren: function () { var list = Polymer.dom(this).getEffectiveChildNodes(); return list.filter(function (n) { return n.nodeType === Node.ELEMENT_NODE; }); }, getEffectiveTextContent: function () { var cn = this.getEffectiveChildNodes(); var tc = []; for (var i = 0, c; c = cn[i]; i++) { if (c.nodeType !== Node.COMMENT_NODE) { tc.push(Polymer.dom(c).textContent); } } return tc.join(''); }, queryEffectiveChildren: function (slctr) { var e$ = Polymer.dom(this).queryDistributedElements(slctr); return e$ && e$[0]; }, queryAllEffectiveChildren: function (slctr) { return Polymer.dom(this).queryDistributedElements(slctr); }, getContentChildNodes: function (slctr) { var content = Polymer.dom(this.root).querySelector(slctr || 'content'); return content ? Polymer.dom(content).getDistributedNodes() : []; }, getContentChildren: function (slctr) { return this.getContentChildNodes(slctr).filter(function (n) { return n.nodeType === Node.ELEMENT_NODE; }); }, fire: function (type, detail, options) { options = options || Polymer.nob; var node = options.node || this; detail = detail === null || detail === undefined ? {} : detail; var bubbles = options.bubbles === undefined ? true : options.bubbles; var cancelable = Boolean(options.cancelable); var useCache = options._useCache; var event = this._getEvent(type, bubbles, cancelable, useCache); event.detail = detail; if (useCache) { this.__eventCache[type] = null; } node.dispatchEvent(event); if (useCache) { this.__eventCache[type] = event; } return event; }, __eventCache: {}, _getEvent: function (type, bubbles, cancelable, useCache) { var event = useCache && this.__eventCache[type]; if (!event || (event.bubbles != bubbles || event.cancelable != cancelable)) { event = new Event(type, { bubbles: Boolean(bubbles), cancelable: cancelable }); } return event; }, async: function (callback, waitTime) { var self = this; return Polymer.Async.run(function () { callback.call(self); }, waitTime); }, cancelAsync: function (handle) { Polymer.Async.cancel(handle); }, arrayDelete: function (path, item) { var index; if (Array.isArray(path)) { index = path.indexOf(item); if (index >= 0) { return path.splice(index, 1); } } else { var arr = this._get(path); index = arr.indexOf(item); if (index >= 0) { return this.splice(path, index, 1); } } }, transform: function (transform, node) { node = node || this; node.style.webkitTransform = transform; node.style.transform = transform; }, translate3d: function (x, y, z, node) { node = node || this; this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node); }, importHref: function (href, onload, onerror, optAsync) { var link = document.createElement('link'); link.rel = 'import'; link.href = href; var list = Polymer.Base.importHref.imported = Polymer.Base.importHref.imported || {}; var cached = list[link.href]; var imprt = cached || link; var self = this; var loadListener = function (e) { e.target.__firedLoad = true; e.target.removeEventListener('load', loadListener); e.target.removeEventListener('error', errorListener); return onload.call(self, e); }; var errorListener = function (e) { e.target.__firedError = true; e.target.removeEventListener('load', loadListener); e.target.removeEventListener('error', errorListener); return onerror.call(self, e); }; if (onload) { imprt.addEventListener('load', loadListener); } if (onerror) { imprt.addEventListener('error', errorListener); } if (cached) { if (cached.__firedLoad) { cached.dispatchEvent(new Event('load')); } if (cached.__firedError) { cached.dispatchEvent(new Event('error')); } } else { list[link.href] = link; optAsync = Boolean(optAsync); if (optAsync) { link.setAttribute('async', ''); } document.head.appendChild(link); } return imprt; }, create: function (tag, props) { var elt = document.createElement(tag); if (props) { for (var n in props) { elt[n] = props[n]; } } return elt; }, isLightDescendant: function (node) { return this !== node && this.contains(node) && Polymer.dom(this).getOwnerRoot() === Polymer.dom(node).getOwnerRoot(); }, isLocalDescendant: function (node) { return this.root === Polymer.dom(node).getOwnerRoot(); } }); if (!Polymer.Settings.useNativeCustomElements) { var importHref = Polymer.Base.importHref; Polymer.Base.importHref = function (href, onload, onerror, optAsync) { CustomElements.ready = false; var loadFn = function (e) { CustomElements.upgradeDocumentTree(document); CustomElements.ready = true; if (onload) { return onload.call(this, e); } }; return importHref.call(this, href, loadFn, onerror, optAsync); }; } }());Polymer.Bind = { prepareModel: function (model) { Polymer.Base.mixin(model, this._modelApi); }, _modelApi: { _notifyChange: function (source, event, value) { value = value === undefined ? this[source] : value; event = event || Polymer.CaseMap.camelToDashCase(source) + '-changed'; this.fire(event, { value: value }, { bubbles: false, cancelable: false, _useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE }); }, _propertySetter: function (property, value, effects, fromAbove) { var old = this.__data__[property]; if (old !== value && (old === old || value === value)) { this.__data__[property] = value; if (typeof value == 'object') { this._clearPath(property); } if (this._propertyChanged) { this._propertyChanged(property, value, old); } if (effects) { this._effectEffects(property, value, effects, old, fromAbove); } } return old; }, __setProperty: function (property, value, quiet, node) { node = node || this; var effects = node._propertyEffects && node._propertyEffects[property]; if (effects) { node._propertySetter(property, value, effects, quiet); } else if (node[property] !== value) { node[property] = value; } }, _effectEffects: function (property, value, effects, old, fromAbove) { for (var i = 0, l = effects.length, fx; i < l && (fx = effects[i]); i++) { fx.fn.call(this, property, this[property], fx.effect, old, fromAbove); } }, _clearPath: function (path) { for (var prop in this.__data__) { if (Polymer.Path.isDescendant(path, prop)) { this.__data__[prop] = undefined; } } } }, ensurePropertyEffects: function (model, property) { if (!model._propertyEffects) { model._propertyEffects = {}; } var fx = model._propertyEffects[property]; if (!fx) { fx = model._propertyEffects[property] = []; } return fx; }, addPropertyEffect: function (model, property, kind, effect) { var fx = this.ensurePropertyEffects(model, property); var propEffect = { kind: kind, effect: effect, fn: Polymer.Bind['_' + kind + 'Effect'] }; fx.push(propEffect); return propEffect; }, createBindings: function (model) { var fx$ = model._propertyEffects; if (fx$) { for (var n in fx$) { var fx = fx$[n]; fx.sort(this._sortPropertyEffects); this._createAccessors(model, n, fx); } } }, _sortPropertyEffects: function () { var EFFECT_ORDER = { 'compute': 0, 'annotation': 1, 'annotatedComputation': 2, 'reflect': 3, 'notify': 4, 'observer': 5, 'complexObserver': 6, 'function': 7 }; return function (a, b) { return EFFECT_ORDER[a.kind] - EFFECT_ORDER[b.kind]; }; }(), _createAccessors: function (model, property, effects) { var defun = { get: function () { return this.__data__[property]; } }; var setter = function (value) { this._propertySetter(property, value, effects); }; var info = model.getPropertyInfo && model.getPropertyInfo(property); if (info && info.readOnly) { if (!info.computed) { model['_set' + this.upper(property)] = setter; } } else { defun.set = setter; } Object.defineProperty(model, property, defun); }, upper: function (name) { return name[0].toUpperCase() + name.substring(1); }, _addAnnotatedListener: function (model, index, property, path, event, negated) { if (!model._bindListeners) { model._bindListeners = []; } var fn = this._notedListenerFactory(property, path, Polymer.Path.isDeep(path), negated); var eventName = event || Polymer.CaseMap.camelToDashCase(property) + '-changed'; model._bindListeners.push({ index: index, property: property, path: path, changedFn: fn, event: eventName }); }, _isEventBogus: function (e, target) { return e.path && e.path[0] !== target; }, _notedListenerFactory: function (property, path, isStructured, negated) { return function (target, value, targetPath) { if (targetPath) { var newPath = Polymer.Path.translate(property, path, targetPath); this._notifyPath(newPath, value); } else { value = target[property]; if (negated) { value = !value; } if (!isStructured) { this[path] = value; } else { if (this.__data__[path] != value) { this.set(path, value); } } } }; }, prepareInstance: function (inst) { inst.__data__ = Object.create(null); }, setupBindListeners: function (inst) { var b$ = inst._bindListeners; for (var i = 0, l = b$.length, info; i < l && (info = b$[i]); i++) { var node = inst._nodes[info.index]; this._addNotifyListener(node, inst, info.event, info.changedFn); } }, _addNotifyListener: function (element, context, event, changedFn) { element.addEventListener(event, function (e) { return context._notifyListener(changedFn, e); }); } };Polymer.Base.mixin(Polymer.Bind, { _shouldAddListener: function (effect) { return effect.name && effect.kind != 'attribute' && effect.kind != 'text' && !effect.isCompound && effect.parts[0].mode === '{'; }, _annotationEffect: function (source, value, effect) { if (source != effect.value) { value = this._get(effect.value); this.__data__[effect.value] = value; } this._applyEffectValue(effect, value); }, _reflectEffect: function (source, value, effect) { this.reflectPropertyToAttribute(source, effect.attribute, value); }, _notifyEffect: function (source, value, effect, old, fromAbove) { if (!fromAbove) { this._notifyChange(source, effect.event, value); } }, _functionEffect: function (source, value, fn, old, fromAbove) { fn.call(this, source, value, old, fromAbove); }, _observerEffect: function (source, value, effect, old) { var fn = this[effect.method]; if (fn) { fn.call(this, value, old); } else { this._warn(this._logf('_observerEffect', 'observer method `' + effect.method + '` not defined')); } }, _complexObserverEffect: function (source, value, effect) { var fn = this[effect.method]; if (fn) { var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value); if (args) { fn.apply(this, args); } } else if (effect.dynamicFn) { } else { this._warn(this._logf('_complexObserverEffect', 'observer method `' + effect.method + '` not defined')); } }, _computeEffect: function (source, value, effect) { var fn = this[effect.method]; if (fn) { var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value); if (args) { var computedvalue = fn.apply(this, args); this.__setProperty(effect.name, computedvalue); } } else if (effect.dynamicFn) { } else { this._warn(this._logf('_computeEffect', 'compute method `' + effect.method + '` not defined')); } }, _annotatedComputationEffect: function (source, value, effect) { var computedHost = this._rootDataHost || this; var fn = computedHost[effect.method]; if (fn) { var args = Polymer.Bind._marshalArgs(this.__data__, effect, source, value); if (args) { var computedvalue = fn.apply(computedHost, args); this._applyEffectValue(effect, computedvalue); } } else if (effect.dynamicFn) { } else { computedHost._warn(computedHost._logf('_annotatedComputationEffect', 'compute method `' + effect.method + '` not defined')); } }, _marshalArgs: function (model, effect, path, value) { var values = []; var args = effect.args; var bailoutEarly = args.length > 1 || effect.dynamicFn; for (var i = 0, l = args.length; i < l; i++) { var arg = args[i]; var name = arg.name; var v; if (arg.literal) { v = arg.value; } else if (path === name) { v = value; } else { v = model[name]; if (v === undefined && arg.structured) { v = Polymer.Base._get(name, model); } } if (bailoutEarly && v === undefined) { return; } if (arg.wildcard) { var matches = Polymer.Path.isAncestor(path, name); values[i] = { path: matches ? path : name, value: matches ? value : v, base: v }; } else { values[i] = v; } } return values; } });Polymer.Base._addFeature({ _addPropertyEffect: function (property, kind, effect) { var prop = Polymer.Bind.addPropertyEffect(this, property, kind, effect); prop.pathFn = this['_' + prop.kind + 'PathEffect']; }, _prepEffects: function () { Polymer.Bind.prepareModel(this); this._addAnnotationEffects(this._notes); }, _prepBindings: function () { Polymer.Bind.createBindings(this); }, _addPropertyEffects: function (properties) { if (properties) { for (var p in properties) { var prop = properties[p]; if (prop.observer) { this._addObserverEffect(p, prop.observer); } if (prop.computed) { prop.readOnly = true; this._addComputedEffect(p, prop.computed); } if (prop.notify) { this._addPropertyEffect(p, 'notify', { event: Polymer.CaseMap.camelToDashCase(p) + '-changed' }); } if (prop.reflectToAttribute) { var attr = Polymer.CaseMap.camelToDashCase(p); if (attr[0] === '-') { this._warn(this._logf('_addPropertyEffects', 'Property ' + p + ' cannot be reflected to attribute ' + attr + ' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.')); } else { this._addPropertyEffect(p, 'reflect', { attribute: attr }); } } if (prop.readOnly) { Polymer.Bind.ensurePropertyEffects(this, p); } } } }, _addComputedEffect: function (name, expression) { var sig = this._parseMethod(expression); var dynamicFn = sig.dynamicFn; for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) { this._addPropertyEffect(arg.model, 'compute', { method: sig.method, args: sig.args, trigger: arg, name: name, dynamicFn: dynamicFn }); } if (dynamicFn) { this._addPropertyEffect(sig.method, 'compute', { method: sig.method, args: sig.args, trigger: null, name: name, dynamicFn: dynamicFn }); } }, _addObserverEffect: function (property, observer) { this._addPropertyEffect(property, 'observer', { method: observer, property: property }); }, _addComplexObserverEffects: function (observers) { if (observers) { for (var i = 0, o; i < observers.length && (o = observers[i]); i++) { this._addComplexObserverEffect(o); } } }, _addComplexObserverEffect: function (observer) { var sig = this._parseMethod(observer); if (!sig) { throw new Error('Malformed observer expression \'' + observer + '\''); } var dynamicFn = sig.dynamicFn; for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) { this._addPropertyEffect(arg.model, 'complexObserver', { method: sig.method, args: sig.args, trigger: arg, dynamicFn: dynamicFn }); } if (dynamicFn) { this._addPropertyEffect(sig.method, 'complexObserver', { method: sig.method, args: sig.args, trigger: null, dynamicFn: dynamicFn }); } }, _addAnnotationEffects: function (notes) { for (var i = 0, note; i < notes.length && (note = notes[i]); i++) { var b$ = note.bindings; for (var j = 0, binding; j < b$.length && (binding = b$[j]); j++) { this._addAnnotationEffect(binding, i); } } }, _addAnnotationEffect: function (note, index) { if (Polymer.Bind._shouldAddListener(note)) { Polymer.Bind._addAnnotatedListener(this, index, note.name, note.parts[0].value, note.parts[0].event, note.parts[0].negate); } for (var i = 0; i < note.parts.length; i++) { var part = note.parts[i]; if (part.signature) { this._addAnnotatedComputationEffect(note, part, index); } else if (!part.literal) { if (note.kind === 'attribute' && note.name[0] === '-') { this._warn(this._logf('_addAnnotationEffect', 'Cannot set attribute ' + note.name + ' because "-" is not a valid attribute starting character')); } else { this._addPropertyEffect(part.model, 'annotation', { kind: note.kind, index: index, name: note.name, propertyName: note.propertyName, value: part.value, isCompound: note.isCompound, compoundIndex: part.compoundIndex, event: part.event, customEvent: part.customEvent, negate: part.negate }); } } } }, _addAnnotatedComputationEffect: function (note, part, index) { var sig = part.signature; if (sig.static) { this.__addAnnotatedComputationEffect('__static__', index, note, part, null); } else { for (var i = 0, arg; i < sig.args.length && (arg = sig.args[i]); i++) { if (!arg.literal) { this.__addAnnotatedComputationEffect(arg.model, index, note, part, arg); } } if (sig.dynamicFn) { this.__addAnnotatedComputationEffect(sig.method, index, note, part, null); } } }, __addAnnotatedComputationEffect: function (property, index, note, part, trigger) { this._addPropertyEffect(property, 'annotatedComputation', { index: index, isCompound: note.isCompound, compoundIndex: part.compoundIndex, kind: note.kind, name: note.name, negate: part.negate, method: part.signature.method, args: part.signature.args, trigger: trigger, dynamicFn: part.signature.dynamicFn }); }, _parseMethod: function (expression) { var m = expression.match(/([^\s]+?)\(([\s\S]*)\)/); if (m) { var sig = { method: m[1], static: true }; if (this.getPropertyInfo(sig.method) !== Polymer.nob) { sig.static = false; sig.dynamicFn = true; } if (m[2].trim()) { var args = m[2].replace(/\\,/g, ',').split(','); return this._parseArgs(args, sig); } else { sig.args = Polymer.nar; return sig; } } }, _parseArgs: function (argList, sig) { sig.args = argList.map(function (rawArg) { var arg = this._parseArg(rawArg); if (!arg.literal) { sig.static = false; } return arg; }, this); return sig; }, _parseArg: function (rawArg) { var arg = rawArg.trim().replace(/,/g, ',').replace(/\\(.)/g, '$1'); var a = { name: arg }; var fc = arg[0]; if (fc === '-') { fc = arg[1]; } if (fc >= '0' && fc <= '9') { fc = '#'; } switch (fc) { case '\'': case '"': a.value = arg.slice(1, -1); a.literal = true; break; case '#': a.value = Number(arg); a.literal = true; break; } if (!a.literal) { a.model = Polymer.Path.root(arg); a.structured = Polymer.Path.isDeep(arg); if (a.structured) { a.wildcard = arg.slice(-2) == '.*'; if (a.wildcard) { a.name = arg.slice(0, -2); } } } return a; }, _marshalInstanceEffects: function () { Polymer.Bind.prepareInstance(this); if (this._bindListeners) { Polymer.Bind.setupBindListeners(this); } }, _applyEffectValue: function (info, value) { var node = this._nodes[info.index]; var property = info.name; value = this._computeFinalAnnotationValue(node, property, value, info); if (info.kind == 'attribute') { this.serializeValueToAttribute(value, property, node); } else { var pinfo = node._propertyInfo && node._propertyInfo[property]; if (pinfo && pinfo.readOnly) { return; } this.__setProperty(property, value, Polymer.Settings.suppressBindingNotifications, node); } }, _computeFinalAnnotationValue: function (node, property, value, info) { if (info.negate) { value = !value; } if (info.isCompound) { var storage = node.__compoundStorage__[property]; storage[info.compoundIndex] = value; value = storage.join(''); } if (info.kind !== 'attribute') { if (property === 'className') { value = this._scopeElementClass(node, value); } if (property === 'textContent' || node.localName == 'input' && property == 'value') { value = value == undefined ? '' : value; } } return value; }, _executeStaticEffects: function () { if (this._propertyEffects && this._propertyEffects.__static__) { this._effectEffects('__static__', null, this._propertyEffects.__static__); } } });(function () { var usePolyfillProto = Polymer.Settings.usePolyfillProto; var avoidInstanceProperties = Boolean(Object.getOwnPropertyDescriptor(document.documentElement, 'properties')); Polymer.Base._addFeature({ _setupConfigure: function (initialConfig) { this._config = {}; this._handlers = []; this._aboveConfig = null; if (initialConfig) { for (var i in initialConfig) { if (initialConfig[i] !== undefined) { this._config[i] = initialConfig[i]; } } } }, _marshalAttributes: function () { this._takeAttributesToModel(this._config); }, _attributeChangedImpl: function (name) { var model = this._clientsReadied ? this : this._config; this._setAttributeToProperty(model, name); }, _configValue: function (name, value) { var info = this._propertyInfo[name]; if (!info || !info.readOnly) { this._config[name] = value; } }, _beforeClientsReady: function () { this._configure(); }, _configure: function () { this._configureAnnotationReferences(); this._configureInstanceProperties(); this._aboveConfig = this.mixin({}, this._config); var config = {}; for (var i = 0; i < this.behaviors.length; i++) { this._configureProperties(this.behaviors[i].properties, config); } this._configureProperties(avoidInstanceProperties ? this.__proto__.properties : this.properties, config); this.mixin(config, this._aboveConfig); this._config = config; if (this._clients && this._clients.length) { this._distributeConfig(this._config); } }, _configureInstanceProperties: function () { for (var i in this._propertyEffects) { if (!usePolyfillProto && this.hasOwnProperty(i)) { this._configValue(i, this[i]); delete this[i]; } } }, _configureProperties: function (properties, config) { for (var i in properties) { var c = properties[i]; if (c.value !== undefined) { var value = c.value; if (typeof value == 'function') { value = value.call(this, this._config); } config[i] = value; } } }, _distributeConfig: function (config) { var fx$ = this._propertyEffects; if (fx$) { for (var p in config) { var fx = fx$[p]; if (fx) { for (var i = 0, l = fx.length, x; i < l && (x = fx[i]); i++) { if (x.kind === 'annotation') { var node = this._nodes[x.effect.index]; var name = x.effect.propertyName; var isAttr = x.effect.kind == 'attribute'; var hasEffect = node._propertyEffects && node._propertyEffects[name]; if (node._configValue && (hasEffect || !isAttr)) { var value = p === x.effect.value ? config[p] : this._get(x.effect.value, config); value = this._computeFinalAnnotationValue(node, name, value, x.effect); if (isAttr) { value = node.deserialize(this.serialize(value), node._propertyInfo[name].type); } node._configValue(name, value); } } } } } } }, _afterClientsReady: function () { this.importPath = this._importPath; this.rootPath = Polymer.rootPath; this._executeStaticEffects(); this._applyConfig(this._config, this._aboveConfig); this._flushHandlers(); }, _applyConfig: function (config, aboveConfig) { for (var n in config) { if (this[n] === undefined) { this.__setProperty(n, config[n], n in aboveConfig); } } }, _notifyListener: function (fn, e) { if (!Polymer.Bind._isEventBogus(e, e.target)) { var value, path; if (e.detail) { value = e.detail.value; path = e.detail.path; } if (!this._clientsReadied) { this._queueHandler([ fn, e.target, value, path ]); } else { return fn.call(this, e.target, value, path); } } }, _queueHandler: function (args) { this._handlers.push(args); }, _flushHandlers: function () { var h$ = this._handlers; for (var i = 0, l = h$.length, h; i < l && (h = h$[i]); i++) { h[0].call(this, h[1], h[2], h[3]); } this._handlers = []; } }); }());(function () { 'use strict'; var Path = Polymer.Path; Polymer.Base._addFeature({ notifyPath: function (path, value, fromAbove) { var info = {}; var v = this._get(path, this, info); if (arguments.length === 1) { value = v; } if (info.path) { this._notifyPath(info.path, value, fromAbove); } }, _notifyPath: function (path, value, fromAbove) { var old = this._propertySetter(path, value); if (old !== value && (old === old || value === value)) { this._pathEffector(path, value); if (!fromAbove) { this._notifyPathUp(path, value); } return true; } }, _getPathParts: function (path) { if (Array.isArray(path)) { var parts = []; for (var i = 0; i < path.length; i++) { var args = path[i].toString().split('.'); for (var j = 0; j < args.length; j++) { parts.push(args[j]); } } return parts; } else { return path.toString().split('.'); } }, set: function (path, value, root) { var prop = root || this; var parts = this._getPathParts(path); var array; var last = parts[parts.length - 1]; if (parts.length > 1) { for (var i = 0; i < parts.length - 1; i++) { var part = parts[i]; if (array && part[0] == '#') { prop = Polymer.Collection.get(array).getItem(part); } else { prop = prop[part]; if (array && parseInt(part, 10) == part) { parts[i] = Polymer.Collection.get(array).getKey(prop); } } if (!prop) { return; } array = Array.isArray(prop) ? prop : null; } if (array) { var coll = Polymer.Collection.get(array); var old, key; if (last[0] == '#') { key = last; old = coll.getItem(key); last = array.indexOf(old); coll.setItem(key, value); } else if (parseInt(last, 10) == last) { old = prop[last]; key = coll.getKey(old); parts[i] = key; coll.setItem(key, value); } } prop[last] = value; if (!root) { this._notifyPath(parts.join('.'), value); } } else { prop[path] = value; } }, get: function (path, root) { return this._get(path, root); }, _get: function (path, root, info) { var prop = root || this; var parts = this._getPathParts(path); var array; for (var i = 0; i < parts.length; i++) { if (!prop) { return; } var part = parts[i]; if (array && part[0] == '#') { prop = Polymer.Collection.get(array).getItem(part); } else { prop = prop[part]; if (info && array && parseInt(part, 10) == part) { parts[i] = Polymer.Collection.get(array).getKey(prop); } } array = Array.isArray(prop) ? prop : null; } if (info) { info.path = parts.join('.'); } return prop; }, _pathEffector: function (path, value) { var model = Path.root(path); var fx$ = this._propertyEffects && this._propertyEffects[model]; if (fx$) { for (var i = 0, fx; i < fx$.length && (fx = fx$[i]); i++) { var fxFn = fx.pathFn; if (fxFn) { fxFn.call(this, path, value, fx.effect); } } } if (this._boundPaths) { this._notifyBoundPaths(path, value); } }, _annotationPathEffect: function (path, value, effect) { if (Path.matches(effect.value, false, path)) { Polymer.Bind._annotationEffect.call(this, path, value, effect); } else if (!effect.negate && Path.isDescendant(effect.value, path)) { var node = this._nodes[effect.index]; if (node && node._notifyPath) { var newPath = Path.translate(effect.value, effect.name, path); node._notifyPath(newPath, value, true); } } }, _complexObserverPathEffect: function (path, value, effect) { if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._complexObserverEffect.call(this, path, value, effect); } }, _computePathEffect: function (path, value, effect) { if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._computeEffect.call(this, path, value, effect); } }, _annotatedComputationPathEffect: function (path, value, effect) { if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) { Polymer.Bind._annotatedComputationEffect.call(this, path, value, effect); } }, linkPaths: function (to, from) { this._boundPaths = this._boundPaths || {}; if (from) { this._boundPaths[to] = from; } else { this.unlinkPaths(to); } }, unlinkPaths: function (path) { if (this._boundPaths) { delete this._boundPaths[path]; } }, _notifyBoundPaths: function (path, value) { for (var a in this._boundPaths) { var b = this._boundPaths[a]; if (Path.isDescendant(a, path)) { this._notifyPath(Path.translate(a, b, path), value); } else if (Path.isDescendant(b, path)) { this._notifyPath(Path.translate(b, a, path), value); } } }, _notifyPathUp: function (path, value) { var rootName = Path.root(path); var dashCaseName = Polymer.CaseMap.camelToDashCase(rootName); var eventName = dashCaseName + this._EVENT_CHANGED; this.fire(eventName, { path: path, value: value }, { bubbles: false, _useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE }); }, _EVENT_CHANGED: '-changed', notifySplices: function (path, splices) { var info = {}; var array = this._get(path, this, info); this._notifySplices(array, info.path, splices); }, _notifySplices: function (array, path, splices) { var change = { keySplices: Polymer.Collection.applySplices(array, splices), indexSplices: splices }; var splicesPath = path + '.splices'; this._notifyPath(splicesPath, change); this._notifyPath(path + '.length', array.length); this.__data__[splicesPath] = { keySplices: null, indexSplices: null }; }, _notifySplice: function (array, path, index, added, removed) { this._notifySplices(array, path, [{ index: index, addedCount: added, removed: removed, object: array, type: 'splice' }]); }, push: function (path) { var info = {}; var array = this._get(path, this, info); var args = Array.prototype.slice.call(arguments, 1); var len = array.length; var ret = array.push.apply(array, args); if (args.length) { this._notifySplice(array, info.path, len, args.length, []); } return ret; }, pop: function (path) { var info = {}; var array = this._get(path, this, info); var hadLength = Boolean(array.length); var args = Array.prototype.slice.call(arguments, 1); var ret = array.pop.apply(array, args); if (hadLength) { this._notifySplice(array, info.path, array.length, 0, [ret]); } return ret; }, splice: function (path, start) { var info = {}; var array = this._get(path, this, info); if (start < 0) { start = array.length - Math.floor(-start); } else { start = Math.floor(start); } if (!start) { start = 0; } var args = Array.prototype.slice.call(arguments, 1); var ret = array.splice.apply(array, args); var addedCount = Math.max(args.length - 2, 0); if (addedCount || ret.length) { this._notifySplice(array, info.path, start, addedCount, ret); } return ret; }, shift: function (path) { var info = {}; var array = this._get(path, this, info); var hadLength = Boolean(array.length); var args = Array.prototype.slice.call(arguments, 1); var ret = array.shift.apply(array, args); if (hadLength) { this._notifySplice(array, info.path, 0, 0, [ret]); } return ret; }, unshift: function (path) { var info = {}; var array = this._get(path, this, info); var args = Array.prototype.slice.call(arguments, 1); var ret = array.unshift.apply(array, args); if (args.length) { this._notifySplice(array, info.path, 0, args.length, []); } return ret; }, prepareModelNotifyPath: function (model) { this.mixin(model, { fire: Polymer.Base.fire, _getEvent: Polymer.Base._getEvent, __eventCache: Polymer.Base.__eventCache, notifyPath: Polymer.Base.notifyPath, _get: Polymer.Base._get, _EVENT_CHANGED: Polymer.Base._EVENT_CHANGED, _notifyPath: Polymer.Base._notifyPath, _notifyPathUp: Polymer.Base._notifyPathUp, _pathEffector: Polymer.Base._pathEffector, _annotationPathEffect: Polymer.Base._annotationPathEffect, _complexObserverPathEffect: Polymer.Base._complexObserverPathEffect, _annotatedComputationPathEffect: Polymer.Base._annotatedComputationPathEffect, _computePathEffect: Polymer.Base._computePathEffect, _notifyBoundPaths: Polymer.Base._notifyBoundPaths, _getPathParts: Polymer.Base._getPathParts }); } }); }());Polymer.Base._addFeature({ resolveUrl: function (url) { return Polymer.ResolveUrl.resolveUrl(url, this._importPath); } });Polymer.CssParse = function () { return { parse: function (text) { text = this._clean(text); return this._parseCss(this._lex(text), text); }, _clean: function (cssText) { return cssText.replace(this._rx.comments, '').replace(this._rx.port, ''); }, _lex: function (text) { var root = { start: 0, end: text.length }; var n = root; for (var i = 0, l = text.length; i < l; i++) { switch (text[i]) { case this.OPEN_BRACE: if (!n.rules) { n.rules = []; } var p = n; var previous = p.rules[p.rules.length - 1]; n = { start: i + 1, parent: p, previous: previous }; p.rules.push(n); break; case this.CLOSE_BRACE: n.end = i + 1; n = n.parent || root; break; } } return root; }, _parseCss: function (node, text) { var t = text.substring(node.start, node.end - 1); node.parsedCssText = node.cssText = t.trim(); if (node.parent) { var ss = node.previous ? node.previous.end : node.parent.start; t = text.substring(ss, node.start - 1); t = this._expandUnicodeEscapes(t); t = t.replace(this._rx.multipleSpaces, ' '); t = t.substring(t.lastIndexOf(';') + 1); var s = node.parsedSelector = node.selector = t.trim(); node.atRule = s.indexOf(this.AT_START) === 0; if (node.atRule) { if (s.indexOf(this.MEDIA_START) === 0) { node.type = this.types.MEDIA_RULE; } else if (s.match(this._rx.keyframesRule)) { node.type = this.types.KEYFRAMES_RULE; node.keyframesName = node.selector.split(this._rx.multipleSpaces).pop(); } } else { if (s.indexOf(this.VAR_START) === 0) { node.type = this.types.MIXIN_RULE; } else { node.type = this.types.STYLE_RULE; } } } var r$ = node.rules; if (r$) { for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { this._parseCss(r, text); } } return node; }, _expandUnicodeEscapes: function (s) { return s.replace(/\\([0-9a-f]{1,6})\s/gi, function () { var code = arguments[1], repeat = 6 - code.length; while (repeat--) { code = '0' + code; } return '\\' + code; }); }, stringify: function (node, preserveProperties, text) { text = text || ''; var cssText = ''; if (node.cssText || node.rules) { var r$ = node.rules; if (r$ && !this._hasMixinRules(r$)) { for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { cssText = this.stringify(r, preserveProperties, cssText); } } else { cssText = preserveProperties ? node.cssText : this.removeCustomProps(node.cssText); cssText = cssText.trim(); if (cssText) { cssText = ' ' + cssText + '\n'; } } } if (cssText) { if (node.selector) { text += node.selector + ' ' + this.OPEN_BRACE + '\n'; } text += cssText; if (node.selector) { text += this.CLOSE_BRACE + '\n\n'; } } return text; }, _hasMixinRules: function (rules) { return rules[0].selector.indexOf(this.VAR_START) === 0; }, removeCustomProps: function (cssText) { cssText = this.removeCustomPropAssignment(cssText); return this.removeCustomPropApply(cssText); }, removeCustomPropAssignment: function (cssText) { return cssText.replace(this._rx.customProp, '').replace(this._rx.mixinProp, ''); }, removeCustomPropApply: function (cssText) { return cssText.replace(this._rx.mixinApply, '').replace(this._rx.varApply, ''); }, types: { STYLE_RULE: 1, KEYFRAMES_RULE: 7, MEDIA_RULE: 4, MIXIN_RULE: 1000 }, OPEN_BRACE: '{', CLOSE_BRACE: '}', _rx: { comments: /\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim, port: /@import[^;]*;/gim, customProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim, mixinProp: /(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim, mixinApply: /@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim, varApply: /[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim, keyframesRule: /^@[^\s]*keyframes/, multipleSpaces: /\s+/g }, VAR_START: '--', MEDIA_START: '@media', AT_START: '@' }; }();Polymer.StyleUtil = function () { var settings = Polymer.Settings; return { unscopedStyleImports: new WeakMap(), SHADY_UNSCOPED_ATTR: 'shady-unscoped', NATIVE_VARIABLES: Polymer.Settings.useNativeCSSProperties, MODULE_STYLES_SELECTOR: 'style, link[rel=import][type~=css], template', INCLUDE_ATTR: 'include', toCssText: function (rules, callback) { if (typeof rules === 'string') { rules = this.parser.parse(rules); } if (callback) { this.forEachRule(rules, callback); } return this.parser.stringify(rules, this.NATIVE_VARIABLES); }, forRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) { if (styles) { for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) { this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback); } } }, forActiveRulesInStyles: function (styles, styleRuleCallback, keyframesRuleCallback) { if (styles) { for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) { this.forEachRuleInStyle(s, styleRuleCallback, keyframesRuleCallback, true); } } }, rulesForStyle: function (style) { if (!style.__cssRules && style.textContent) { style.__cssRules = this.parser.parse(style.textContent); } return style.__cssRules; }, isKeyframesSelector: function (rule) { return rule.parent && rule.parent.type === this.ruleTypes.KEYFRAMES_RULE; }, forEachRuleInStyle: function (style, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) { var rules = this.rulesForStyle(style); var styleCallback, keyframeCallback; if (styleRuleCallback) { styleCallback = function (rule) { styleRuleCallback(rule, style); }; } if (keyframesRuleCallback) { keyframeCallback = function (rule) { keyframesRuleCallback(rule, style); }; } this.forEachRule(rules, styleCallback, keyframeCallback, onlyActiveRules); }, forEachRule: function (node, styleRuleCallback, keyframesRuleCallback, onlyActiveRules) { if (!node) { return; } var skipRules = false; if (onlyActiveRules) { if (node.type === this.ruleTypes.MEDIA_RULE) { var matchMedia = node.selector.match(this.rx.MEDIA_MATCH); if (matchMedia) { if (!window.matchMedia(matchMedia[1]).matches) { skipRules = true; } } } } if (node.type === this.ruleTypes.STYLE_RULE) { styleRuleCallback(node); } else if (keyframesRuleCallback && node.type === this.ruleTypes.KEYFRAMES_RULE) { keyframesRuleCallback(node); } else if (node.type === this.ruleTypes.MIXIN_RULE) { skipRules = true; } var r$ = node.rules; if (r$ && !skipRules) { for (var i = 0, l = r$.length, r; i < l && (r = r$[i]); i++) { this.forEachRule(r, styleRuleCallback, keyframesRuleCallback, onlyActiveRules); } } }, applyCss: function (cssText, moniker, target, contextNode) { var style = this.createScopeStyle(cssText, moniker); return this.applyStyle(style, target, contextNode); }, applyStyle: function (style, target, contextNode) { target = target || document.head; var after = contextNode && contextNode.nextSibling || target.firstChild; this.__lastHeadApplyNode = style; return target.insertBefore(style, after); }, createScopeStyle: function (cssText, moniker) { var style = document.createElement('style'); if (moniker) { style.setAttribute('scope', moniker); } style.textContent = cssText; return style; }, __lastHeadApplyNode: null, applyStylePlaceHolder: function (moniker) { var placeHolder = document.createComment(' Shady DOM styles for ' + moniker + ' '); var after = this.__lastHeadApplyNode ? this.__lastHeadApplyNode.nextSibling : null; var scope = document.head; scope.insertBefore(placeHolder, after || scope.firstChild); this.__lastHeadApplyNode = placeHolder; return placeHolder; }, cssFromModules: function (moduleIds, warnIfNotFound) { var modules = moduleIds.trim().split(/\s+/); var cssText = ''; for (var i = 0; i < modules.length; i++) { cssText += this.cssFromModule(modules[i], warnIfNotFound); } return cssText; }, cssFromModule: function (moduleId, warnIfNotFound) { var m = Polymer.DomModule.import(moduleId); if (m && !m._cssText) { m._cssText = this.cssFromElement(m); } if (!m && warnIfNotFound) { console.warn('Could not find style data in module named', moduleId); } return m && m._cssText || ''; }, cssFromElement: function (element) { var cssText = ''; var content = element.content || element; var e$ = Polymer.TreeApi.arrayCopy(content.querySelectorAll(this.MODULE_STYLES_SELECTOR)); for (var i = 0, e; i < e$.length; i++) { e = e$[i]; if (e.localName === 'template') { if (!e.hasAttribute('preserve-content')) { cssText += this.cssFromElement(e); } } else { if (e.localName === 'style') { var include = e.getAttribute(this.INCLUDE_ATTR); if (include) { cssText += this.cssFromModules(include, true); } e = e.__appliedElement || e; e.parentNode.removeChild(e); var css = this.resolveCss(e.textContent, element.ownerDocument); if (!settings.useNativeShadow && e.hasAttribute(this.SHADY_UNSCOPED_ATTR)) { e.textContent = css; document.head.insertBefore(e, document.head.firstChild); } else { cssText += css; } } else if (e.import && e.import.body) { var importCss = this.resolveCss(e.import.body.textContent, e.import); if (!settings.useNativeShadow && e.hasAttribute(this.SHADY_UNSCOPED_ATTR)) { if (!this.unscopedStyleImports.has(e.import)) { this.unscopedStyleImports.set(e.import, true); var importStyle = document.createElement('style'); importStyle.setAttribute(this.SHADY_UNSCOPED_ATTR, ''); importStyle.textContent = importCss; document.head.insertBefore(importStyle, document.head.firstChild); } } else { cssText += importCss; } } } } return cssText; }, styleIncludesToTemplate: function (targetTemplate) { var styles = targetTemplate.content.querySelectorAll('style[include]'); for (var i = 0, s; i < styles.length; i++) { s = styles[i]; s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')), s); } }, _includesToFragment: function (styleIncludes) { var includeArray = styleIncludes.trim().split(' '); var frag = document.createDocumentFragment(); for (var i = 0; i < includeArray.length; i++) { var t = Polymer.DomModule.import(includeArray[i], 'template'); if (t) { this._addStylesToFragment(frag, t.content); } } return frag; }, _addStylesToFragment: function (frag, source) { var s$ = source.querySelectorAll('style'); for (var i = 0, s; i < s$.length; i++) { s = s$[i]; var include = s.getAttribute('include'); if (include) { frag.appendChild(this._includesToFragment(include)); } if (s.textContent) { frag.appendChild(s.cloneNode(true)); } } }, isTargetedBuild: function (buildType) { return settings.useNativeShadow ? buildType === 'shadow' : buildType === 'shady'; }, cssBuildTypeForModule: function (module) { var dm = Polymer.DomModule.import(module); if (dm) { return this.getCssBuildType(dm); } }, getCssBuildType: function (element) { return element.getAttribute('css-build'); }, _findMatchingParen: function (text, start) { var level = 0; for (var i = start, l = text.length; i < l; i++) { switch (text[i]) { case '(': level++; break; case ')': if (--level === 0) { return i; } break; } } return -1; }, processVariableAndFallback: function (str, callback) { var start = str.indexOf('var('); if (start === -1) { return callback(str, '', '', ''); } var end = this._findMatchingParen(str, start + 3); var inner = str.substring(start + 4, end); var prefix = str.substring(0, start); var suffix = this.processVariableAndFallback(str.substring(end + 1), callback); var comma = inner.indexOf(','); if (comma === -1) { return callback(prefix, inner.trim(), '', suffix); } var value = inner.substring(0, comma).trim(); var fallback = inner.substring(comma + 1).trim(); return callback(prefix, value, fallback, suffix); }, rx: { VAR_ASSIGN: /(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi, MIXIN_MATCH: /(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi, VAR_CONSUMED: /(--[\w-]+)\s*([:,;)]|$)/gi, ANIMATION_MATCH: /(animation\s*:)|(animation-name\s*:)/, MEDIA_MATCH: /@media[^(]*(\([^)]*\))/, IS_VAR: /^--/, BRACKETED: /\{[^}]*\}/g, HOST_PREFIX: '(?:^|[^.#[:])', HOST_SUFFIX: '($|[.:[\\s>+~])' }, resolveCss: Polymer.ResolveUrl.resolveCss, parser: Polymer.CssParse, ruleTypes: Polymer.CssParse.types }; }();Polymer.StyleTransformer = function () { var styleUtil = Polymer.StyleUtil; var settings = Polymer.Settings; var api = { dom: function (node, scope, useAttr, shouldRemoveScope) { this._transformDom(node, scope || '', useAttr, shouldRemoveScope); }, _transformDom: function (node, selector, useAttr, shouldRemoveScope) { if (node.setAttribute) { this.element(node, selector, useAttr, shouldRemoveScope); } var c$ = Polymer.dom(node).childNodes; for (var i = 0; i < c$.length; i++) { this._transformDom(c$[i], selector, useAttr, shouldRemoveScope); } }, element: function (element, scope, useAttr, shouldRemoveScope) { if (useAttr) { if (shouldRemoveScope) { element.removeAttribute(SCOPE_NAME); } else { element.setAttribute(SCOPE_NAME, scope); } } else { if (scope) { if (element.classList) { if (shouldRemoveScope) { element.classList.remove(SCOPE_NAME); element.classList.remove(scope); } else { element.classList.add(SCOPE_NAME); element.classList.add(scope); } } else if (element.getAttribute) { var c = element.getAttribute(CLASS); if (shouldRemoveScope) { if (c) { element.setAttribute(CLASS, c.replace(SCOPE_NAME, '').replace(scope, '')); } } else { element.setAttribute(CLASS, (c ? c + ' ' : '') + SCOPE_NAME + ' ' + scope); } } } } }, elementStyles: function (element, callback) { var styles = element._styles; var cssText = ''; var cssBuildType = element.__cssBuild; var passthrough = settings.useNativeShadow || cssBuildType === 'shady'; var cb; if (passthrough) { var self = this; cb = function (rule) { rule.selector = self._slottedToContent(rule.selector); rule.selector = rule.selector.replace(ROOT, ':host > *'); rule.selector = self._dirShadowTransform(rule.selector); if (callback) { callback(rule); } }; } for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) { var rules = styleUtil.rulesForStyle(s); cssText += passthrough ? styleUtil.toCssText(rules, cb) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n'; } return cssText.trim(); }, css: function (rules, scope, ext, callback, useAttr) { var hostScope = this._calcHostScope(scope, ext); scope = this._calcElementScope(scope, useAttr); var self = this; return styleUtil.toCssText(rules, function (rule) { if (!rule.isScoped) { self.rule(rule, scope, hostScope); rule.isScoped = true; } if (callback) { callback(rule, scope, hostScope); } }); }, _calcElementScope: function (scope, useAttr) { if (scope) { return useAttr ? CSS_ATTR_PREFIX + scope + CSS_ATTR_SUFFIX : CSS_CLASS_PREFIX + scope; } else { return ''; } }, _calcHostScope: function (scope, ext) { return ext ? '[is=' + scope + ']' : scope; }, rule: function (rule, scope, hostScope) { this._transformRule(rule, this._transformComplexSelector, scope, hostScope); }, _transformRule: function (rule, transformer, scope, hostScope) { rule.selector = rule.transformedSelector = this._transformRuleCss(rule, transformer, scope, hostScope); }, _splitSelectorList: function (selector) { var parts = []; var part = ''; for (var i = 0; i >= 0 && i < selector.length; i++) { if (selector[i] === '(') { var end = styleUtil._findMatchingParen(selector, i); part += selector.slice(i, end + 1); i = end; } else if (selector[i] === COMPLEX_SELECTOR_SEP) { parts.push(part); part = ''; } else { part += selector[i]; } } if (part) { parts.push(part); } if (parts.length === 0) { parts.push(selector); } return parts; }, _transformRuleCss: function (rule, transformer, scope, hostScope) { var p$ = this._splitSelectorList(rule.selector); if (!styleUtil.isKeyframesSelector(rule)) { for (var i = 0, l = p$.length, p; i < l && (p = p$[i]); i++) { p$[i] = transformer.call(this, p, scope, hostScope); } } return p$.join(COMPLEX_SELECTOR_SEP); }, _ensureScopedDir: function (s) { var m = s.match(DIR_PAREN); if (m && m[1] === '' && m[0].length === s.length) { s = '*' + s; } return s; }, _additionalDirSelectors: function (dir, after, prefix) { if (!dir || !after) { return ''; } prefix = prefix || ''; return COMPLEX_SELECTOR_SEP + prefix + ' ' + dir + ' ' + after; }, _transformComplexSelector: function (selector, scope, hostScope) { var stop = false; var hostContext = false; var dir = false; var self = this; selector = selector.trim(); selector = this._slottedToContent(selector); selector = selector.replace(ROOT, ':host > *'); selector = selector.replace(CONTENT_START, HOST + ' $1'); selector = this._ensureScopedDir(selector); selector = selector.replace(SIMPLE_SELECTOR_SEP, function (m, c, s) { if (!stop) { var info = self._transformCompoundSelector(s, c, scope, hostScope); stop = stop || info.stop; hostContext = hostContext || info.hostContext; dir = dir || info.dir; c = info.combinator; s = info.value; } else { s = s.replace(SCOPE_JUMP, ' '); } return c + s; }); if (hostContext) { selector = selector.replace(HOST_CONTEXT_PAREN, function (m, pre, paren, post) { var replacement = pre + paren + ' ' + hostScope + post + COMPLEX_SELECTOR_SEP + ' ' + pre + hostScope + paren + post; if (dir) { replacement += self._additionalDirSelectors(paren, post, hostScope); } return replacement; }); } return selector; }, _transformDir: function (s) { s = s.replace(HOST_DIR, HOST_DIR_REPLACE); s = s.replace(DIR_PAREN, DIR_REPLACE); return s; }, _transformCompoundSelector: function (selector, combinator, scope, hostScope) { var jumpIndex = selector.search(SCOPE_JUMP); var hostContext = false; var dir = false; if (selector.match(DIR_PAREN)) { selector = this._transformDir(selector); dir = true; } if (selector.indexOf(HOST_CONTEXT) >= 0) { hostContext = true; } else if (selector.indexOf(HOST) >= 0) { selector = this._transformHostSelector(selector, hostScope); } else if (jumpIndex !== 0) { selector = scope ? this._transformSimpleSelector(selector, scope) : selector; } if (selector.indexOf(CONTENT) >= 0) { combinator = ''; } var stop; if (jumpIndex >= 0) { selector = selector.replace(SCOPE_JUMP, ' '); stop = true; } return { value: selector, combinator: combinator, stop: stop, hostContext: hostContext, dir: dir }; }, _transformSimpleSelector: function (selector, scope) { var p$ = selector.split(PSEUDO_PREFIX); p$[0] += scope; return p$.join(PSEUDO_PREFIX); }, _transformHostSelector: function (selector, hostScope) { var m = selector.match(HOST_PAREN); var paren = m && m[2].trim() || ''; if (paren) { if (!paren[0].match(SIMPLE_SELECTOR_PREFIX)) { var typeSelector = paren.split(SIMPLE_SELECTOR_PREFIX)[0]; if (typeSelector === hostScope) { return paren; } else { return SELECTOR_NO_MATCH; } } else { return selector.replace(HOST_PAREN, function (m, host, paren) { return hostScope + paren; }); } } else { return selector.replace(HOST, hostScope); } }, documentRule: function (rule) { rule.selector = rule.parsedSelector; this.normalizeRootSelector(rule); if (!settings.useNativeShadow) { this._transformRule(rule, this._transformDocumentSelector); } }, normalizeRootSelector: function (rule) { rule.selector = rule.selector.replace(ROOT, 'html'); var parts = this._splitSelectorList(rule.selector); parts = parts.filter(function (part) { return !part.match(HOST_OR_HOST_GT_STAR); }); rule.selector = parts.join(COMPLEX_SELECTOR_SEP); }, _transformDocumentSelector: function (selector) { return this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR); }, _slottedToContent: function (cssText) { return cssText.replace(SLOTTED_PAREN, CONTENT + '> $1'); }, _dirShadowTransform: function (selector) { if (!selector.match(/:dir\(/)) { return selector; } return this._splitSelectorList(selector).map(function (s) { s = this._ensureScopedDir(s); s = this._transformDir(s); var m = HOST_CONTEXT_PAREN.exec(s); if (m) { s += this._additionalDirSelectors(m[2], m[3], ''); } return s; }, this).join(COMPLEX_SELECTOR_SEP); }, SCOPE_NAME: 'style-scope' }; var SCOPE_NAME = api.SCOPE_NAME; var SCOPE_DOC_SELECTOR = ':not([' + SCOPE_NAME + '])' + ':not(.' + SCOPE_NAME + ')'; var COMPLEX_SELECTOR_SEP = ','; var SIMPLE_SELECTOR_SEP = /(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=\[])+)/g; var SIMPLE_SELECTOR_PREFIX = /[[.:#*]/; var HOST = ':host'; var ROOT = ':root'; var HOST_PAREN = /(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/; var HOST_CONTEXT = ':host-context'; var HOST_CONTEXT_PAREN = /(.*)(?::host-context)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))(.*)/; var CONTENT = '::content'; var SCOPE_JUMP = /::content|::shadow|\/deep\//; var CSS_CLASS_PREFIX = '.'; var CSS_ATTR_PREFIX = '[' + SCOPE_NAME + '~='; var CSS_ATTR_SUFFIX = ']'; var PSEUDO_PREFIX = ':'; var CLASS = 'class'; var CONTENT_START = new RegExp('^(' + CONTENT + ')'); var SELECTOR_NO_MATCH = 'should_not_match'; var SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g; var HOST_OR_HOST_GT_STAR = /:host(?:\s*>\s*\*)?/; var DIR_PAREN = /(.*):dir\((ltr|rtl)\)/; var DIR_REPLACE = ':host-context([dir="$2"]) $1'; var HOST_DIR = /:host\(:dir\((rtl|ltr)\)\)/g; var HOST_DIR_REPLACE = ':host-context([dir="$1"])'; return api; }();Polymer.StyleExtends = function () { var styleUtil = Polymer.StyleUtil; return { hasExtends: function (cssText) { return Boolean(cssText.match(this.rx.EXTEND)); }, transform: function (style) { var rules = styleUtil.rulesForStyle(style); var self = this; styleUtil.forEachRule(rules, function (rule) { self._mapRuleOntoParent(rule); if (rule.parent) { var m; while (m = self.rx.EXTEND.exec(rule.cssText)) { var extend = m[1]; var extendor = self._findExtendor(extend, rule); if (extendor) { self._extendRule(rule, extendor); } } } rule.cssText = rule.cssText.replace(self.rx.EXTEND, ''); }); return styleUtil.toCssText(rules, function (rule) { if (rule.selector.match(self.rx.STRIP)) { rule.cssText = ''; } }, true); }, _mapRuleOntoParent: function (rule) { if (rule.parent) { var map = rule.parent.map || (rule.parent.map = {}); var parts = rule.selector.split(','); for (var i = 0, p; i < parts.length; i++) { p = parts[i]; map[p.trim()] = rule; } return map; } }, _findExtendor: function (extend, rule) { return rule.parent && rule.parent.map && rule.parent.map[extend] || this._findExtendor(extend, rule.parent); }, _extendRule: function (target, source) { if (target.parent !== source.parent) { this._cloneAndAddRuleToParent(source, target.parent); } target.extends = target.extends || []; target.extends.push(source); source.selector = source.selector.replace(this.rx.STRIP, ''); source.selector = (source.selector && source.selector + ',\n') + target.selector; if (source.extends) { source.extends.forEach(function (e) { this._extendRule(target, e); }, this); } }, _cloneAndAddRuleToParent: function (rule, parent) { rule = Object.create(rule); rule.parent = parent; if (rule.extends) { rule.extends = rule.extends.slice(); } parent.rules.push(rule); }, rx: { EXTEND: /@extends\(([^)]*)\)\s*?;/gim, STRIP: /%[^,]*$/ } }; }();Polymer.ApplyShim = function () { 'use strict'; var styleUtil = Polymer.StyleUtil; var MIXIN_MATCH = styleUtil.rx.MIXIN_MATCH; var VAR_ASSIGN = styleUtil.rx.VAR_ASSIGN; var BAD_VAR = /var\(\s*(--[^,]*),\s*(--[^)]*)\)/g; var APPLY_NAME_CLEAN = /;\s*/m; var INITIAL_INHERIT = /^\s*(initial)|(inherit)\s*$/; var MIXIN_VAR_SEP = '_-_'; var mixinMap = {}; function mapSet(name, props) { name = name.trim(); mixinMap[name] = { properties: props, dependants: {} }; } function mapGet(name) { name = name.trim(); return mixinMap[name]; } function replaceInitialOrInherit(property, value) { var match = INITIAL_INHERIT.exec(value); if (match) { if (match[1]) { value = ApplyShim._getInitialValueForProperty(property); } else { value = 'apply-shim-inherit'; } } return value; } function cssTextToMap(text) { var props = text.split(';'); var property, value; var out = {}; for (var i = 0, p, sp; i < props.length; i++) { p = props[i]; if (p) { sp = p.split(':'); if (sp.length > 1) { property = sp[0].trim(); value = replaceInitialOrInherit(property, sp.slice(1).join(':')); out[property] = value; } } } return out; } function invalidateMixinEntry(mixinEntry) { var currentProto = ApplyShim.__currentElementProto; var currentElementName = currentProto && currentProto.is; for (var elementName in mixinEntry.dependants) { if (elementName !== currentElementName) { mixinEntry.dependants[elementName].__applyShimInvalid = true; } } } function produceCssProperties(matchText, propertyName, valueProperty, valueMixin) { if (valueProperty) { styleUtil.processVariableAndFallback(valueProperty, function (prefix, value) { if (value && mapGet(value)) { valueMixin = '@apply ' + value + ';'; } }); } if (!valueMixin) { return matchText; } var mixinAsProperties = consumeCssProperties(valueMixin); var prefix = matchText.slice(0, matchText.indexOf('--')); var mixinValues = cssTextToMap(mixinAsProperties); var combinedProps = mixinValues; var mixinEntry = mapGet(propertyName); var oldProps = mixinEntry && mixinEntry.properties; if (oldProps) { combinedProps = Object.create(oldProps); combinedProps = Polymer.Base.mixin(combinedProps, mixinValues); } else { mapSet(propertyName, combinedProps); } var out = []; var p, v; var needToInvalidate = false; for (p in combinedProps) { v = mixinValues[p]; if (v === undefined) { v = 'initial'; } if (oldProps && !(p in oldProps)) { needToInvalidate = true; } out.push(propertyName + MIXIN_VAR_SEP + p + ': ' + v); } if (needToInvalidate) { invalidateMixinEntry(mixinEntry); } if (mixinEntry) { mixinEntry.properties = combinedProps; } if (valueProperty) { prefix = matchText + ';' + prefix; } return prefix + out.join('; ') + ';'; } function fixVars(matchText, varA, varB) { return 'var(' + varA + ',' + 'var(' + varB + '))'; } function atApplyToCssProperties(mixinName, fallbacks) { mixinName = mixinName.replace(APPLY_NAME_CLEAN, ''); var vars = []; var mixinEntry = mapGet(mixinName); if (!mixinEntry) { mapSet(mixinName, {}); mixinEntry = mapGet(mixinName); } if (mixinEntry) { var currentProto = ApplyShim.__currentElementProto; if (currentProto) { mixinEntry.dependants[currentProto.is] = currentProto; } var p, parts, f; for (p in mixinEntry.properties) { f = fallbacks && fallbacks[p]; parts = [ p, ': var(', mixinName, MIXIN_VAR_SEP, p ]; if (f) { parts.push(',', f); } parts.push(')'); vars.push(parts.join('')); } } return vars.join('; '); } function consumeCssProperties(text) { var m; while (m = MIXIN_MATCH.exec(text)) { var matchText = m[0]; var mixinName = m[1]; var idx = m.index; var applyPos = idx + matchText.indexOf('@apply'); var afterApplyPos = idx + matchText.length; var textBeforeApply = text.slice(0, applyPos); var textAfterApply = text.slice(afterApplyPos); var defaults = cssTextToMap(textBeforeApply); var replacement = atApplyToCssProperties(mixinName, defaults); text = [ textBeforeApply, replacement, textAfterApply ].join(''); MIXIN_MATCH.lastIndex = idx + replacement.length; } return text; } var ApplyShim = { _measureElement: null, _map: mixinMap, _separator: MIXIN_VAR_SEP, transform: function (styles, elementProto) { this.__currentElementProto = elementProto; styleUtil.forRulesInStyles(styles, this._boundFindDefinitions); styleUtil.forRulesInStyles(styles, this._boundFindApplications); if (elementProto) { elementProto.__applyShimInvalid = false; } this.__currentElementProto = null; }, _findDefinitions: function (rule) { var cssText = rule.parsedCssText; cssText = cssText.replace(BAD_VAR, fixVars); cssText = cssText.replace(VAR_ASSIGN, produceCssProperties); rule.cssText = cssText; if (rule.selector === ':root') { rule.selector = ':host > *'; } }, _findApplications: function (rule) { rule.cssText = consumeCssProperties(rule.cssText); }, transformRule: function (rule) { this._findDefinitions(rule); this._findApplications(rule); }, _getInitialValueForProperty: function (property) { if (!this._measureElement) { this._measureElement = document.createElement('meta'); this._measureElement.style.all = 'initial'; document.head.appendChild(this._measureElement); } return window.getComputedStyle(this._measureElement).getPropertyValue(property); } }; ApplyShim._boundTransformRule = ApplyShim.transformRule.bind(ApplyShim); ApplyShim._boundFindDefinitions = ApplyShim._findDefinitions.bind(ApplyShim); ApplyShim._boundFindApplications = ApplyShim._findApplications.bind(ApplyShim); return ApplyShim; }();(function () { var prepElement = Polymer.Base._prepElement; var nativeShadow = Polymer.Settings.useNativeShadow; var styleUtil = Polymer.StyleUtil; var styleTransformer = Polymer.StyleTransformer; var styleExtends = Polymer.StyleExtends; var applyShim = Polymer.ApplyShim; var settings = Polymer.Settings; Polymer.Base._addFeature({ _prepElement: function (element) { if (this._encapsulateStyle && this.__cssBuild !== 'shady') { styleTransformer.element(element, this.is, this._scopeCssViaAttr); } prepElement.call(this, element); }, _prepStyles: function () { if (this._encapsulateStyle === undefined) { this._encapsulateStyle = !nativeShadow; } if (!nativeShadow) { this._scopeStyle = styleUtil.applyStylePlaceHolder(this.is); } this.__cssBuild = styleUtil.cssBuildTypeForModule(this.is); }, _prepShimStyles: function () { if (this._template) { var hasTargetedCssBuild = styleUtil.isTargetedBuild(this.__cssBuild); if (settings.useNativeCSSProperties && this.__cssBuild === 'shadow' && hasTargetedCssBuild) { if (settings.preserveStyleIncludes) { styleUtil.styleIncludesToTemplate(this._template); } return; } this._styles = this._styles || this._collectStyles(); if (settings.useNativeCSSProperties && !this.__cssBuild) { applyShim.transform(this._styles, this); } var cssText = settings.useNativeCSSProperties && hasTargetedCssBuild ? this._styles.length && this._styles[0].textContent.trim() : styleTransformer.elementStyles(this); this._prepStyleProperties(); if (!this._needsStyleProperties() && cssText) { styleUtil.applyCss(cssText, this.is, nativeShadow ? this._template.content : null, this._scopeStyle); } } else { this._styles = []; } }, _collectStyles: function () { var styles = []; var cssText = '', m$ = this.styleModules; if (m$) { for (var i = 0, l = m$.length, m; i < l && (m = m$[i]); i++) { cssText += styleUtil.cssFromModule(m); } } cssText += styleUtil.cssFromModule(this.is); var p = this._template && this._template.parentNode; if (this._template && (!p || p.id.toLowerCase() !== this.is)) { cssText += styleUtil.cssFromElement(this._template); } if (cssText) { var style = document.createElement('style'); style.textContent = cssText; if (styleExtends.hasExtends(style.textContent)) { cssText = styleExtends.transform(style); } styles.push(style); } return styles; }, _elementAdd: function (node) { if (this._encapsulateStyle) { if (node.__styleScoped) { node.__styleScoped = false; } else { styleTransformer.dom(node, this.is, this._scopeCssViaAttr); } } }, _elementRemove: function (node) { if (this._encapsulateStyle) { styleTransformer.dom(node, this.is, this._scopeCssViaAttr, true); } }, scopeSubtree: function (container, shouldObserve) { if (nativeShadow) { return; } var self = this; var scopify = function (node) { if (node.nodeType === Node.ELEMENT_NODE) { var className = node.getAttribute('class'); node.setAttribute('class', self._scopeElementClass(node, className)); var n$ = node.querySelectorAll('*'); for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { className = n.getAttribute('class'); n.setAttribute('class', self._scopeElementClass(n, className)); } } }; scopify(container); if (shouldObserve) { var mo = new MutationObserver(function (mxns) { for (var i = 0, m; i < mxns.length && (m = mxns[i]); i++) { if (m.addedNodes) { for (var j = 0; j < m.addedNodes.length; j++) { scopify(m.addedNodes[j]); } } } }); mo.observe(container, { childList: true, subtree: true }); return mo; } } }); }());Polymer.StyleProperties = function () { 'use strict'; var matchesSelector = Polymer.DomApi.matchesSelector; var styleUtil = Polymer.StyleUtil; var styleTransformer = Polymer.StyleTransformer; var IS_IE = navigator.userAgent.match('Trident'); var settings = Polymer.Settings; return { decorateStyles: function (styles, scope) { var self = this, props = {}, keyframes = [], ruleIndex = 0; var scopeSelector = styleTransformer._calcHostScope(scope.is, scope.extends); styleUtil.forRulesInStyles(styles, function (rule, style) { self.decorateRule(rule); rule.index = ruleIndex++; self.whenHostOrRootRule(scope, rule, style, function (info) { if (rule.parent.type === styleUtil.ruleTypes.MEDIA_RULE) { scope.__notStyleScopeCacheable = true; } if (info.isHost) { var hostContextOrFunction = info.selector.split(' ').some(function (s) { return s.indexOf(scopeSelector) === 0 && s.length !== scopeSelector.length; }); scope.__notStyleScopeCacheable = scope.__notStyleScopeCacheable || hostContextOrFunction; } }); self.collectPropertiesInCssText(rule.propertyInfo.cssText, props); }, function onKeyframesRule(rule) { keyframes.push(rule); }); styles._keyframes = keyframes; var names = []; for (var i in props) { names.push(i); } return names; }, decorateRule: function (rule) { if (rule.propertyInfo) { return rule.propertyInfo; } var info = {}, properties = {}; var hasProperties = this.collectProperties(rule, properties); if (hasProperties) { info.properties = properties; rule.rules = null; } info.cssText = this.collectCssText(rule); rule.propertyInfo = info; return info; }, collectProperties: function (rule, properties) { var info = rule.propertyInfo; if (info) { if (info.properties) { Polymer.Base.mixin(properties, info.properties); return true; } } else { var m, rx = this.rx.VAR_ASSIGN; var cssText = rule.parsedCssText; var value; var any; while (m = rx.exec(cssText)) { value = (m[2] || m[3]).trim(); if (value !== 'inherit') { properties[m[1].trim()] = value; } any = true; } return any; } }, collectCssText: function (rule) { return this.collectConsumingCssText(rule.parsedCssText); }, collectConsumingCssText: function (cssText) { return cssText.replace(this.rx.BRACKETED, '').replace(this.rx.VAR_ASSIGN, ''); }, collectPropertiesInCssText: function (cssText, props) { var m; while (m = this.rx.VAR_CONSUMED.exec(cssText)) { var name = m[1]; if (m[2] !== ':') { props[name] = true; } } }, reify: function (props) { var names = Object.getOwnPropertyNames(props); for (var i = 0, n; i < names.length; i++) { n = names[i]; props[n] = this.valueForProperty(props[n], props); } }, valueForProperty: function (property, props) { if (property) { if (property.indexOf(';') >= 0) { property = this.valueForProperties(property, props); } else { var self = this; var fn = function (prefix, value, fallback, suffix) { var propertyValue = self.valueForProperty(props[value], props); if (!propertyValue || propertyValue === 'initial') { propertyValue = self.valueForProperty(props[fallback] || fallback, props) || fallback; } else if (propertyValue === 'apply-shim-inherit') { propertyValue = 'inherit'; } return prefix + (propertyValue || '') + suffix; }; property = styleUtil.processVariableAndFallback(property, fn); } } return property && property.trim() || ''; }, valueForProperties: function (property, props) { var parts = property.split(';'); for (var i = 0, p, m; i < parts.length; i++) { if (p = parts[i]) { this.rx.MIXIN_MATCH.lastIndex = 0; m = this.rx.MIXIN_MATCH.exec(p); if (m) { p = this.valueForProperty(props[m[1]], props); } else { var colon = p.indexOf(':'); if (colon !== -1) { var pp = p.substring(colon); pp = pp.trim(); pp = this.valueForProperty(pp, props) || pp; p = p.substring(0, colon) + pp; } } parts[i] = p && p.lastIndexOf(';') === p.length - 1 ? p.slice(0, -1) : p || ''; } } return parts.join(';'); }, applyProperties: function (rule, props) { var output = ''; if (!rule.propertyInfo) { this.decorateRule(rule); } if (rule.propertyInfo.cssText) { output = this.valueForProperties(rule.propertyInfo.cssText, props); } rule.cssText = output; }, applyKeyframeTransforms: function (rule, keyframeTransforms) { var input = rule.cssText; var output = rule.cssText; if (rule.hasAnimations == null) { rule.hasAnimations = this.rx.ANIMATION_MATCH.test(input); } if (rule.hasAnimations) { var transform; if (rule.keyframeNamesToTransform == null) { rule.keyframeNamesToTransform = []; for (var keyframe in keyframeTransforms) { transform = keyframeTransforms[keyframe]; output = transform(input); if (input !== output) { input = output; rule.keyframeNamesToTransform.push(keyframe); } } } else { for (var i = 0; i < rule.keyframeNamesToTransform.length; ++i) { transform = keyframeTransforms[rule.keyframeNamesToTransform[i]]; input = transform(input); } output = input; } } rule.cssText = output; }, propertyDataFromStyles: function (styles, element) { var props = {}, self = this; var o = []; styleUtil.forActiveRulesInStyles(styles, function (rule) { if (!rule.propertyInfo) { self.decorateRule(rule); } var selectorToMatch = rule.transformedSelector || rule.parsedSelector; if (element && rule.propertyInfo.properties && selectorToMatch) { if (matchesSelector.call(element, selectorToMatch)) { self.collectProperties(rule, props); addToBitMask(rule.index, o); } } }); return { properties: props, key: o }; }, _rootSelector: /:root|:host\s*>\s*\*/, _checkRoot: function (hostScope, selector) { return Boolean(selector.match(this._rootSelector)) || hostScope === 'html' && selector.indexOf('html') > -1; }, whenHostOrRootRule: function (scope, rule, style, callback) { if (!rule.propertyInfo) { self.decorateRule(rule); } if (!rule.propertyInfo.properties) { return; } var hostScope = scope.is ? styleTransformer._calcHostScope(scope.is, scope.extends) : 'html'; var parsedSelector = rule.parsedSelector; var isRoot = this._checkRoot(hostScope, parsedSelector); var isHost = !isRoot && parsedSelector.indexOf(':host') === 0; var cssBuild = scope.__cssBuild || style.__cssBuild; if (cssBuild === 'shady') { isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') > -1; isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0; } if (!isRoot && !isHost) { return; } var selectorToMatch = hostScope; if (isHost) { if (settings.useNativeShadow && !rule.transformedSelector) { rule.transformedSelector = styleTransformer._transformRuleCss(rule, styleTransformer._transformComplexSelector, scope.is, hostScope); } selectorToMatch = rule.transformedSelector || rule.parsedSelector; } if (isRoot && hostScope === 'html') { selectorToMatch = rule.transformedSelector || rule.parsedSelector; } callback({ selector: selectorToMatch, isHost: isHost, isRoot: isRoot }); }, hostAndRootPropertiesForScope: function (scope) { var hostProps = {}, rootProps = {}, self = this; styleUtil.forActiveRulesInStyles(scope._styles, function (rule, style) { self.whenHostOrRootRule(scope, rule, style, function (info) { var element = scope._element || scope; if (matchesSelector.call(element, info.selector)) { if (info.isHost) { self.collectProperties(rule, hostProps); } else { self.collectProperties(rule, rootProps); } } }); }); return { rootProps: rootProps, hostProps: hostProps }; }, transformStyles: function (element, properties, scopeSelector) { var self = this; var hostSelector = styleTransformer._calcHostScope(element.is, element.extends); var rxHostSelector = element.extends ? '\\' + hostSelector.slice(0, -1) + '\\]' : hostSelector; var hostRx = new RegExp(this.rx.HOST_PREFIX + rxHostSelector + this.rx.HOST_SUFFIX); var keyframeTransforms = this._elementKeyframeTransforms(element, scopeSelector); return styleTransformer.elementStyles(element, function (rule) { self.applyProperties(rule, properties); if (!settings.useNativeShadow && !Polymer.StyleUtil.isKeyframesSelector(rule) && rule.cssText) { self.applyKeyframeTransforms(rule, keyframeTransforms); self._scopeSelector(rule, hostRx, hostSelector, element._scopeCssViaAttr, scopeSelector); } }); }, _elementKeyframeTransforms: function (element, scopeSelector) { var keyframesRules = element._styles._keyframes; var keyframeTransforms = {}; if (!settings.useNativeShadow && keyframesRules) { for (var i = 0, keyframesRule = keyframesRules[i]; i < keyframesRules.length; keyframesRule = keyframesRules[++i]) { this._scopeKeyframes(keyframesRule, scopeSelector); keyframeTransforms[keyframesRule.keyframesName] = this._keyframesRuleTransformer(keyframesRule); } } return keyframeTransforms; }, _keyframesRuleTransformer: function (keyframesRule) { return function (cssText) { return cssText.replace(keyframesRule.keyframesNameRx, keyframesRule.transformedKeyframesName); }; }, _scopeKeyframes: function (rule, scopeId) { rule.keyframesNameRx = new RegExp(rule.keyframesName, 'g'); rule.transformedKeyframesName = rule.keyframesName + '-' + scopeId; rule.transformedSelector = rule.transformedSelector || rule.selector; rule.selector = rule.transformedSelector.replace(rule.keyframesName, rule.transformedKeyframesName); }, _hasDirOrHostContext: function (parsedSelector) { return /:host-context|:dir/.test(parsedSelector); }, _scopeSelector: function (rule, hostRx, hostSelector, viaAttr, scopeId) { rule.transformedSelector = rule.transformedSelector || rule.selector; var selector = rule.transformedSelector; var scope = styleTransformer._calcElementScope(scopeId, viaAttr); var hostScope = styleTransformer._calcElementScope(hostSelector, viaAttr); var parts = selector.split(','); var isDirOrHostContextSelector = this._hasDirOrHostContext(rule.parsedSelector); for (var i = 0, l = parts.length, p; i < l && (p = parts[i]); i++) { parts[i] = p.match(hostRx) ? p.replace(hostSelector, scope) : isDirOrHostContextSelector ? p.replace(hostScope, scope + ' ' + hostScope) : scope + ' ' + p; } rule.selector = parts.join(','); }, applyElementScopeSelector: function (element, selector, old, viaAttr) { var c = viaAttr ? element.getAttribute(styleTransformer.SCOPE_NAME) : element.getAttribute('class') || ''; var v = old ? c.replace(old, selector) : (c ? c + ' ' : '') + this.XSCOPE_NAME + ' ' + selector; if (c !== v) { if (viaAttr) { element.setAttribute(styleTransformer.SCOPE_NAME, v); } else { element.setAttribute('class', v); } } }, applyElementStyle: function (element, properties, selector, style) { var cssText = style ? style.textContent || '' : this.transformStyles(element, properties, selector); var s = element._customStyle; if (s && !settings.useNativeShadow && s !== style) { s._useCount--; if (s._useCount <= 0 && s.parentNode) { s.parentNode.removeChild(s); } } if (settings.useNativeShadow) { if (element._customStyle) { element._customStyle.textContent = cssText; style = element._customStyle; } else if (cssText) { style = styleUtil.applyCss(cssText, selector, element.root, element._scopeStyle); } } else { if (!style) { if (cssText) { style = styleUtil.applyCss(cssText, selector, null, element._scopeStyle); } } else if (!style.parentNode) { if (IS_IE && cssText.indexOf('@media') > -1) { style.textContent = cssText; } styleUtil.applyStyle(style, null, element._scopeStyle); } } if (style) { style._useCount = style._useCount || 0; if (element._customStyle != style) { style._useCount++; } element._customStyle = style; } return style; }, mixinCustomStyle: function (props, customStyle) { var v; for (var i in customStyle) { v = customStyle[i]; if (v || v === 0) { props[i] = v; } } }, updateNativeStyleProperties: function (element, properties) { var oldPropertyNames = element.__customStyleProperties; if (oldPropertyNames) { for (var i = 0; i < oldPropertyNames.length; i++) { element.style.removeProperty(oldPropertyNames[i]); } } var propertyNames = []; for (var p in properties) { if (properties[p] !== null) { element.style.setProperty(p, properties[p]); propertyNames.push(p); } } element.__customStyleProperties = propertyNames; }, rx: styleUtil.rx, XSCOPE_NAME: 'x-scope' }; function addToBitMask(n, bits) { var o = parseInt(n / 32); var v = 1 << n % 32; bits[o] = (bits[o] || 0) | v; } }();(function () { Polymer.StyleCache = function () { this.cache = {}; }; Polymer.StyleCache.prototype = { MAX: 100, store: function (is, data, keyValues, keyStyles) { data.keyValues = keyValues; data.styles = keyStyles; var s$ = this.cache[is] = this.cache[is] || []; s$.push(data); if (s$.length > this.MAX) { s$.shift(); } }, retrieve: function (is, keyValues, keyStyles) { var cache = this.cache[is]; if (cache) { for (var i = cache.length - 1, data; i >= 0; i--) { data = cache[i]; if (keyStyles === data.styles && this._objectsEqual(keyValues, data.keyValues)) { return data; } } } }, clear: function () { this.cache = {}; }, _objectsEqual: function (target, source) { var t, s; for (var i in target) { t = target[i], s = source[i]; if (!(typeof t === 'object' && t ? this._objectsStrictlyEqual(t, s) : t === s)) { return false; } } if (Array.isArray(target)) { return target.length === source.length; } return true; }, _objectsStrictlyEqual: function (target, source) { return this._objectsEqual(target, source) && this._objectsEqual(source, target); } }; }());Polymer.StyleDefaults = function () { var styleProperties = Polymer.StyleProperties; var StyleCache = Polymer.StyleCache; var nativeVariables = Polymer.Settings.useNativeCSSProperties; var api = { _styles: [], _properties: null, customStyle: {}, _styleCache: new StyleCache(), _element: Polymer.DomApi.wrap(document.documentElement), addStyle: function (style) { this._styles.push(style); this._properties = null; }, get _styleProperties() { if (!this._properties) { styleProperties.decorateStyles(this._styles, this); this._styles._scopeStyleProperties = null; this._properties = styleProperties.hostAndRootPropertiesForScope(this).rootProps; styleProperties.mixinCustomStyle(this._properties, this.customStyle); styleProperties.reify(this._properties); } return this._properties; }, hasStyleProperties: function () { return Boolean(this._properties); }, _needsStyleProperties: function () { }, _computeStyleProperties: function () { return this._styleProperties; }, updateStyles: function (properties) { this._properties = null; if (properties) { Polymer.Base.mixin(this.customStyle, properties); } this._styleCache.clear(); for (var i = 0, s; i < this._styles.length; i++) { s = this._styles[i]; s = s.__importElement || s; s._apply(); } if (nativeVariables) { styleProperties.updateNativeStyleProperties(document.documentElement, this.customStyle); } } }; return api; }();(function () { 'use strict'; var serializeValueToAttribute = Polymer.Base.serializeValueToAttribute; var propertyUtils = Polymer.StyleProperties; var styleTransformer = Polymer.StyleTransformer; var styleDefaults = Polymer.StyleDefaults; var nativeShadow = Polymer.Settings.useNativeShadow; var nativeVariables = Polymer.Settings.useNativeCSSProperties; Polymer.Base._addFeature({ _prepStyleProperties: function () { if (!nativeVariables) { this._ownStylePropertyNames = this._styles && this._styles.length ? propertyUtils.decorateStyles(this._styles, this) : null; } }, customStyle: null, getComputedStyleValue: function (property) { if (!nativeVariables && !this._styleProperties) { this._computeStyleProperties(); } return !nativeVariables && this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property); }, _setupStyleProperties: function () { this.customStyle = {}; this._styleCache = null; this._styleProperties = null; this._scopeSelector = null; this._ownStyleProperties = null; this._customStyle = null; }, _needsStyleProperties: function () { return Boolean(!nativeVariables && this._ownStylePropertyNames && this._ownStylePropertyNames.length); }, _validateApplyShim: function () { if (this.__applyShimInvalid) { Polymer.ApplyShim.transform(this._styles, this.__proto__); var cssText = styleTransformer.elementStyles(this); if (nativeShadow) { var templateStyle = this._template.content.querySelector('style'); if (templateStyle) { templateStyle.textContent = cssText; } } else { var shadyStyle = this._scopeStyle && this._scopeStyle.nextSibling; if (shadyStyle) { shadyStyle.textContent = cssText; } } } }, _beforeAttached: function () { if ((!this._scopeSelector || this.__stylePropertiesInvalid) && this._needsStyleProperties()) { this.__stylePropertiesInvalid = false; this._updateStyleProperties(); } }, _findStyleHost: function () { var e = this, root; while (root = Polymer.dom(e).getOwnerRoot()) { if (Polymer.isInstance(root.host)) { return root.host; } e = root.host; } return styleDefaults; }, _updateStyleProperties: function () { var info, scope = this._findStyleHost(); if (!scope._styleProperties) { scope._computeStyleProperties(); } if (!scope._styleCache) { scope._styleCache = new Polymer.StyleCache(); } var scopeData = propertyUtils.propertyDataFromStyles(scope._styles, this); var scopeCacheable = !this.__notStyleScopeCacheable; if (scopeCacheable) { scopeData.key.customStyle = this.customStyle; info = scope._styleCache.retrieve(this.is, scopeData.key, this._styles); } var scopeCached = Boolean(info); if (scopeCached) { this._styleProperties = info._styleProperties; } else { this._computeStyleProperties(scopeData.properties); } this._computeOwnStyleProperties(); if (!scopeCached) { info = styleCache.retrieve(this.is, this._ownStyleProperties, this._styles); } var globalCached = Boolean(info) && !scopeCached; var style = this._applyStyleProperties(info); if (!scopeCached) { style = style && nativeShadow ? style.cloneNode(true) : style; info = { style: style, _scopeSelector: this._scopeSelector, _styleProperties: this._styleProperties }; if (scopeCacheable) { scopeData.key.customStyle = {}; this.mixin(scopeData.key.customStyle, this.customStyle); scope._styleCache.store(this.is, info, scopeData.key, this._styles); } if (!globalCached) { styleCache.store(this.is, Object.create(info), this._ownStyleProperties, this._styles); } } }, _computeStyleProperties: function (scopeProps) { var scope = this._findStyleHost(); if (!scope._styleProperties) { scope._computeStyleProperties(); } var props = Object.create(scope._styleProperties); var hostAndRootProps = propertyUtils.hostAndRootPropertiesForScope(this); this.mixin(props, hostAndRootProps.hostProps); scopeProps = scopeProps || propertyUtils.propertyDataFromStyles(scope._styles, this).properties; this.mixin(props, scopeProps); this.mixin(props, hostAndRootProps.rootProps); propertyUtils.mixinCustomStyle(props, this.customStyle); propertyUtils.reify(props); this._styleProperties = props; }, _computeOwnStyleProperties: function () { var props = {}; for (var i = 0, n; i < this._ownStylePropertyNames.length; i++) { n = this._ownStylePropertyNames[i]; props[n] = this._styleProperties[n]; } this._ownStyleProperties = props; }, _scopeCount: 0, _applyStyleProperties: function (info) { var oldScopeSelector = this._scopeSelector; this._scopeSelector = info ? info._scopeSelector : this.is + '-' + this.__proto__._scopeCount++; var style = propertyUtils.applyElementStyle(this, this._styleProperties, this._scopeSelector, info && info.style); if (!nativeShadow) { propertyUtils.applyElementScopeSelector(this, this._scopeSelector, oldScopeSelector, this._scopeCssViaAttr); } return style; }, serializeValueToAttribute: function (value, attribute, node) { node = node || this; if (attribute === 'class' && !nativeShadow) { var host = node === this ? this.domHost || this.dataHost : this; if (host) { value = host._scopeElementClass(node, value); } } node = this.shadyRoot && this.shadyRoot._hasDistributed ? Polymer.dom(node) : node; serializeValueToAttribute.call(this, value, attribute, node); }, _scopeElementClass: function (element, selector) { if (!nativeShadow && !this._scopeCssViaAttr) { selector = (selector ? selector + ' ' : '') + SCOPE_NAME + ' ' + this.is + (element._scopeSelector ? ' ' + XSCOPE_NAME + ' ' + element._scopeSelector : ''); } return selector; }, updateStyles: function (properties) { if (properties) { this.mixin(this.customStyle, properties); } if (nativeVariables) { propertyUtils.updateNativeStyleProperties(this, this.customStyle); } else { if (this.isAttached) { if (this._needsStyleProperties()) { this._updateStyleProperties(); } else { this._styleProperties = null; } } else { this.__stylePropertiesInvalid = true; } if (this._styleCache) { this._styleCache.clear(); } this._updateRootStyles(); } }, _updateRootStyles: function (root) { root = root || this.root; var c$ = Polymer.dom(root)._query(function (e) { return e.shadyRoot || e.shadowRoot; }); for (var i = 0, l = c$.length, c; i < l && (c = c$[i]); i++) { if (c.updateStyles) { c.updateStyles(); } } } }); Polymer.updateStyles = function (properties) { styleDefaults.updateStyles(properties); Polymer.Base._updateRootStyles(document); }; var styleCache = new Polymer.StyleCache(); Polymer.customStyleCache = styleCache; var SCOPE_NAME = styleTransformer.SCOPE_NAME; var XSCOPE_NAME = propertyUtils.XSCOPE_NAME; }());Polymer.Base._addFeature({ _registerFeatures: function () { this._prepIs(); if (this.factoryImpl) { this._prepConstructor(); } this._prepStyles(); }, _finishRegisterFeatures: function () { this._prepTemplate(); this._prepShimStyles(); this._prepAnnotations(); this._prepEffects(); this._prepBehaviors(); this._prepPropertyInfo(); this._prepBindings(); this._prepShady(); }, _prepBehavior: function (b) { this._addPropertyEffects(b.properties); this._addComplexObserverEffects(b.observers); this._addHostAttributes(b.hostAttributes); }, _initFeatures: function () { this._setupGestures(); this._setupConfigure(this.__data__); this._setupStyleProperties(); this._setupDebouncers(); this._setupShady(); this._registerHost(); if (this._template) { this._validateApplyShim(); this._poolContent(); this._beginHosting(); this._stampTemplate(); this._endHosting(); this._marshalAnnotationReferences(); } this._marshalInstanceEffects(); this._marshalBehaviors(); this._marshalHostAttributes(); this._marshalAttributes(); this._tryReady(); }, _marshalBehavior: function (b) { if (b.listeners) { this._listenListeners(b.listeners); } } });(function () { var propertyUtils = Polymer.StyleProperties; var styleUtil = Polymer.StyleUtil; var cssParse = Polymer.CssParse; var styleDefaults = Polymer.StyleDefaults; var styleTransformer = Polymer.StyleTransformer; var applyShim = Polymer.ApplyShim; var debounce = Polymer.Debounce; var settings = Polymer.Settings; var updateDebouncer; Polymer({ is: 'custom-style', extends: 'style', _template: null, properties: { include: String }, ready: function () { this.__appliedElement = this.__appliedElement || this; this.__cssBuild = styleUtil.getCssBuildType(this); if (this.__appliedElement !== this) { this.__appliedElement.__cssBuild = this.__cssBuild; } if (this.ownerDocument !== window.document && this.__appliedElement === this) { document.head.appendChild(this); } this._tryApply(); }, attached: function () { this._tryApply(); }, _tryApply: function () { if (!this._appliesToDocument) { if (this.parentNode && this.parentNode.localName !== 'dom-module') { this._appliesToDocument = true; var e = this.__appliedElement; if (!settings.useNativeCSSProperties) { this.__needsUpdateStyles = styleDefaults.hasStyleProperties(); styleDefaults.addStyle(e); } if (e.textContent || this.include) { this._apply(true); } else { var self = this; var observer = new MutationObserver(function () { observer.disconnect(); self._apply(true); }); observer.observe(e, { childList: true }); } } } }, _updateStyles: function () { Polymer.updateStyles(); }, _apply: function (initialApply) { var e = this.__appliedElement; if (this.include) { e.textContent = styleUtil.cssFromModules(this.include, true) + e.textContent; } if (!e.textContent) { return; } var buildType = this.__cssBuild; var targetedBuild = styleUtil.isTargetedBuild(buildType); if (settings.useNativeCSSProperties && targetedBuild) { return; } var styleRules = styleUtil.rulesForStyle(e); if (!targetedBuild) { styleUtil.forEachRule(styleRules, function (rule) { styleTransformer.documentRule(rule); }); if (settings.useNativeCSSProperties && !buildType) { applyShim.transform([e]); } } if (settings.useNativeCSSProperties) { e.textContent = styleUtil.toCssText(styleRules); } else { var self = this; var fn = function fn() { self._flushCustomProperties(); }; if (initialApply) { Polymer.RenderStatus.whenReady(fn); } else { fn(); } } }, _flushCustomProperties: function () { if (this.__needsUpdateStyles) { this.__needsUpdateStyles = false; updateDebouncer = debounce(updateDebouncer, this._updateStyles); } else { this._applyCustomProperties(); } }, _applyCustomProperties: function () { var element = this.__appliedElement; this._computeStyleProperties(); var props = this._styleProperties; var rules = styleUtil.rulesForStyle(element); if (!rules) { return; } element.textContent = styleUtil.toCssText(rules, function (rule) { var css = rule.cssText = rule.parsedCssText; if (rule.propertyInfo && rule.propertyInfo.cssText) { css = cssParse.removeCustomPropAssignment(css); rule.cssText = propertyUtils.valueForProperties(css, props); } }); } }); }());Polymer.Templatizer = { properties: { __hideTemplateChildren__: { observer: '_showHideChildren' } }, _instanceProps: Polymer.nob, _parentPropPrefix: '_parent_', templatize: function (template) { this._templatized = template; if (!template._content) { template._content = template.content; } if (template._content._ctor) { this.ctor = template._content._ctor; this._prepParentProperties(this.ctor.prototype, template); return; } var archetype = Object.create(Polymer.Base); this._customPrepAnnotations(archetype, template); this._prepParentProperties(archetype, template); archetype._prepEffects(); this._customPrepEffects(archetype); archetype._prepBehaviors(); archetype._prepPropertyInfo(); archetype._prepBindings(); archetype._notifyPathUp = this._notifyPathUpImpl; archetype._scopeElementClass = this._scopeElementClassImpl; archetype.listen = this._listenImpl; archetype._showHideChildren = this._showHideChildrenImpl; archetype.__setPropertyOrig = this.__setProperty; archetype.__setProperty = this.__setPropertyImpl; var _constructor = this._constructorImpl; var ctor = function TemplateInstance(model, host) { _constructor.call(this, model, host); }; ctor.prototype = archetype; archetype.constructor = ctor; template._content._ctor = ctor; this.ctor = ctor; }, _getRootDataHost: function () { return this.dataHost && this.dataHost._rootDataHost || this.dataHost; }, _showHideChildrenImpl: function (hide) { var c = this._children; for (var i = 0; i < c.length; i++) { var n = c[i]; if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) { if (n.nodeType === Node.TEXT_NODE) { if (hide) { n.__polymerTextContent__ = n.textContent; n.textContent = ''; } else { n.textContent = n.__polymerTextContent__; } } else if (n.style) { if (hide) { n.__polymerDisplay__ = n.style.display; n.style.display = 'none'; } else { n.style.display = n.__polymerDisplay__; } } } n.__hideTemplateChildren__ = hide; } }, __setPropertyImpl: function (property, value, fromAbove, node) { if (node && node.__hideTemplateChildren__ && property == 'textContent') { property = '__polymerTextContent__'; } this.__setPropertyOrig(property, value, fromAbove, node); }, _debounceTemplate: function (fn) { Polymer.dom.addDebouncer(this.debounce('_debounceTemplate', fn)); }, _flushTemplates: function () { Polymer.dom.flush(); }, _customPrepEffects: function (archetype) { var parentProps = archetype._parentProps; for (var prop in parentProps) { archetype._addPropertyEffect(prop, 'function', this._createHostPropEffector(prop)); } for (prop in this._instanceProps) { archetype._addPropertyEffect(prop, 'function', this._createInstancePropEffector(prop)); } }, _customPrepAnnotations: function (archetype, template) { archetype._template = template; var c = template._content; if (!c._notes) { var rootDataHost = archetype._rootDataHost; if (rootDataHost) { Polymer.Annotations.prepElement = function () { rootDataHost._prepElement(); }; } c._notes = Polymer.Annotations.parseAnnotations(template); Polymer.Annotations.prepElement = null; this._processAnnotations(c._notes); } archetype._notes = c._notes; archetype._parentProps = c._parentProps; }, _prepParentProperties: function (archetype, template) { var parentProps = this._parentProps = archetype._parentProps; if (this._forwardParentProp && parentProps) { var proto = archetype._parentPropProto; var prop; if (!proto) { for (prop in this._instanceProps) { delete parentProps[prop]; } proto = archetype._parentPropProto = Object.create(null); if (template != this) { Polymer.Bind.prepareModel(proto); Polymer.Base.prepareModelNotifyPath(proto); } for (prop in parentProps) { var parentProp = this._parentPropPrefix + prop; var effects = [ { kind: 'function', effect: this._createForwardPropEffector(prop), fn: Polymer.Bind._functionEffect }, { kind: 'notify', fn: Polymer.Bind._notifyEffect, effect: { event: Polymer.CaseMap.camelToDashCase(parentProp) + '-changed' } } ]; proto._propertyEffects = proto._propertyEffects || {}; proto._propertyEffects[parentProp] = effects; Polymer.Bind._createAccessors(proto, parentProp, effects); } } var self = this; if (template != this) { Polymer.Bind.prepareInstance(template); template._forwardParentProp = function (source, value) { self._forwardParentProp(source, value); }; } this._extendTemplate(template, proto); template._pathEffector = function (path, value, fromAbove) { return self._pathEffectorImpl(path, value, fromAbove); }; } }, _createForwardPropEffector: function (prop) { return function (source, value) { this._forwardParentProp(prop, value); }; }, _createHostPropEffector: function (prop) { var prefix = this._parentPropPrefix; return function (source, value) { this.dataHost._templatized[prefix + prop] = value; }; }, _createInstancePropEffector: function (prop) { return function (source, value, old, fromAbove) { if (!fromAbove) { this.dataHost._forwardInstanceProp(this, prop, value); } }; }, _extendTemplate: function (template, proto) { var n$ = Object.getOwnPropertyNames(proto); if (proto._propertySetter) { template._propertySetter = proto._propertySetter; } for (var i = 0, n; i < n$.length && (n = n$[i]); i++) { var val = template[n]; if (val && n == '_propertyEffects') { var pe = Polymer.Base.mixin({}, val); template._propertyEffects = Polymer.Base.mixin(pe, proto._propertyEffects); } else { var pd = Object.getOwnPropertyDescriptor(proto, n); Object.defineProperty(template, n, pd); if (val !== undefined) { template._propertySetter(n, val); } } } }, _showHideChildren: function (hidden) { }, _forwardInstancePath: function (inst, path, value) { }, _forwardInstanceProp: function (inst, prop, value) { }, _notifyPathUpImpl: function (path, value) { var dataHost = this.dataHost; var root = Polymer.Path.root(path); dataHost._forwardInstancePath.call(dataHost, this, path, value); if (root in dataHost._parentProps) { dataHost._templatized._notifyPath(dataHost._parentPropPrefix + path, value); } }, _pathEffectorImpl: function (path, value, fromAbove) { if (this._forwardParentPath) { if (path.indexOf(this._parentPropPrefix) === 0) { var subPath = path.substring(this._parentPropPrefix.length); var model = Polymer.Path.root(subPath); if (model in this._parentProps) { this._forwardParentPath(subPath, value); } } } Polymer.Base._pathEffector.call(this._templatized, path, value, fromAbove); }, _constructorImpl: function (model, host) { this._rootDataHost = host._getRootDataHost(); this._setupConfigure(model); this._registerHost(host); this._beginHosting(); this.root = this.instanceTemplate(this._template); this.root.__noContent = !this._notes._hasContent; this.root.__styleScoped = true; this._endHosting(); this._marshalAnnotatedNodes(); this._marshalInstanceEffects(); this._marshalAnnotatedListeners(); var children = []; for (var n = this.root.firstChild; n; n = n.nextSibling) { children.push(n); n._templateInstance = this; } this._children = children; if (host.__hideTemplateChildren__) { this._showHideChildren(true); } this._tryReady(); }, _listenImpl: function (node, eventName, methodName) { var model = this; var host = this._rootDataHost; var handler = host._createEventHandler(node, eventName, methodName); var decorated = function (e) { e.model = model; handler(e); }; host._listen(node, eventName, decorated); }, _scopeElementClassImpl: function (node, value) { var host = this._rootDataHost; if (host) { return host._scopeElementClass(node, value); } return value; }, stamp: function (model) { model = model || {}; if (this._parentProps) { var templatized = this._templatized; for (var prop in this._parentProps) { if (model[prop] === undefined) { model[prop] = templatized[this._parentPropPrefix + prop]; } } } return new this.ctor(model, this); }, modelForElement: function (el) { var model; while (el) { if (model = el._templateInstance) { if (model.dataHost != this) { el = model.dataHost; } else { return model; } } else { el = el.parentNode; } } } };Polymer({ is: 'dom-template', extends: 'template', _template: null, behaviors: [Polymer.Templatizer], ready: function () { this.templatize(this); } });Polymer._collections = new WeakMap(); Polymer.Collection = function (userArray) { Polymer._collections.set(userArray, this); this.userArray = userArray; this.store = userArray.slice(); this.initMap(); }; Polymer.Collection.prototype = { constructor: Polymer.Collection, initMap: function () { var omap = this.omap = new WeakMap(); var pmap = this.pmap = {}; var s = this.store; for (var i = 0; i < s.length; i++) { var item = s[i]; if (item && typeof item == 'object') { omap.set(item, i); } else { pmap[item] = i; } } }, add: function (item) { var key = this.store.push(item) - 1; if (item && typeof item == 'object') { this.omap.set(item, key); } else { this.pmap[item] = key; } return '#' + key; }, removeKey: function (key) { if (key = this._parseKey(key)) { this._removeFromMap(this.store[key]); delete this.store[key]; } }, _removeFromMap: function (item) { if (item && typeof item == 'object') { this.omap.delete(item); } else { delete this.pmap[item]; } }, remove: function (item) { var key = this.getKey(item); this.removeKey(key); return key; }, getKey: function (item) { var key; if (item && typeof item == 'object') { key = this.omap.get(item); } else { key = this.pmap[item]; } if (key != undefined) { return '#' + key; } }, getKeys: function () { return Object.keys(this.store).map(function (key) { return '#' + key; }); }, _parseKey: function (key) { if (key && key[0] == '#') { return key.slice(1); } }, setItem: function (key, item) { if (key = this._parseKey(key)) { var old = this.store[key]; if (old) { this._removeFromMap(old); } if (item && typeof item == 'object') { this.omap.set(item, key); } else { this.pmap[item] = key; } this.store[key] = item; } }, getItem: function (key) { if (key = this._parseKey(key)) { return this.store[key]; } }, getItems: function () { var items = [], store = this.store; for (var key in store) { items.push(store[key]); } return items; }, _applySplices: function (splices) { var keyMap = {}, key; for (var i = 0, s; i < splices.length && (s = splices[i]); i++) { s.addedKeys = []; for (var j = 0; j < s.removed.length; j++) { key = this.getKey(s.removed[j]); keyMap[key] = keyMap[key] ? null : -1; } for (j = 0; j < s.addedCount; j++) { var item = this.userArray[s.index + j]; key = this.getKey(item); key = key === undefined ? this.add(item) : key; keyMap[key] = keyMap[key] ? null : 1; s.addedKeys.push(key); } } var removed = []; var added = []; for (key in keyMap) { if (keyMap[key] < 0) { this.removeKey(key); removed.push(key); } if (keyMap[key] > 0) { added.push(key); } } return [{ removed: removed, added: added }]; } }; Polymer.Collection.get = function (userArray) { return Polymer._collections.get(userArray) || new Polymer.Collection(userArray); }; Polymer.Collection.applySplices = function (userArray, splices) { var coll = Polymer._collections.get(userArray); return coll ? coll._applySplices(splices) : null; };Polymer({ is: 'dom-repeat', extends: 'template', _template: null, properties: { items: { type: Array }, as: { type: String, value: 'item' }, indexAs: { type: String, value: 'index' }, sort: { type: Function, observer: '_sortChanged' }, filter: { type: Function, observer: '_filterChanged' }, observe: { type: String, observer: '_observeChanged' }, delay: Number, renderedItemCount: { type: Number, notify: !Polymer.Settings.suppressTemplateNotifications, readOnly: true }, initialCount: { type: Number, observer: '_initializeChunking' }, targetFramerate: { type: Number, value: 20 }, notifyDomChange: { type: Boolean }, _targetFrameTime: { type: Number, computed: '_computeFrameTime(targetFramerate)' } }, behaviors: [Polymer.Templatizer], observers: ['_itemsChanged(items.*)'], created: function () { this._instances = []; this._pool = []; this._limit = Infinity; var self = this; this._boundRenderChunk = function () { self._renderChunk(); }; }, detached: function () { this.__isDetached = true; for (var i = 0; i < this._instances.length; i++) { this._detachInstance(i); } }, attached: function () { if (this.__isDetached) { this.__isDetached = false; var refNode; var parentNode = Polymer.dom(this).parentNode; if (parentNode.localName == this.is) { refNode = parentNode; parentNode = Polymer.dom(parentNode).parentNode; } else { refNode = this; } var parent = Polymer.dom(parentNode); for (var i = 0; i < this._instances.length; i++) { this._attachInstance(i, parent, refNode); } } }, ready: function () { this._instanceProps = { __key__: true }; this._instanceProps[this.as] = true; this._instanceProps[this.indexAs] = true; if (!this.ctor) { this.templatize(this); } }, _sortChanged: function (sort) { var dataHost = this._getRootDataHost(); this._sortFn = sort && (typeof sort == 'function' ? sort : function () { return dataHost[sort].apply(dataHost, arguments); }); this._needFullRefresh = true; if (this.items) { this._debounceTemplate(this._render); } }, _filterChanged: function (filter) { var dataHost = this._getRootDataHost(); this._filterFn = filter && (typeof filter == 'function' ? filter : function () { return dataHost[filter].apply(dataHost, arguments); }); this._needFullRefresh = true; if (this.items) { this._debounceTemplate(this._render); } }, _computeFrameTime: function (rate) { return Math.ceil(1000 / rate); }, _initializeChunking: function () { if (this.initialCount) { this._limit = this.initialCount; this._chunkCount = this.initialCount; this._lastChunkTime = performance.now(); } }, _tryRenderChunk: function () { if (this.items && this._limit < this.items.length) { this.debounce('renderChunk', this._requestRenderChunk); } }, _requestRenderChunk: function () { requestAnimationFrame(this._boundRenderChunk); }, _renderChunk: function () { var currChunkTime = performance.now(); var ratio = this._targetFrameTime / (currChunkTime - this._lastChunkTime); this._chunkCount = Math.round(this._chunkCount * ratio) || 1; this._limit += this._chunkCount; this._lastChunkTime = currChunkTime; this._debounceTemplate(this._render); }, _observeChanged: function () { this._observePaths = this.observe && this.observe.replace('.*', '.').split(' '); }, _itemsChanged: function (change) { if (change.path == 'items') { if (Array.isArray(this.items)) { this.collection = Polymer.Collection.get(this.items); } else if (!this.items) { this.collection = null; } else { this._error(this._logf('dom-repeat', 'expected array for `items`,' + ' found', this.items)); } this._keySplices = []; this._indexSplices = []; this._needFullRefresh = true; this._initializeChunking(); this._debounceTemplate(this._render); } else if (change.path == 'items.splices') { this._keySplices = this._keySplices.concat(change.value.keySplices); this._indexSplices = this._indexSplices.concat(change.value.indexSplices); this._debounceTemplate(this._render); } else { var subpath = change.path.slice(6); this._forwardItemPath(subpath, change.value); this._checkObservedPaths(subpath); } }, _checkObservedPaths: function (path) { if (this._observePaths) { path = path.substring(path.indexOf('.') + 1); var paths = this._observePaths; for (var i = 0; i < paths.length; i++) { if (path.indexOf(paths[i]) === 0) { this._needFullRefresh = true; if (this.delay) { this.debounce('render', this._render, this.delay); } else { this._debounceTemplate(this._render); } return; } } } }, render: function () { this._needFullRefresh = true; this._debounceTemplate(this._render); this._flushTemplates(); }, _render: function () { if (this._needFullRefresh) { this._applyFullRefresh(); this._needFullRefresh = false; } else if (this._keySplices.length) { if (this._sortFn) { this._applySplicesUserSort(this._keySplices); } else { if (this._filterFn) { this._applyFullRefresh(); } else { this._applySplicesArrayOrder(this._indexSplices); } } } else { } this._keySplices = []; this._indexSplices = []; var keyToIdx = this._keyToInstIdx = {}; for (var i = this._instances.length - 1; i >= 0; i--) { var inst = this._instances[i]; if (inst.isPlaceholder && i < this._limit) { inst = this._insertInstance(i, inst.__key__); } else if (!inst.isPlaceholder && i >= this._limit) { inst = this._downgradeInstance(i, inst.__key__); } keyToIdx[inst.__key__] = i; if (!inst.isPlaceholder) { inst.__setProperty(this.indexAs, i, true); } } this._pool.length = 0; this._setRenderedItemCount(this._instances.length); if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); } this._tryRenderChunk(); }, _applyFullRefresh: function () { var c = this.collection; var keys; if (this._sortFn) { keys = c ? c.getKeys() : []; } else { keys = []; var items = this.items; if (items) { for (var i = 0; i < items.length; i++) { keys.push(c.getKey(items[i])); } } } var self = this; if (this._filterFn) { keys = keys.filter(function (a) { return self._filterFn(c.getItem(a)); }); } if (this._sortFn) { keys.sort(function (a, b) { return self._sortFn(c.getItem(a), c.getItem(b)); }); } for (i = 0; i < keys.length; i++) { var key = keys[i]; var inst = this._instances[i]; if (inst) { inst.__key__ = key; if (!inst.isPlaceholder && i < this._limit) { inst.__setProperty(this.as, c.getItem(key), true); } } else if (i < this._limit) { this._insertInstance(i, key); } else { this._insertPlaceholder(i, key); } } for (var j = this._instances.length - 1; j >= i; j--) { this._detachAndRemoveInstance(j); } }, _numericSort: function (a, b) { return a - b; }, _applySplicesUserSort: function (splices) { var c = this.collection; var keyMap = {}; var key; for (var i = 0, s; i < splices.length && (s = splices[i]); i++) { for (var j = 0; j < s.removed.length; j++) { key = s.removed[j]; keyMap[key] = keyMap[key] ? null : -1; } for (j = 0; j < s.added.length; j++) { key = s.added[j]; keyMap[key] = keyMap[key] ? null : 1; } } var removedIdxs = []; var addedKeys = []; for (key in keyMap) { if (keyMap[key] === -1) { removedIdxs.push(this._keyToInstIdx[key]); } if (keyMap[key] === 1) { addedKeys.push(key); } } if (removedIdxs.length) { removedIdxs.sort(this._numericSort); for (i = removedIdxs.length - 1; i >= 0; i--) { var idx = removedIdxs[i]; if (idx !== undefined) { this._detachAndRemoveInstance(idx); } } } var self = this; if (addedKeys.length) { if (this._filterFn) { addedKeys = addedKeys.filter(function (a) { return self._filterFn(c.getItem(a)); }); } addedKeys.sort(function (a, b) { return self._sortFn(c.getItem(a), c.getItem(b)); }); var start = 0; for (i = 0; i < addedKeys.length; i++) { start = this._insertRowUserSort(start, addedKeys[i]); } } }, _insertRowUserSort: function (start, key) { var c = this.collection; var item = c.getItem(key); var end = this._instances.length - 1; var idx = -1; while (start <= end) { var mid = start + end >> 1; var midKey = this._instances[mid].__key__; var cmp = this._sortFn(c.getItem(midKey), item); if (cmp < 0) { start = mid + 1; } else if (cmp > 0) { end = mid - 1; } else { idx = mid; break; } } if (idx < 0) { idx = end + 1; } this._insertPlaceholder(idx, key); return idx; }, _applySplicesArrayOrder: function (splices) { for (var i = 0, s; i < splices.length && (s = splices[i]); i++) { for (var j = 0; j < s.removed.length; j++) { this._detachAndRemoveInstance(s.index); } for (j = 0; j < s.addedKeys.length; j++) { this._insertPlaceholder(s.index + j, s.addedKeys[j]); } } }, _detachInstance: function (idx) { var inst = this._instances[idx]; if (!inst.isPlaceholder) { for (var i = 0; i < inst._children.length; i++) { var el = inst._children[i]; Polymer.dom(inst.root).appendChild(el); } return inst; } }, _attachInstance: function (idx, parent, refNode) { var inst = this._instances[idx]; if (!inst.isPlaceholder) { parent.insertBefore(inst.root, refNode); } }, _detachAndRemoveInstance: function (idx) { var inst = this._detachInstance(idx); if (inst) { this._pool.push(inst); } this._instances.splice(idx, 1); }, _insertPlaceholder: function (idx, key) { this._instances.splice(idx, 0, { isPlaceholder: true, __key__: key }); }, _stampInstance: function (idx, key) { var model = { __key__: key }; model[this.as] = this.collection.getItem(key); model[this.indexAs] = idx; return this.stamp(model); }, _insertInstance: function (idx, key) { var inst = this._pool.pop(); if (inst) { inst.__setProperty(this.as, this.collection.getItem(key), true); inst.__setProperty('__key__', key, true); } else { inst = this._stampInstance(idx, key); } var beforeRow = this._instances[idx + 1]; var beforeNode = beforeRow && !beforeRow.isPlaceholder ? beforeRow._children[0] : this; var parentNode = Polymer.dom(this).parentNode; if (parentNode.localName == this.is) { if (beforeNode == this) { beforeNode = parentNode; } parentNode = Polymer.dom(parentNode).parentNode; } Polymer.dom(parentNode).insertBefore(inst.root, beforeNode); this._instances[idx] = inst; return inst; }, _downgradeInstance: function (idx, key) { var inst = this._detachInstance(idx); if (inst) { this._pool.push(inst); } inst = { isPlaceholder: true, __key__: key }; this._instances[idx] = inst; return inst; }, _showHideChildren: function (hidden) { for (var i = 0; i < this._instances.length; i++) { if (!this._instances[i].isPlaceholder) this._instances[i]._showHideChildren(hidden); } }, _forwardInstanceProp: function (inst, prop, value) { if (prop == this.as) { var idx; if (this._sortFn || this._filterFn) { idx = this.items.indexOf(this.collection.getItem(inst.__key__)); } else { idx = inst[this.indexAs]; } this.set('items.' + idx, value); } }, _forwardInstancePath: function (inst, path, value) { if (path.indexOf(this.as + '.') === 0) { this._notifyPath('items.' + inst.__key__ + '.' + path.slice(this.as.length + 1), value); } }, _forwardParentProp: function (prop, value) { var i$ = this._instances; for (var i = 0, inst; i < i$.length && (inst = i$[i]); i++) { if (!inst.isPlaceholder) { inst.__setProperty(prop, value, true); } } }, _forwardParentPath: function (path, value) { var i$ = this._instances; for (var i = 0, inst; i < i$.length && (inst = i$[i]); i++) { if (!inst.isPlaceholder) { inst._notifyPath(path, value, true); } } }, _forwardItemPath: function (path, value) { if (this._keyToInstIdx) { var dot = path.indexOf('.'); var key = path.substring(0, dot < 0 ? path.length : dot); var idx = this._keyToInstIdx[key]; var inst = this._instances[idx]; if (inst && !inst.isPlaceholder) { if (dot >= 0) { path = this.as + '.' + path.substring(dot + 1); inst._notifyPath(path, value, true); } else { inst.__setProperty(this.as, value, true); } } } }, itemForElement: function (el) { var instance = this.modelForElement(el); return instance && instance[this.as]; }, keyForElement: function (el) { var instance = this.modelForElement(el); return instance && instance.__key__; }, indexForElement: function (el) { var instance = this.modelForElement(el); return instance && instance[this.indexAs]; } });Polymer({ is: 'array-selector', _template: null, properties: { items: { type: Array, observer: 'clearSelection' }, multi: { type: Boolean, value: false, observer: 'clearSelection' }, selected: { type: Object, notify: true }, selectedItem: { type: Object, notify: true }, toggle: { type: Boolean, value: false } }, clearSelection: function () { if (Array.isArray(this.selected)) { for (var i = 0; i < this.selected.length; i++) { this.unlinkPaths('selected.' + i); } } else { this.unlinkPaths('selected'); this.unlinkPaths('selectedItem'); } if (this.multi) { if (!this.selected || this.selected.length) { this.selected = []; this._selectedColl = Polymer.Collection.get(this.selected); } } else { this.selected = null; this._selectedColl = null; } this.selectedItem = null; }, isSelected: function (item) { if (this.multi) { return this._selectedColl.getKey(item) !== undefined; } else { return this.selected == item; } }, deselect: function (item) { if (this.multi) { if (this.isSelected(item)) { var skey = this._selectedColl.getKey(item); this.arrayDelete('selected', item); this.unlinkPaths('selected.' + skey); } } else { this.selected = null; this.selectedItem = null; this.unlinkPaths('selected'); this.unlinkPaths('selectedItem'); } }, select: function (item) { var icol = Polymer.Collection.get(this.items); var key = icol.getKey(item); if (this.multi) { if (this.isSelected(item)) { if (this.toggle) { this.deselect(item); } } else { this.push('selected', item); var skey = this._selectedColl.getKey(item); this.linkPaths('selected.' + skey, 'items.' + key); } } else { if (this.toggle && item == this.selected) { this.deselect(); } else { this.selected = item; this.selectedItem = item; this.linkPaths('selected', 'items.' + key); this.linkPaths('selectedItem', 'items.' + key); } } } });Polymer({ is: 'dom-if', extends: 'template', _template: null, properties: { 'if': { type: Boolean, value: false, observer: '_queueRender' }, restamp: { type: Boolean, value: false, observer: '_queueRender' }, notifyDomChange: { type: Boolean } }, behaviors: [Polymer.Templatizer], _queueRender: function () { this._debounceTemplate(this._render); }, detached: function () { var parentNode = this.parentNode; if (parentNode && parentNode.localName == this.is) { parentNode = Polymer.dom(parentNode).parentNode; } if (!parentNode || parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE && (!Polymer.Settings.hasShadow || !(parentNode instanceof ShadowRoot))) { this._teardownInstance(); } }, attached: function () { if (this.if && this.ctor) { this.async(this._ensureInstance); } }, render: function () { this._flushTemplates(); }, _render: function () { if (this.if) { if (!this.ctor) { this.templatize(this); } this._ensureInstance(); this._showHideChildren(); } else if (this.restamp) { this._teardownInstance(); } if (!this.restamp && this._instance) { this._showHideChildren(); } if (this.if != this._lastIf) { if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); } this._lastIf = this.if; } }, _ensureInstance: function () { var refNode; var parentNode = Polymer.dom(this).parentNode; if (parentNode && parentNode.localName == this.is) { refNode = parentNode; parentNode = Polymer.dom(parentNode).parentNode; } else { refNode = this; } if (parentNode) { if (!this._instance) { this._instance = this.stamp(); var root = this._instance.root; Polymer.dom(parentNode).insertBefore(root, refNode); } else { var c$ = this._instance._children; if (c$ && c$.length) { var lastChild = Polymer.dom(refNode).previousSibling; if (lastChild !== c$[c$.length - 1]) { for (var i = 0, n; i < c$.length && (n = c$[i]); i++) { Polymer.dom(parentNode).insertBefore(n, refNode); } } } } } }, _teardownInstance: function () { if (this._instance) { var c$ = this._instance._children; if (c$ && c$.length) { var parent = Polymer.dom(Polymer.dom(c$[0]).parentNode); for (var i = 0, n; i < c$.length && (n = c$[i]); i++) { parent.removeChild(n); } } this._instance = null; } }, _showHideChildren: function () { var hidden = this.__hideTemplateChildren__ || !this.if; if (this._instance) { this._instance._showHideChildren(hidden); } }, _forwardParentProp: function (prop, value) { if (this._instance) { this._instance.__setProperty(prop, value, true); } }, _forwardParentPath: function (path, value) { if (this._instance) { this._instance._notifyPath(path, value, true); } } });Polymer({ is: 'dom-bind', properties: { notifyDomChange: { type: Boolean } }, extends: 'template', _template: null, created: function () { var self = this; Polymer.RenderStatus.whenReady(function () { if (document.readyState == 'loading') { document.addEventListener('DOMContentLoaded', function () { self._markImportsReady(); }); } else { self._markImportsReady(); } }); }, _ensureReady: function () { if (!this._readied) { this._readySelf(); } }, _markImportsReady: function () { this._importsReady = true; this._ensureReady(); }, _registerFeatures: function () { this._prepConstructor(); }, _insertChildren: function () { var refNode; var parentNode = Polymer.dom(this).parentNode; if (parentNode.localName == this.is) { refNode = parentNode; parentNode = Polymer.dom(parentNode).parentNode; } else { refNode = this; } Polymer.dom(parentNode).insertBefore(this.root, refNode); }, _removeChildren: function () { if (this._children) { for (var i = 0; i < this._children.length; i++) { this.root.appendChild(this._children[i]); } } }, _initFeatures: function () { }, _scopeElementClass: function (element, selector) { if (this.dataHost) { return this.dataHost._scopeElementClass(element, selector); } else { return selector; } }, _configureInstanceProperties: function () { }, _prepConfigure: function () { var config = {}; for (var prop in this._propertyEffects) { config[prop] = this[prop]; } var setupConfigure = this._setupConfigure; this._setupConfigure = function () { setupConfigure.call(this, config); }; }, attached: function () { if (this._importsReady) { this.render(); } }, detached: function () { this._removeChildren(); }, render: function () { this._ensureReady(); if (!this._children) { this._template = this; this._prepAnnotations(); this._prepEffects(); this._prepBehaviors(); this._prepConfigure(); this._prepBindings(); this._prepPropertyInfo(); Polymer.Base._initFeatures.call(this); this._children = Polymer.TreeApi.arrayCopyChildNodes(this.root); } this._insertChildren(); if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) { this.fire('dom-change'); } } });</script>