library html;

import 'dart:collection';
import 'dart:html_common';
import 'dart:indexed_db';
import 'dart:isolate';
import 'dart:json';
import 'dart:nativewrappers';
import 'dart:svg' as svg;
import 'dart:web_audio' as web_audio;
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// DO NOT EDIT
// Auto-generated dart:html library.


// Not actually used, but imported since dart:html can generate these objects.





LocalWindow _window;

LocalWindow get window {
  if (_window != null) {
    return _window;
  }
  _window = _Utils.window();
  return _window;
}

HtmlDocument _document;

HtmlDocument get document {
  if (_document != null) {
    return _document;
  }
  _document = window.document;
  return _document;
}


Element query(String selector) => document.query(selector);
List<Element> queryAll(String selector) => document.queryAll(selector);

int _getNewIsolateId() => _Utils._getNewIsolateId();

bool _callPortInitialized = false;
var _callPortLastResult = null;

_callPortSync(num id, var message) {
  if (!_callPortInitialized) {
    window.on['js-result'].add((event) {
      _callPortLastResult = JSON.parse(_getPortSyncEventData(event));
    }, false);
    _callPortInitialized = true;
  }
  assert(_callPortLastResult == null);
  _dispatchEvent('js-sync-message', {'id': id, 'message': message});
  var result = _callPortLastResult;
  _callPortLastResult = null;
  return result;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName AbstractWorker
class AbstractWorker extends EventTarget {
  AbstractWorker.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  AbstractWorkerEvents get on =>
    new AbstractWorkerEvents(this);


  /** @domName AbstractWorker.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_addEventListener_Callback";


  /** @domName AbstractWorker.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "AbstractWorker_dispatchEvent_Callback";


  /** @domName AbstractWorker.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "AbstractWorker_removeEventListener_Callback";

}

/// @docsEditable true
class AbstractWorkerEvents extends Events {
  /// @docsEditable true
  AbstractWorkerEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get error => this['error'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLAnchorElement
class AnchorElement extends _Element_Merged {

  ///@docsEditable true
  factory AnchorElement({String href}) {
    var e = document.$dom_createElement("a");
    if (href != null) e.href = href;
    return e;
  }
  AnchorElement.internal(): super.internal();


  /** @domName HTMLAnchorElement.charset */
  String get charset native "HTMLAnchorElement_charset_Getter";


  /** @domName HTMLAnchorElement.charset */
  void set charset(String value) native "HTMLAnchorElement_charset_Setter";


  /** @domName HTMLAnchorElement.coords */
  String get coords native "HTMLAnchorElement_coords_Getter";


  /** @domName HTMLAnchorElement.coords */
  void set coords(String value) native "HTMLAnchorElement_coords_Setter";


  /** @domName HTMLAnchorElement.download */
  String get download native "HTMLAnchorElement_download_Getter";


  /** @domName HTMLAnchorElement.download */
  void set download(String value) native "HTMLAnchorElement_download_Setter";


  /** @domName HTMLAnchorElement.hash */
  String get hash native "HTMLAnchorElement_hash_Getter";


  /** @domName HTMLAnchorElement.hash */
  void set hash(String value) native "HTMLAnchorElement_hash_Setter";


  /** @domName HTMLAnchorElement.host */
  String get host native "HTMLAnchorElement_host_Getter";


  /** @domName HTMLAnchorElement.host */
  void set host(String value) native "HTMLAnchorElement_host_Setter";


  /** @domName HTMLAnchorElement.hostname */
  String get hostname native "HTMLAnchorElement_hostname_Getter";


  /** @domName HTMLAnchorElement.hostname */
  void set hostname(String value) native "HTMLAnchorElement_hostname_Setter";


  /** @domName HTMLAnchorElement.href */
  String get href native "HTMLAnchorElement_href_Getter";


  /** @domName HTMLAnchorElement.href */
  void set href(String value) native "HTMLAnchorElement_href_Setter";


  /** @domName HTMLAnchorElement.hreflang */
  String get hreflang native "HTMLAnchorElement_hreflang_Getter";


  /** @domName HTMLAnchorElement.hreflang */
  void set hreflang(String value) native "HTMLAnchorElement_hreflang_Setter";


  /** @domName HTMLAnchorElement.name */
  String get name native "HTMLAnchorElement_name_Getter";


  /** @domName HTMLAnchorElement.name */
  void set name(String value) native "HTMLAnchorElement_name_Setter";


  /** @domName HTMLAnchorElement.origin */
  String get origin native "HTMLAnchorElement_origin_Getter";


  /** @domName HTMLAnchorElement.pathname */
  String get pathname native "HTMLAnchorElement_pathname_Getter";


  /** @domName HTMLAnchorElement.pathname */
  void set pathname(String value) native "HTMLAnchorElement_pathname_Setter";


  /** @domName HTMLAnchorElement.ping */
  String get ping native "HTMLAnchorElement_ping_Getter";


  /** @domName HTMLAnchorElement.ping */
  void set ping(String value) native "HTMLAnchorElement_ping_Setter";


  /** @domName HTMLAnchorElement.port */
  String get port native "HTMLAnchorElement_port_Getter";


  /** @domName HTMLAnchorElement.port */
  void set port(String value) native "HTMLAnchorElement_port_Setter";


  /** @domName HTMLAnchorElement.protocol */
  String get protocol native "HTMLAnchorElement_protocol_Getter";


  /** @domName HTMLAnchorElement.protocol */
  void set protocol(String value) native "HTMLAnchorElement_protocol_Setter";


  /** @domName HTMLAnchorElement.rel */
  String get rel native "HTMLAnchorElement_rel_Getter";


  /** @domName HTMLAnchorElement.rel */
  void set rel(String value) native "HTMLAnchorElement_rel_Setter";


  /** @domName HTMLAnchorElement.rev */
  String get rev native "HTMLAnchorElement_rev_Getter";


  /** @domName HTMLAnchorElement.rev */
  void set rev(String value) native "HTMLAnchorElement_rev_Setter";


  /** @domName HTMLAnchorElement.search */
  String get search native "HTMLAnchorElement_search_Getter";


  /** @domName HTMLAnchorElement.search */
  void set search(String value) native "HTMLAnchorElement_search_Setter";


  /** @domName HTMLAnchorElement.shape */
  String get shape native "HTMLAnchorElement_shape_Getter";


  /** @domName HTMLAnchorElement.shape */
  void set shape(String value) native "HTMLAnchorElement_shape_Setter";


  /** @domName HTMLAnchorElement.target */
  String get target native "HTMLAnchorElement_target_Getter";


  /** @domName HTMLAnchorElement.target */
  void set target(String value) native "HTMLAnchorElement_target_Setter";


  /** @domName HTMLAnchorElement.type */
  String get type native "HTMLAnchorElement_type_Getter";


  /** @domName HTMLAnchorElement.type */
  void set type(String value) native "HTMLAnchorElement_type_Setter";


  /** @domName HTMLAnchorElement.toString */
  String toString() native "HTMLAnchorElement_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitAnimation
class Animation extends NativeFieldWrapperClass1 {
  Animation.internal();

  static const int DIRECTION_ALTERNATE = 1;

  static const int DIRECTION_NORMAL = 0;

  static const int FILL_BACKWARDS = 1;

  static const int FILL_BOTH = 3;

  static const int FILL_FORWARDS = 2;

  static const int FILL_NONE = 0;


  /** @domName WebKitAnimation.delay */
  num get delay native "WebKitAnimation_delay_Getter";


  /** @domName WebKitAnimation.direction */
  int get direction native "WebKitAnimation_direction_Getter";


  /** @domName WebKitAnimation.duration */
  num get duration native "WebKitAnimation_duration_Getter";


  /** @domName WebKitAnimation.elapsedTime */
  num get elapsedTime native "WebKitAnimation_elapsedTime_Getter";


  /** @domName WebKitAnimation.elapsedTime */
  void set elapsedTime(num value) native "WebKitAnimation_elapsedTime_Setter";


  /** @domName WebKitAnimation.ended */
  bool get ended native "WebKitAnimation_ended_Getter";


  /** @domName WebKitAnimation.fillMode */
  int get fillMode native "WebKitAnimation_fillMode_Getter";


  /** @domName WebKitAnimation.iterationCount */
  int get iterationCount native "WebKitAnimation_iterationCount_Getter";


  /** @domName WebKitAnimation.name */
  String get name native "WebKitAnimation_name_Getter";


  /** @domName WebKitAnimation.paused */
  bool get paused native "WebKitAnimation_paused_Getter";


  /** @domName WebKitAnimation.pause */
  void pause() native "WebKitAnimation_pause_Callback";


  /** @domName WebKitAnimation.play */
  void play() native "WebKitAnimation_play_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitAnimationEvent
class AnimationEvent extends Event {
  AnimationEvent.internal(): super.internal();


  /** @domName WebKitAnimationEvent.animationName */
  String get animationName native "WebKitAnimationEvent_animationName_Getter";


  /** @domName WebKitAnimationEvent.elapsedTime */
  num get elapsedTime native "WebKitAnimationEvent_elapsedTime_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLAppletElement
class AppletElement extends _Element_Merged {
  AppletElement.internal(): super.internal();


  /** @domName HTMLAppletElement.align */
  String get align native "HTMLAppletElement_align_Getter";


  /** @domName HTMLAppletElement.align */
  void set align(String value) native "HTMLAppletElement_align_Setter";


  /** @domName HTMLAppletElement.alt */
  String get alt native "HTMLAppletElement_alt_Getter";


  /** @domName HTMLAppletElement.alt */
  void set alt(String value) native "HTMLAppletElement_alt_Setter";


  /** @domName HTMLAppletElement.archive */
  String get archive native "HTMLAppletElement_archive_Getter";


  /** @domName HTMLAppletElement.archive */
  void set archive(String value) native "HTMLAppletElement_archive_Setter";


  /** @domName HTMLAppletElement.code */
  String get code native "HTMLAppletElement_code_Getter";


  /** @domName HTMLAppletElement.code */
  void set code(String value) native "HTMLAppletElement_code_Setter";


  /** @domName HTMLAppletElement.codeBase */
  String get codeBase native "HTMLAppletElement_codeBase_Getter";


  /** @domName HTMLAppletElement.codeBase */
  void set codeBase(String value) native "HTMLAppletElement_codeBase_Setter";


  /** @domName HTMLAppletElement.height */
  String get height native "HTMLAppletElement_height_Getter";


  /** @domName HTMLAppletElement.height */
  void set height(String value) native "HTMLAppletElement_height_Setter";


  /** @domName HTMLAppletElement.hspace */
  String get hspace native "HTMLAppletElement_hspace_Getter";


  /** @domName HTMLAppletElement.hspace */
  void set hspace(String value) native "HTMLAppletElement_hspace_Setter";


  /** @domName HTMLAppletElement.name */
  String get name native "HTMLAppletElement_name_Getter";


  /** @domName HTMLAppletElement.name */
  void set name(String value) native "HTMLAppletElement_name_Setter";


  /** @domName HTMLAppletElement.object */
  String get object native "HTMLAppletElement_object_Getter";


  /** @domName HTMLAppletElement.object */
  void set object(String value) native "HTMLAppletElement_object_Setter";


  /** @domName HTMLAppletElement.vspace */
  String get vspace native "HTMLAppletElement_vspace_Getter";


  /** @domName HTMLAppletElement.vspace */
  void set vspace(String value) native "HTMLAppletElement_vspace_Setter";


  /** @domName HTMLAppletElement.width */
  String get width native "HTMLAppletElement_width_Getter";


  /** @domName HTMLAppletElement.width */
  void set width(String value) native "HTMLAppletElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMApplicationCache
class ApplicationCache extends EventTarget {
  ApplicationCache.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  ApplicationCacheEvents get on =>
    new ApplicationCacheEvents(this);

  static const int CHECKING = 2;

  static const int DOWNLOADING = 3;

  static const int IDLE = 1;

  static const int OBSOLETE = 5;

  static const int UNCACHED = 0;

  static const int UPDATEREADY = 4;


  /** @domName DOMApplicationCache.status */
  int get status native "DOMApplicationCache_status_Getter";


  /** @domName DOMApplicationCache.abort */
  void abort() native "DOMApplicationCache_abort_Callback";


  /** @domName DOMApplicationCache.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_addEventListener_Callback";


  /** @domName DOMApplicationCache.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "DOMApplicationCache_dispatchEvent_Callback";


  /** @domName DOMApplicationCache.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMApplicationCache_removeEventListener_Callback";


  /** @domName DOMApplicationCache.swapCache */
  void swapCache() native "DOMApplicationCache_swapCache_Callback";


  /** @domName DOMApplicationCache.update */
  void update() native "DOMApplicationCache_update_Callback";

}

/// @docsEditable true
class ApplicationCacheEvents extends Events {
  /// @docsEditable true
  ApplicationCacheEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get cached => this['cached'];

  /// @docsEditable true
  EventListenerList get checking => this['checking'];

  /// @docsEditable true
  EventListenerList get downloading => this['downloading'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get noUpdate => this['noupdate'];

  /// @docsEditable true
  EventListenerList get obsolete => this['obsolete'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];

  /// @docsEditable true
  EventListenerList get updateReady => this['updateready'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLAreaElement
class AreaElement extends _Element_Merged {

  ///@docsEditable true
  factory AreaElement() => document.$dom_createElement("area");
  AreaElement.internal(): super.internal();


  /** @domName HTMLAreaElement.alt */
  String get alt native "HTMLAreaElement_alt_Getter";


  /** @domName HTMLAreaElement.alt */
  void set alt(String value) native "HTMLAreaElement_alt_Setter";


  /** @domName HTMLAreaElement.coords */
  String get coords native "HTMLAreaElement_coords_Getter";


  /** @domName HTMLAreaElement.coords */
  void set coords(String value) native "HTMLAreaElement_coords_Setter";


  /** @domName HTMLAreaElement.hash */
  String get hash native "HTMLAreaElement_hash_Getter";


  /** @domName HTMLAreaElement.host */
  String get host native "HTMLAreaElement_host_Getter";


  /** @domName HTMLAreaElement.hostname */
  String get hostname native "HTMLAreaElement_hostname_Getter";


  /** @domName HTMLAreaElement.href */
  String get href native "HTMLAreaElement_href_Getter";


  /** @domName HTMLAreaElement.href */
  void set href(String value) native "HTMLAreaElement_href_Setter";


  /** @domName HTMLAreaElement.noHref */
  bool get noHref native "HTMLAreaElement_noHref_Getter";


  /** @domName HTMLAreaElement.noHref */
  void set noHref(bool value) native "HTMLAreaElement_noHref_Setter";


  /** @domName HTMLAreaElement.pathname */
  String get pathname native "HTMLAreaElement_pathname_Getter";


  /** @domName HTMLAreaElement.ping */
  String get ping native "HTMLAreaElement_ping_Getter";


  /** @domName HTMLAreaElement.ping */
  void set ping(String value) native "HTMLAreaElement_ping_Setter";


  /** @domName HTMLAreaElement.port */
  String get port native "HTMLAreaElement_port_Getter";


  /** @domName HTMLAreaElement.protocol */
  String get protocol native "HTMLAreaElement_protocol_Getter";


  /** @domName HTMLAreaElement.search */
  String get search native "HTMLAreaElement_search_Getter";


  /** @domName HTMLAreaElement.shape */
  String get shape native "HTMLAreaElement_shape_Getter";


  /** @domName HTMLAreaElement.shape */
  void set shape(String value) native "HTMLAreaElement_shape_Setter";


  /** @domName HTMLAreaElement.target */
  String get target native "HTMLAreaElement_target_Getter";


  /** @domName HTMLAreaElement.target */
  void set target(String value) native "HTMLAreaElement_target_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ArrayBuffer
class ArrayBuffer extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory ArrayBuffer(int length) => _ArrayBufferFactoryProvider.createArrayBuffer(length);
  ArrayBuffer.internal();


  /** @domName ArrayBuffer.byteLength */
  int get byteLength native "ArrayBuffer_byteLength_Getter";

  ArrayBuffer slice(/*long*/ begin, [/*long*/ end]) {
    if (?end) {
      return _slice_1(begin, end);
    }
    return _slice_2(begin);
  }


  /** @domName ArrayBuffer.slice_1 */
  ArrayBuffer _slice_1(begin, end) native "ArrayBuffer_slice_1_Callback";


  /** @domName ArrayBuffer.slice_2 */
  ArrayBuffer _slice_2(begin) native "ArrayBuffer_slice_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ArrayBufferView
class ArrayBufferView extends NativeFieldWrapperClass1 {
  ArrayBufferView.internal();


  /** @domName ArrayBufferView.buffer */
  ArrayBuffer get buffer native "ArrayBufferView_buffer_Getter";


  /** @domName ArrayBufferView.byteLength */
  int get byteLength native "ArrayBufferView_byteLength_Getter";


  /** @domName ArrayBufferView.byteOffset */
  int get byteOffset native "ArrayBufferView_byteOffset_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Attr
class Attr extends Node {
  Attr.internal(): super.internal();


  /** @domName Attr.isId */
  bool get isId native "Attr_isId_Getter";


  /** @domName Attr.name */
  String get name native "Attr_name_Getter";


  /** @domName Attr.ownerElement */
  Element get ownerElement native "Attr_ownerElement_Getter";


  /** @domName Attr.specified */
  bool get specified native "Attr_specified_Getter";


  /** @domName Attr.value */
  String get value native "Attr_value_Getter";


  /** @domName Attr.value */
  void set value(String value) native "Attr_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLAudioElement
class AudioElement extends MediaElement {

  ///@docsEditable true
  factory AudioElement([String src]) {
    if (!?src) {
      return _AudioElementFactoryProvider.createAudioElement();
    }
    return _AudioElementFactoryProvider.createAudioElement(src);
  }
  AudioElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLBRElement
class BRElement extends _Element_Merged {

  ///@docsEditable true
  factory BRElement() => document.$dom_createElement("br");
  BRElement.internal(): super.internal();


  /** @domName HTMLBRElement.clear */
  String get clear native "HTMLBRElement_clear_Getter";


  /** @domName HTMLBRElement.clear */
  void set clear(String value) native "HTMLBRElement_clear_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName BarInfo
class BarInfo extends NativeFieldWrapperClass1 {
  BarInfo.internal();


  /** @domName BarInfo.visible */
  bool get visible native "BarInfo_visible_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLBaseElement
class BaseElement extends _Element_Merged {

  ///@docsEditable true
  factory BaseElement() => document.$dom_createElement("base");
  BaseElement.internal(): super.internal();


  /** @domName HTMLBaseElement.href */
  String get href native "HTMLBaseElement_href_Getter";


  /** @domName HTMLBaseElement.href */
  void set href(String value) native "HTMLBaseElement_href_Setter";


  /** @domName HTMLBaseElement.target */
  String get target native "HTMLBaseElement_target_Getter";


  /** @domName HTMLBaseElement.target */
  void set target(String value) native "HTMLBaseElement_target_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLBaseFontElement
class BaseFontElement extends _Element_Merged {
  BaseFontElement.internal(): super.internal();


  /** @domName HTMLBaseFontElement.color */
  String get color native "HTMLBaseFontElement_color_Getter";


  /** @domName HTMLBaseFontElement.color */
  void set color(String value) native "HTMLBaseFontElement_color_Setter";


  /** @domName HTMLBaseFontElement.face */
  String get face native "HTMLBaseFontElement_face_Getter";


  /** @domName HTMLBaseFontElement.face */
  void set face(String value) native "HTMLBaseFontElement_face_Setter";


  /** @domName HTMLBaseFontElement.size */
  int get size native "HTMLBaseFontElement_size_Getter";


  /** @domName HTMLBaseFontElement.size */
  void set size(int value) native "HTMLBaseFontElement_size_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName BatteryManager
class BatteryManager extends EventTarget {
  BatteryManager.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  BatteryManagerEvents get on =>
    new BatteryManagerEvents(this);


  /** @domName BatteryManager.charging */
  bool get charging native "BatteryManager_charging_Getter";


  /** @domName BatteryManager.chargingTime */
  num get chargingTime native "BatteryManager_chargingTime_Getter";


  /** @domName BatteryManager.dischargingTime */
  num get dischargingTime native "BatteryManager_dischargingTime_Getter";


  /** @domName BatteryManager.level */
  num get level native "BatteryManager_level_Getter";


  /** @domName BatteryManager.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_addEventListener_Callback";


  /** @domName BatteryManager.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "BatteryManager_dispatchEvent_Callback";


  /** @domName BatteryManager.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "BatteryManager_removeEventListener_Callback";

}

/// @docsEditable true
class BatteryManagerEvents extends Events {
  /// @docsEditable true
  BatteryManagerEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get chargingChange => this['chargingchange'];

  /// @docsEditable true
  EventListenerList get chargingTimeChange => this['chargingtimechange'];

  /// @docsEditable true
  EventListenerList get dischargingTimeChange => this['dischargingtimechange'];

  /// @docsEditable true
  EventListenerList get levelChange => this['levelchange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName BeforeLoadEvent
class BeforeLoadEvent extends Event {
  BeforeLoadEvent.internal(): super.internal();


  /** @domName BeforeLoadEvent.url */
  String get url native "BeforeLoadEvent_url_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Blob
class Blob extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory Blob(List blobParts, [String type, String endings]) {
    if (!?type) {
      return _BlobFactoryProvider.createBlob(blobParts);
    }
    if (!?endings) {
      return _BlobFactoryProvider.createBlob(blobParts, type);
    }
    return _BlobFactoryProvider.createBlob(blobParts, type, endings);
  }
  Blob.internal();


  /** @domName Blob.size */
  int get size native "Blob_size_Getter";


  /** @domName Blob.type */
  String get type native "Blob_type_Getter";

  Blob slice([/*long long*/ start, /*long long*/ end, /*DOMString*/ contentType]) {
    if (?contentType) {
      return _slice_1(start, end, contentType);
    }
    if (?end) {
      return _slice_2(start, end);
    }
    if (?start) {
      return _slice_3(start);
    }
    return _slice_4();
  }


  /** @domName Blob.slice_1 */
  Blob _slice_1(start, end, contentType) native "Blob_slice_1_Callback";


  /** @domName Blob.slice_2 */
  Blob _slice_2(start, end) native "Blob_slice_2_Callback";


  /** @domName Blob.slice_3 */
  Blob _slice_3(start) native "Blob_slice_3_Callback";


  /** @domName Blob.slice_4 */
  Blob _slice_4() native "Blob_slice_4_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLBodyElement
class BodyElement extends _Element_Merged {

  ///@docsEditable true
  factory BodyElement() => document.$dom_createElement("body");
  BodyElement.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  BodyElementEvents get on =>
    new BodyElementEvents(this);


  /** @domName HTMLBodyElement.aLink */
  String get aLink native "HTMLBodyElement_aLink_Getter";


  /** @domName HTMLBodyElement.aLink */
  void set aLink(String value) native "HTMLBodyElement_aLink_Setter";


  /** @domName HTMLBodyElement.background */
  String get background native "HTMLBodyElement_background_Getter";


  /** @domName HTMLBodyElement.background */
  void set background(String value) native "HTMLBodyElement_background_Setter";


  /** @domName HTMLBodyElement.bgColor */
  String get bgColor native "HTMLBodyElement_bgColor_Getter";


  /** @domName HTMLBodyElement.bgColor */
  void set bgColor(String value) native "HTMLBodyElement_bgColor_Setter";


  /** @domName HTMLBodyElement.link */
  String get link native "HTMLBodyElement_link_Getter";


  /** @domName HTMLBodyElement.link */
  void set link(String value) native "HTMLBodyElement_link_Setter";


  /** @domName HTMLBodyElement.vLink */
  String get vLink native "HTMLBodyElement_vLink_Getter";


  /** @domName HTMLBodyElement.vLink */
  void set vLink(String value) native "HTMLBodyElement_vLink_Setter";

}

/// @docsEditable true
class BodyElementEvents extends ElementEvents {
  /// @docsEditable true
  BodyElementEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get beforeUnload => this['beforeunload'];

  /// @docsEditable true
  EventListenerList get blur => this['blur'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get focus => this['focus'];

  /// @docsEditable true
  EventListenerList get hashChange => this['hashchange'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get offline => this['offline'];

  /// @docsEditable true
  EventListenerList get online => this['online'];

  /// @docsEditable true
  EventListenerList get popState => this['popstate'];

  /// @docsEditable true
  EventListenerList get resize => this['resize'];

  /// @docsEditable true
  EventListenerList get storage => this['storage'];

  /// @docsEditable true
  EventListenerList get unload => this['unload'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLButtonElement
class ButtonElement extends _Element_Merged {

  ///@docsEditable true
  factory ButtonElement() => document.$dom_createElement("button");
  ButtonElement.internal(): super.internal();


  /** @domName HTMLButtonElement.autofocus */
  bool get autofocus native "HTMLButtonElement_autofocus_Getter";


  /** @domName HTMLButtonElement.autofocus */
  void set autofocus(bool value) native "HTMLButtonElement_autofocus_Setter";


  /** @domName HTMLButtonElement.disabled */
  bool get disabled native "HTMLButtonElement_disabled_Getter";


  /** @domName HTMLButtonElement.disabled */
  void set disabled(bool value) native "HTMLButtonElement_disabled_Setter";


  /** @domName HTMLButtonElement.form */
  FormElement get form native "HTMLButtonElement_form_Getter";


  /** @domName HTMLButtonElement.formAction */
  String get formAction native "HTMLButtonElement_formAction_Getter";


  /** @domName HTMLButtonElement.formAction */
  void set formAction(String value) native "HTMLButtonElement_formAction_Setter";


  /** @domName HTMLButtonElement.formEnctype */
  String get formEnctype native "HTMLButtonElement_formEnctype_Getter";


  /** @domName HTMLButtonElement.formEnctype */
  void set formEnctype(String value) native "HTMLButtonElement_formEnctype_Setter";


  /** @domName HTMLButtonElement.formMethod */
  String get formMethod native "HTMLButtonElement_formMethod_Getter";


  /** @domName HTMLButtonElement.formMethod */
  void set formMethod(String value) native "HTMLButtonElement_formMethod_Setter";


  /** @domName HTMLButtonElement.formNoValidate */
  bool get formNoValidate native "HTMLButtonElement_formNoValidate_Getter";


  /** @domName HTMLButtonElement.formNoValidate */
  void set formNoValidate(bool value) native "HTMLButtonElement_formNoValidate_Setter";


  /** @domName HTMLButtonElement.formTarget */
  String get formTarget native "HTMLButtonElement_formTarget_Getter";


  /** @domName HTMLButtonElement.formTarget */
  void set formTarget(String value) native "HTMLButtonElement_formTarget_Setter";


  /** @domName HTMLButtonElement.labels */
  List<Node> get labels native "HTMLButtonElement_labels_Getter";


  /** @domName HTMLButtonElement.name */
  String get name native "HTMLButtonElement_name_Getter";


  /** @domName HTMLButtonElement.name */
  void set name(String value) native "HTMLButtonElement_name_Setter";


  /** @domName HTMLButtonElement.type */
  String get type native "HTMLButtonElement_type_Getter";


  /** @domName HTMLButtonElement.type */
  void set type(String value) native "HTMLButtonElement_type_Setter";


  /** @domName HTMLButtonElement.validationMessage */
  String get validationMessage native "HTMLButtonElement_validationMessage_Getter";


  /** @domName HTMLButtonElement.validity */
  ValidityState get validity native "HTMLButtonElement_validity_Getter";


  /** @domName HTMLButtonElement.value */
  String get value native "HTMLButtonElement_value_Getter";


  /** @domName HTMLButtonElement.value */
  void set value(String value) native "HTMLButtonElement_value_Setter";


  /** @domName HTMLButtonElement.willValidate */
  bool get willValidate native "HTMLButtonElement_willValidate_Getter";


  /** @domName HTMLButtonElement.checkValidity */
  bool checkValidity() native "HTMLButtonElement_checkValidity_Callback";


  /** @domName HTMLButtonElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLButtonElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CDATASection
class CDataSection extends Text {
  CDataSection.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName HTMLCanvasElement
class CanvasElement extends _Element_Merged {

  ///@docsEditable true
  factory CanvasElement({int width, int height}) {
    var e = document.$dom_createElement("canvas");
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }
  CanvasElement.internal(): super.internal();


  /** @domName HTMLCanvasElement.height */
  int get height native "HTMLCanvasElement_height_Getter";


  /** @domName HTMLCanvasElement.height */
  void set height(int value) native "HTMLCanvasElement_height_Setter";


  /** @domName HTMLCanvasElement.width */
  int get width native "HTMLCanvasElement_width_Getter";


  /** @domName HTMLCanvasElement.width */
  void set width(int value) native "HTMLCanvasElement_width_Setter";


  /** @domName HTMLCanvasElement.getContext */
  Object getContext(String contextId) native "HTMLCanvasElement_getContext_Callback";


  /** @domName HTMLCanvasElement.toDataURL */
  String toDataUrl(String type, [num quality]) native "HTMLCanvasElement_toDataURL_Callback";


  CanvasRenderingContext2D get context2d => getContext('2d');
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CanvasGradient
class CanvasGradient extends NativeFieldWrapperClass1 {
  CanvasGradient.internal();


  /** @domName CanvasGradient.addColorStop */
  void addColorStop(num offset, String color) native "CanvasGradient_addColorStop_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CanvasPattern
class CanvasPattern extends NativeFieldWrapperClass1 {
  CanvasPattern.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CanvasRenderingContext
class CanvasRenderingContext extends NativeFieldWrapperClass1 {
  CanvasRenderingContext.internal();


  /** @domName CanvasRenderingContext.canvas */
  CanvasElement get canvas native "CanvasRenderingContext_canvas_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName CanvasRenderingContext2D
class CanvasRenderingContext2D extends CanvasRenderingContext {
  CanvasRenderingContext2D.internal(): super.internal();


  /** @domName CanvasRenderingContext2D.fillStyle */
  dynamic get fillStyle native "CanvasRenderingContext2D_fillStyle_Getter";


  /** @domName CanvasRenderingContext2D.fillStyle */
  void set fillStyle(dynamic value) native "CanvasRenderingContext2D_fillStyle_Setter";


  /** @domName CanvasRenderingContext2D.font */
  String get font native "CanvasRenderingContext2D_font_Getter";


  /** @domName CanvasRenderingContext2D.font */
  void set font(String value) native "CanvasRenderingContext2D_font_Setter";


  /** @domName CanvasRenderingContext2D.globalAlpha */
  num get globalAlpha native "CanvasRenderingContext2D_globalAlpha_Getter";


  /** @domName CanvasRenderingContext2D.globalAlpha */
  void set globalAlpha(num value) native "CanvasRenderingContext2D_globalAlpha_Setter";


  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
  String get globalCompositeOperation native "CanvasRenderingContext2D_globalCompositeOperation_Getter";


  /** @domName CanvasRenderingContext2D.globalCompositeOperation */
  void set globalCompositeOperation(String value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";


  /** @domName CanvasRenderingContext2D.lineCap */
  String get lineCap native "CanvasRenderingContext2D_lineCap_Getter";


  /** @domName CanvasRenderingContext2D.lineCap */
  void set lineCap(String value) native "CanvasRenderingContext2D_lineCap_Setter";


  /** @domName CanvasRenderingContext2D.lineDashOffset */
  num get lineDashOffset native "CanvasRenderingContext2D_lineDashOffset_Getter";


  /** @domName CanvasRenderingContext2D.lineDashOffset */
  void set lineDashOffset(num value) native "CanvasRenderingContext2D_lineDashOffset_Setter";


  /** @domName CanvasRenderingContext2D.lineJoin */
  String get lineJoin native "CanvasRenderingContext2D_lineJoin_Getter";


  /** @domName CanvasRenderingContext2D.lineJoin */
  void set lineJoin(String value) native "CanvasRenderingContext2D_lineJoin_Setter";


  /** @domName CanvasRenderingContext2D.lineWidth */
  num get lineWidth native "CanvasRenderingContext2D_lineWidth_Getter";


  /** @domName CanvasRenderingContext2D.lineWidth */
  void set lineWidth(num value) native "CanvasRenderingContext2D_lineWidth_Setter";


  /** @domName CanvasRenderingContext2D.miterLimit */
  num get miterLimit native "CanvasRenderingContext2D_miterLimit_Getter";


  /** @domName CanvasRenderingContext2D.miterLimit */
  void set miterLimit(num value) native "CanvasRenderingContext2D_miterLimit_Setter";


  /** @domName CanvasRenderingContext2D.shadowBlur */
  num get shadowBlur native "CanvasRenderingContext2D_shadowBlur_Getter";


  /** @domName CanvasRenderingContext2D.shadowBlur */
  void set shadowBlur(num value) native "CanvasRenderingContext2D_shadowBlur_Setter";


  /** @domName CanvasRenderingContext2D.shadowColor */
  String get shadowColor native "CanvasRenderingContext2D_shadowColor_Getter";


  /** @domName CanvasRenderingContext2D.shadowColor */
  void set shadowColor(String value) native "CanvasRenderingContext2D_shadowColor_Setter";


  /** @domName CanvasRenderingContext2D.shadowOffsetX */
  num get shadowOffsetX native "CanvasRenderingContext2D_shadowOffsetX_Getter";


  /** @domName CanvasRenderingContext2D.shadowOffsetX */
  void set shadowOffsetX(num value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";


  /** @domName CanvasRenderingContext2D.shadowOffsetY */
  num get shadowOffsetY native "CanvasRenderingContext2D_shadowOffsetY_Getter";


  /** @domName CanvasRenderingContext2D.shadowOffsetY */
  void set shadowOffsetY(num value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";


  /** @domName CanvasRenderingContext2D.strokeStyle */
  dynamic get strokeStyle native "CanvasRenderingContext2D_strokeStyle_Getter";


  /** @domName CanvasRenderingContext2D.strokeStyle */
  void set strokeStyle(dynamic value) native "CanvasRenderingContext2D_strokeStyle_Setter";


  /** @domName CanvasRenderingContext2D.textAlign */
  String get textAlign native "CanvasRenderingContext2D_textAlign_Getter";


  /** @domName CanvasRenderingContext2D.textAlign */
  void set textAlign(String value) native "CanvasRenderingContext2D_textAlign_Setter";


  /** @domName CanvasRenderingContext2D.textBaseline */
  String get textBaseline native "CanvasRenderingContext2D_textBaseline_Getter";


  /** @domName CanvasRenderingContext2D.textBaseline */
  void set textBaseline(String value) native "CanvasRenderingContext2D_textBaseline_Setter";


  /** @domName CanvasRenderingContext2D.webkitBackingStorePixelRatio */
  num get webkitBackingStorePixelRatio native "CanvasRenderingContext2D_webkitBackingStorePixelRatio_Getter";


  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
  bool get webkitImageSmoothingEnabled native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Getter";


  /** @domName CanvasRenderingContext2D.webkitImageSmoothingEnabled */
  void set webkitImageSmoothingEnabled(bool value) native "CanvasRenderingContext2D_webkitImageSmoothingEnabled_Setter";


  /** @domName CanvasRenderingContext2D.webkitLineDash */
  List get webkitLineDash native "CanvasRenderingContext2D_webkitLineDash_Getter";


  /** @domName CanvasRenderingContext2D.webkitLineDash */
  void set webkitLineDash(List value) native "CanvasRenderingContext2D_webkitLineDash_Setter";


  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
  num get webkitLineDashOffset native "CanvasRenderingContext2D_webkitLineDashOffset_Getter";


  /** @domName CanvasRenderingContext2D.webkitLineDashOffset */
  void set webkitLineDashOffset(num value) native "CanvasRenderingContext2D_webkitLineDashOffset_Setter";


  /** @domName CanvasRenderingContext2D.arc */
  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) native "CanvasRenderingContext2D_arc_Callback";


  /** @domName CanvasRenderingContext2D.arcTo */
  void arcTo(num x1, num y1, num x2, num y2, num radius) native "CanvasRenderingContext2D_arcTo_Callback";


  /** @domName CanvasRenderingContext2D.beginPath */
  void beginPath() native "CanvasRenderingContext2D_beginPath_Callback";


  /** @domName CanvasRenderingContext2D.bezierCurveTo */
  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) native "CanvasRenderingContext2D_bezierCurveTo_Callback";


  /** @domName CanvasRenderingContext2D.clearRect */
  void clearRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_clearRect_Callback";


  /** @domName CanvasRenderingContext2D.clearShadow */
  void clearShadow() native "CanvasRenderingContext2D_clearShadow_Callback";


  /** @domName CanvasRenderingContext2D.clip */
  void clip() native "CanvasRenderingContext2D_clip_Callback";


  /** @domName CanvasRenderingContext2D.closePath */
  void closePath() native "CanvasRenderingContext2D_closePath_Callback";

  ImageData createImageData(imagedata_OR_sw, [/*float*/ sh]) {
    if ((imagedata_OR_sw is ImageData || imagedata_OR_sw == null) && !?sh) {
      return _createImageData_1(imagedata_OR_sw);
    }
    if ((imagedata_OR_sw is num || imagedata_OR_sw == null) && (sh is num || sh == null)) {
      return _createImageData_2(imagedata_OR_sw, sh);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.createImageData_1 */
  ImageData _createImageData_1(imagedata_OR_sw) native "CanvasRenderingContext2D_createImageData_1_Callback";


  /** @domName CanvasRenderingContext2D.createImageData_2 */
  ImageData _createImageData_2(imagedata_OR_sw, sh) native "CanvasRenderingContext2D_createImageData_2_Callback";


  /** @domName CanvasRenderingContext2D.createLinearGradient */
  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native "CanvasRenderingContext2D_createLinearGradient_Callback";

  CanvasPattern createPattern(canvas_OR_image, /*DOMString*/ repetitionType) {
    if ((canvas_OR_image is CanvasElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_1(canvas_OR_image, repetitionType);
    }
    if ((canvas_OR_image is ImageElement || canvas_OR_image == null) && (repetitionType is String || repetitionType == null)) {
      return _createPattern_2(canvas_OR_image, repetitionType);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.createPattern_1 */
  CanvasPattern _createPattern_1(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_1_Callback";


  /** @domName CanvasRenderingContext2D.createPattern_2 */
  CanvasPattern _createPattern_2(canvas_OR_image, repetitionType) native "CanvasRenderingContext2D_createPattern_2_Callback";


  /** @domName CanvasRenderingContext2D.createRadialGradient */
  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) native "CanvasRenderingContext2D_createRadialGradient_Callback";

  void drawImage(canvas_OR_image_OR_video, /*float*/ sx_OR_x, /*float*/ sy_OR_y, [/*float*/ sw_OR_width, /*float*/ height_OR_sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh]) {
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is ImageElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is CanvasElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && !?sw_OR_width && !?height_OR_sh && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && !?dx && !?dy && !?dw && !?dh) {
      _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
      return;
    }
    if ((canvas_OR_image_OR_video is VideoElement || canvas_OR_image_OR_video == null) && (sx_OR_x is num || sx_OR_x == null) && (sy_OR_y is num || sy_OR_y == null) && (sw_OR_width is num || sw_OR_width == null) && (height_OR_sh is num || height_OR_sh == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dw is num || dw == null) && (dh is num || dh == null)) {
      _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.drawImage_1 */
  void _drawImage_1(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_1_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_2 */
  void _drawImage_2(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_2_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_3 */
  void _drawImage_3(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_3_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_4 */
  void _drawImage_4(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_4_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_5 */
  void _drawImage_5(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_5_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_6 */
  void _drawImage_6(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_6_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_7 */
  void _drawImage_7(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_7_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_8 */
  void _drawImage_8(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_8_Callback";


  /** @domName CanvasRenderingContext2D.drawImage_9 */
  void _drawImage_9(canvas_OR_image_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_9_Callback";

  void drawImageFromRect(/*HTMLImageElement*/ image, [/*float*/ sx, /*float*/ sy, /*float*/ sw, /*float*/ sh, /*float*/ dx, /*float*/ dy, /*float*/ dw, /*float*/ dh, /*DOMString*/ compositeOperation]) {
    if (?compositeOperation) {
      _drawImageFromRect_1(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation);
      return;
    }
    if (?dh) {
      _drawImageFromRect_2(image, sx, sy, sw, sh, dx, dy, dw, dh);
      return;
    }
    if (?dw) {
      _drawImageFromRect_3(image, sx, sy, sw, sh, dx, dy, dw);
      return;
    }
    if (?dy) {
      _drawImageFromRect_4(image, sx, sy, sw, sh, dx, dy);
      return;
    }
    if (?dx) {
      _drawImageFromRect_5(image, sx, sy, sw, sh, dx);
      return;
    }
    if (?sh) {
      _drawImageFromRect_6(image, sx, sy, sw, sh);
      return;
    }
    if (?sw) {
      _drawImageFromRect_7(image, sx, sy, sw);
      return;
    }
    if (?sy) {
      _drawImageFromRect_8(image, sx, sy);
      return;
    }
    if (?sx) {
      _drawImageFromRect_9(image, sx);
      return;
    }
    _drawImageFromRect_10(image);
  }


  /** @domName CanvasRenderingContext2D.drawImageFromRect_1 */
  void _drawImageFromRect_1(image, sx, sy, sw, sh, dx, dy, dw, dh, compositeOperation) native "CanvasRenderingContext2D_drawImageFromRect_1_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_2 */
  void _drawImageFromRect_2(image, sx, sy, sw, sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImageFromRect_2_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_3 */
  void _drawImageFromRect_3(image, sx, sy, sw, sh, dx, dy, dw) native "CanvasRenderingContext2D_drawImageFromRect_3_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_4 */
  void _drawImageFromRect_4(image, sx, sy, sw, sh, dx, dy) native "CanvasRenderingContext2D_drawImageFromRect_4_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_5 */
  void _drawImageFromRect_5(image, sx, sy, sw, sh, dx) native "CanvasRenderingContext2D_drawImageFromRect_5_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_6 */
  void _drawImageFromRect_6(image, sx, sy, sw, sh) native "CanvasRenderingContext2D_drawImageFromRect_6_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_7 */
  void _drawImageFromRect_7(image, sx, sy, sw) native "CanvasRenderingContext2D_drawImageFromRect_7_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_8 */
  void _drawImageFromRect_8(image, sx, sy) native "CanvasRenderingContext2D_drawImageFromRect_8_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_9 */
  void _drawImageFromRect_9(image, sx) native "CanvasRenderingContext2D_drawImageFromRect_9_Callback";


  /** @domName CanvasRenderingContext2D.drawImageFromRect_10 */
  void _drawImageFromRect_10(image) native "CanvasRenderingContext2D_drawImageFromRect_10_Callback";


  /** @domName CanvasRenderingContext2D.fill */
  void fill() native "CanvasRenderingContext2D_fill_Callback";


  /** @domName CanvasRenderingContext2D.fillRect */
  void fillRect(num x, num y, num width, num height) native "CanvasRenderingContext2D_fillRect_Callback";

  void fillText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
    if (?maxWidth) {
      _fillText_1(text, x, y, maxWidth);
      return;
    }
    _fillText_2(text, x, y);
  }


  /** @domName CanvasRenderingContext2D.fillText_1 */
  void _fillText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_1_Callback";


  /** @domName CanvasRenderingContext2D.fillText_2 */
  void _fillText_2(text, x, y) native "CanvasRenderingContext2D_fillText_2_Callback";


  /** @domName CanvasRenderingContext2D.getImageData */
  ImageData getImageData(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_getImageData_Callback";


  /** @domName CanvasRenderingContext2D.getLineDash */
  List<num> getLineDash() native "CanvasRenderingContext2D_getLineDash_Callback";


  /** @domName CanvasRenderingContext2D.isPointInPath */
  bool isPointInPath(num x, num y) native "CanvasRenderingContext2D_isPointInPath_Callback";


  /** @domName CanvasRenderingContext2D.lineTo */
  void lineTo(num x, num y) native "CanvasRenderingContext2D_lineTo_Callback";


  /** @domName CanvasRenderingContext2D.measureText */
  TextMetrics measureText(String text) native "CanvasRenderingContext2D_measureText_Callback";


  /** @domName CanvasRenderingContext2D.moveTo */
  void moveTo(num x, num y) native "CanvasRenderingContext2D_moveTo_Callback";

  void putImageData(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _putImageData_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.putImageData_1 */
  void _putImageData_1(imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_1_Callback";


  /** @domName CanvasRenderingContext2D.putImageData_2 */
  void _putImageData_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_2_Callback";


  /** @domName CanvasRenderingContext2D.quadraticCurveTo */
  void quadraticCurveTo(num cpx, num cpy, num x, num y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback";


  /** @domName CanvasRenderingContext2D.rect */
  void rect(num x, num y, num width, num height) native "CanvasRenderingContext2D_rect_Callback";


  /** @domName CanvasRenderingContext2D.restore */
  void restore() native "CanvasRenderingContext2D_restore_Callback";


  /** @domName CanvasRenderingContext2D.rotate */
  void rotate(num angle) native "CanvasRenderingContext2D_rotate_Callback";


  /** @domName CanvasRenderingContext2D.save */
  void save() native "CanvasRenderingContext2D_save_Callback";


  /** @domName CanvasRenderingContext2D.scale */
  void scale(num sx, num sy) native "CanvasRenderingContext2D_scale_Callback";


  /** @domName CanvasRenderingContext2D.setAlpha */
  void setAlpha(num alpha) native "CanvasRenderingContext2D_setAlpha_Callback";


  /** @domName CanvasRenderingContext2D.setCompositeOperation */
  void setCompositeOperation(String compositeOperation) native "CanvasRenderingContext2D_setCompositeOperation_Callback";


  /** @domName CanvasRenderingContext2D.setLineCap */
  void setLineCap(String cap) native "CanvasRenderingContext2D_setLineCap_Callback";


  /** @domName CanvasRenderingContext2D.setLineDash */
  void setLineDash(List<num> dash) native "CanvasRenderingContext2D_setLineDash_Callback";


  /** @domName CanvasRenderingContext2D.setLineJoin */
  void setLineJoin(String join) native "CanvasRenderingContext2D_setLineJoin_Callback";


  /** @domName CanvasRenderingContext2D.setLineWidth */
  void setLineWidth(num width) native "CanvasRenderingContext2D_setLineWidth_Callback";


  /** @domName CanvasRenderingContext2D.setMiterLimit */
  void setMiterLimit(num limit) native "CanvasRenderingContext2D_setMiterLimit_Callback";

  void setShadow(/*float*/ width, /*float*/ height, /*float*/ blur, [c_OR_color_OR_grayLevel_OR_r, /*float*/ alpha_OR_g_OR_m, /*float*/ b_OR_y, /*float*/ a_OR_k, /*float*/ a]) {
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && !?c_OR_color_OR_grayLevel_OR_r && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_1(width, height, blur);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is String || c_OR_color_OR_grayLevel_OR_r == null) && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_2(width, height, blur, c_OR_color_OR_grayLevel_OR_r);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is String || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_3(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && !?alpha_OR_g_OR_m && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_4(width, height, blur, c_OR_color_OR_grayLevel_OR_r);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && !?b_OR_y && !?a_OR_k && !?a) {
      _setShadow_5(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && (b_OR_y is num || b_OR_y == null) && (a_OR_k is num || a_OR_k == null) && !?a) {
      _setShadow_6(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k);
      return;
    }
    if ((width is num || width == null) && (height is num || height == null) && (blur is num || blur == null) && (c_OR_color_OR_grayLevel_OR_r is num || c_OR_color_OR_grayLevel_OR_r == null) && (alpha_OR_g_OR_m is num || alpha_OR_g_OR_m == null) && (b_OR_y is num || b_OR_y == null) && (a_OR_k is num || a_OR_k == null) && (a is num || a == null)) {
      _setShadow_7(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k, a);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.setShadow_1 */
  void _setShadow_1(width, height, blur) native "CanvasRenderingContext2D_setShadow_1_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_2 */
  void _setShadow_2(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_2_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_3 */
  void _setShadow_3(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_3_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_4 */
  void _setShadow_4(width, height, blur, c_OR_color_OR_grayLevel_OR_r) native "CanvasRenderingContext2D_setShadow_4_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_5 */
  void _setShadow_5(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m) native "CanvasRenderingContext2D_setShadow_5_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_6 */
  void _setShadow_6(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k) native "CanvasRenderingContext2D_setShadow_6_Callback";


  /** @domName CanvasRenderingContext2D.setShadow_7 */
  void _setShadow_7(width, height, blur, c_OR_color_OR_grayLevel_OR_r, alpha_OR_g_OR_m, b_OR_y, a_OR_k, a) native "CanvasRenderingContext2D_setShadow_7_Callback";


  /** @domName CanvasRenderingContext2D.setTransform */
  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_setTransform_Callback";


  /** @domName CanvasRenderingContext2D.stroke */
  void stroke() native "CanvasRenderingContext2D_stroke_Callback";

  void strokeRect(/*float*/ x, /*float*/ y, /*float*/ width, /*float*/ height, [/*float*/ lineWidth]) {
    if (?lineWidth) {
      _strokeRect_1(x, y, width, height, lineWidth);
      return;
    }
    _strokeRect_2(x, y, width, height);
  }


  /** @domName CanvasRenderingContext2D.strokeRect_1 */
  void _strokeRect_1(x, y, width, height, lineWidth) native "CanvasRenderingContext2D_strokeRect_1_Callback";


  /** @domName CanvasRenderingContext2D.strokeRect_2 */
  void _strokeRect_2(x, y, width, height) native "CanvasRenderingContext2D_strokeRect_2_Callback";

  void strokeText(/*DOMString*/ text, /*float*/ x, /*float*/ y, [/*float*/ maxWidth]) {
    if (?maxWidth) {
      _strokeText_1(text, x, y, maxWidth);
      return;
    }
    _strokeText_2(text, x, y);
  }


  /** @domName CanvasRenderingContext2D.strokeText_1 */
  void _strokeText_1(text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_1_Callback";


  /** @domName CanvasRenderingContext2D.strokeText_2 */
  void _strokeText_2(text, x, y) native "CanvasRenderingContext2D_strokeText_2_Callback";


  /** @domName CanvasRenderingContext2D.transform */
  void transform(num m11, num m12, num m21, num m22, num dx, num dy) native "CanvasRenderingContext2D_transform_Callback";


  /** @domName CanvasRenderingContext2D.translate */
  void translate(num tx, num ty) native "CanvasRenderingContext2D_translate_Callback";


  /** @domName CanvasRenderingContext2D.webkitGetImageDataHD */
  ImageData webkitGetImageDataHD(num sx, num sy, num sw, num sh) native "CanvasRenderingContext2D_webkitGetImageDataHD_Callback";

  void webkitPutImageDataHD(/*ImageData*/ imagedata, /*float*/ dx, /*float*/ dy, [/*float*/ dirtyX, /*float*/ dirtyY, /*float*/ dirtyWidth, /*float*/ dirtyHeight]) {
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && !?dirtyX && !?dirtyY && !?dirtyWidth && !?dirtyHeight) {
      _webkitPutImageDataHD_1(imagedata, dx, dy);
      return;
    }
    if ((imagedata is ImageData || imagedata == null) && (dx is num || dx == null) && (dy is num || dy == null) && (dirtyX is num || dirtyX == null) && (dirtyY is num || dirtyY == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyHeight is num || dirtyHeight == null)) {
      _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_1 */
  void _webkitPutImageDataHD_1(imagedata, dx, dy) native "CanvasRenderingContext2D_webkitPutImageDataHD_1_Callback";


  /** @domName CanvasRenderingContext2D.webkitPutImageDataHD_2 */
  void _webkitPutImageDataHD_2(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_webkitPutImageDataHD_2_Callback";


  /**
   * Sets the color used inside shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setFillColorRgb(int r, int g, int b, [num a = 1]) {
    this.fillStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used inside shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setFillColorHsl(int h, num s, num l, [num a = 1]) {
    this.fillStyle = 'hsla($h, $s%, $l%, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [r], [g], [b] are 0-255, [a] is 0-1.
   */
  void setStrokeColorRgb(int r, int g, int b, [num a = 1]) {
    this.strokeStyle = 'rgba($r, $g, $b, $a)';
  }

  /**
   * Sets the color used for stroking shapes.
   * [h] is in degrees, 0-360.
   * [s], [l] are in percent, 0-100.
   * [a] is 0-1.
   */
  void setStrokeColorHsl(int h, num s, num l, [num a = 1]) {
    this.strokeStyle = 'hsla($h, $s%, $l%, $a)';
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CharacterData
class CharacterData extends Node {
  CharacterData.internal(): super.internal();


  /** @domName CharacterData.data */
  String get data native "CharacterData_data_Getter";


  /** @domName CharacterData.data */
  void set data(String value) native "CharacterData_data_Setter";


  /** @domName CharacterData.length */
  int get length native "CharacterData_length_Getter";


  /** @domName CharacterData.appendData */
  void appendData(String data) native "CharacterData_appendData_Callback";


  /** @domName CharacterData.deleteData */
  void deleteData(int offset, int length) native "CharacterData_deleteData_Callback";


  /** @domName CharacterData.insertData */
  void insertData(int offset, String data) native "CharacterData_insertData_Callback";


  /** @domName CharacterData.remove */
  void remove() native "CharacterData_remove_Callback";


  /** @domName CharacterData.replaceData */
  void replaceData(int offset, int length, String data) native "CharacterData_replaceData_Callback";


  /** @domName CharacterData.substringData */
  String substringData(int offset, int length) native "CharacterData_substringData_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ClientRect
class ClientRect extends NativeFieldWrapperClass1 {
  ClientRect.internal();


  /** @domName ClientRect.bottom */
  num get bottom native "ClientRect_bottom_Getter";


  /** @domName ClientRect.height */
  num get height native "ClientRect_height_Getter";


  /** @domName ClientRect.left */
  num get left native "ClientRect_left_Getter";


  /** @domName ClientRect.right */
  num get right native "ClientRect_right_Getter";


  /** @domName ClientRect.top */
  num get top native "ClientRect_top_Getter";


  /** @domName ClientRect.width */
  num get width native "ClientRect_width_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Clipboard
class Clipboard extends NativeFieldWrapperClass1 {
  Clipboard.internal();


  /** @domName Clipboard.dropEffect */
  String get dropEffect native "Clipboard_dropEffect_Getter";


  /** @domName Clipboard.dropEffect */
  void set dropEffect(String value) native "Clipboard_dropEffect_Setter";


  /** @domName Clipboard.effectAllowed */
  String get effectAllowed native "Clipboard_effectAllowed_Getter";


  /** @domName Clipboard.effectAllowed */
  void set effectAllowed(String value) native "Clipboard_effectAllowed_Setter";


  /** @domName Clipboard.files */
  List<File> get files native "Clipboard_files_Getter";


  /** @domName Clipboard.items */
  DataTransferItemList get items native "Clipboard_items_Getter";


  /** @domName Clipboard.types */
  List get types native "Clipboard_types_Getter";


  /** @domName Clipboard.clearData */
  void clearData([String type]) native "Clipboard_clearData_Callback";


  /** @domName Clipboard.getData */
  String getData(String type) native "Clipboard_getData_Callback";


  /** @domName Clipboard.setData */
  bool setData(String type, String data) native "Clipboard_setData_Callback";


  /** @domName Clipboard.setDragImage */
  void setDragImage(ImageElement image, int x, int y) native "Clipboard_setDragImage_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CloseEvent
class CloseEvent extends Event {
  CloseEvent.internal(): super.internal();


  /** @domName CloseEvent.code */
  int get code native "CloseEvent_code_Getter";


  /** @domName CloseEvent.reason */
  String get reason native "CloseEvent_reason_Getter";


  /** @domName CloseEvent.wasClean */
  bool get wasClean native "CloseEvent_wasClean_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Comment
class Comment extends CharacterData {
  Comment.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CompositionEvent
class CompositionEvent extends UIEvent {
  CompositionEvent.internal(): super.internal();


  /** @domName CompositionEvent.data */
  String get data native "CompositionEvent_data_Getter";


  /** @domName CompositionEvent.initCompositionEvent */
  void initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "CompositionEvent_initCompositionEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Console
class Console extends NativeFieldWrapperClass1 {
  Console.internal();


  /** @domName Console.memory */
  MemoryInfo get memory native "Console_memory_Getter";


  /** @domName Console.profiles */
  List<ScriptProfile> get profiles native "Console_profiles_Getter";


  /** @domName Console.assertCondition */
  void assertCondition(bool condition, Object arg) native "Console_assertCondition_Callback";


  /** @domName Console.count */
  void count(Object arg) native "Console_count_Callback";


  /** @domName Console.debug */
  void debug(Object arg) native "Console_debug_Callback";


  /** @domName Console.dir */
  void dir(Object arg) native "Console_dir_Callback";


  /** @domName Console.dirxml */
  void dirxml(Object arg) native "Console_dirxml_Callback";


  /** @domName Console.error */
  void error(Object arg) native "Console_error_Callback";


  /** @domName Console.group */
  void group(Object arg) native "Console_group_Callback";


  /** @domName Console.groupCollapsed */
  void groupCollapsed(Object arg) native "Console_groupCollapsed_Callback";


  /** @domName Console.groupEnd */
  void groupEnd() native "Console_groupEnd_Callback";


  /** @domName Console.info */
  void info(Object arg) native "Console_info_Callback";


  /** @domName Console.log */
  void log(Object arg) native "Console_log_Callback";


  /** @domName Console.markTimeline */
  void markTimeline(Object arg) native "Console_markTimeline_Callback";


  /** @domName Console.profile */
  void profile(String title) native "Console_profile_Callback";


  /** @domName Console.profileEnd */
  void profileEnd(String title) native "Console_profileEnd_Callback";


  /** @domName Console.time */
  void time(String title) native "Console_time_Callback";


  /** @domName Console.timeEnd */
  void timeEnd(String title, Object arg) native "Console_timeEnd_Callback";


  /** @domName Console.timeStamp */
  void timeStamp(Object arg) native "Console_timeStamp_Callback";


  /** @domName Console.trace */
  void trace(Object arg) native "Console_trace_Callback";


  /** @domName Console.warn */
  void warn(Object arg) native "Console_warn_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLContentElement
class ContentElement extends _Element_Merged {

  ///@docsEditable true
  factory ContentElement() => document.$dom_createElement("content");
  ContentElement.internal(): super.internal();


  /** @domName HTMLContentElement.resetStyleInheritance */
  bool get resetStyleInheritance native "HTMLContentElement_resetStyleInheritance_Getter";


  /** @domName HTMLContentElement.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "HTMLContentElement_resetStyleInheritance_Setter";


  /** @domName HTMLContentElement.select */
  String get select native "HTMLContentElement_select_Getter";


  /** @domName HTMLContentElement.select */
  void set select(String value) native "HTMLContentElement_select_Setter";


  /** @domName HTMLContentElement.getDistributedNodes */
  List<Node> getDistributedNodes() native "HTMLContentElement_getDistributedNodes_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Coordinates
class Coordinates extends NativeFieldWrapperClass1 {
  Coordinates.internal();


  /** @domName Coordinates.accuracy */
  num get accuracy native "Coordinates_accuracy_Getter";


  /** @domName Coordinates.altitude */
  num get altitude native "Coordinates_altitude_Getter";


  /** @domName Coordinates.altitudeAccuracy */
  num get altitudeAccuracy native "Coordinates_altitudeAccuracy_Getter";


  /** @domName Coordinates.heading */
  num get heading native "Coordinates_heading_Getter";


  /** @domName Coordinates.latitude */
  num get latitude native "Coordinates_latitude_Getter";


  /** @domName Coordinates.longitude */
  num get longitude native "Coordinates_longitude_Getter";


  /** @domName Coordinates.speed */
  num get speed native "Coordinates_speed_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Counter
class Counter extends NativeFieldWrapperClass1 {
  Counter.internal();


  /** @domName Counter.identifier */
  String get identifier native "Counter_identifier_Getter";


  /** @domName Counter.listStyle */
  String get listStyle native "Counter_listStyle_Getter";


  /** @domName Counter.separator */
  String get separator native "Counter_separator_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Crypto
class Crypto extends NativeFieldWrapperClass1 {
  Crypto.internal();


  /** @domName Crypto.getRandomValues */
  void getRandomValues(ArrayBufferView array) native "Crypto_getRandomValues_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSCharsetRule
class CssCharsetRule extends CssRule {
  CssCharsetRule.internal(): super.internal();


  /** @domName CSSCharsetRule.encoding */
  String get encoding native "CSSCharsetRule_encoding_Getter";


  /** @domName CSSCharsetRule.encoding */
  void set encoding(String value) native "CSSCharsetRule_encoding_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSFontFaceRule
class CssFontFaceRule extends CssRule {
  CssFontFaceRule.internal(): super.internal();


  /** @domName CSSFontFaceRule.style */
  CssStyleDeclaration get style native "CSSFontFaceRule_style_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSImportRule
class CssImportRule extends CssRule {
  CssImportRule.internal(): super.internal();


  /** @domName CSSImportRule.href */
  String get href native "CSSImportRule_href_Getter";


  /** @domName CSSImportRule.media */
  MediaList get media native "CSSImportRule_media_Getter";


  /** @domName CSSImportRule.styleSheet */
  CssStyleSheet get styleSheet native "CSSImportRule_styleSheet_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitCSSKeyframeRule
class CssKeyframeRule extends CssRule {
  CssKeyframeRule.internal(): super.internal();


  /** @domName WebKitCSSKeyframeRule.keyText */
  String get keyText native "WebKitCSSKeyframeRule_keyText_Getter";


  /** @domName WebKitCSSKeyframeRule.keyText */
  void set keyText(String value) native "WebKitCSSKeyframeRule_keyText_Setter";


  /** @domName WebKitCSSKeyframeRule.style */
  CssStyleDeclaration get style native "WebKitCSSKeyframeRule_style_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitCSSKeyframesRule
class CssKeyframesRule extends CssRule {
  CssKeyframesRule.internal(): super.internal();


  /** @domName WebKitCSSKeyframesRule.cssRules */
  List<CssRule> get cssRules native "WebKitCSSKeyframesRule_cssRules_Getter";


  /** @domName WebKitCSSKeyframesRule.name */
  String get name native "WebKitCSSKeyframesRule_name_Getter";


  /** @domName WebKitCSSKeyframesRule.name */
  void set name(String value) native "WebKitCSSKeyframesRule_name_Setter";


  /** @domName WebKitCSSKeyframesRule.deleteRule */
  void deleteRule(String key) native "WebKitCSSKeyframesRule_deleteRule_Callback";


  /** @domName WebKitCSSKeyframesRule.findRule */
  CssKeyframeRule findRule(String key) native "WebKitCSSKeyframesRule_findRule_Callback";


  /** @domName WebKitCSSKeyframesRule.insertRule */
  void insertRule(String rule) native "WebKitCSSKeyframesRule_insertRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitCSSMatrix
class CssMatrix extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory CssMatrix([String cssValue]) {
    if (!?cssValue) {
      return _CssMatrixFactoryProvider.createCssMatrix();
    }
    return _CssMatrixFactoryProvider.createCssMatrix(cssValue);
  }
  CssMatrix.internal();


  /** @domName WebKitCSSMatrix.a */
  num get a native "WebKitCSSMatrix_a_Getter";


  /** @domName WebKitCSSMatrix.a */
  void set a(num value) native "WebKitCSSMatrix_a_Setter";


  /** @domName WebKitCSSMatrix.b */
  num get b native "WebKitCSSMatrix_b_Getter";


  /** @domName WebKitCSSMatrix.b */
  void set b(num value) native "WebKitCSSMatrix_b_Setter";


  /** @domName WebKitCSSMatrix.c */
  num get c native "WebKitCSSMatrix_c_Getter";


  /** @domName WebKitCSSMatrix.c */
  void set c(num value) native "WebKitCSSMatrix_c_Setter";


  /** @domName WebKitCSSMatrix.d */
  num get d native "WebKitCSSMatrix_d_Getter";


  /** @domName WebKitCSSMatrix.d */
  void set d(num value) native "WebKitCSSMatrix_d_Setter";


  /** @domName WebKitCSSMatrix.e */
  num get e native "WebKitCSSMatrix_e_Getter";


  /** @domName WebKitCSSMatrix.e */
  void set e(num value) native "WebKitCSSMatrix_e_Setter";


  /** @domName WebKitCSSMatrix.f */
  num get f native "WebKitCSSMatrix_f_Getter";


  /** @domName WebKitCSSMatrix.f */
  void set f(num value) native "WebKitCSSMatrix_f_Setter";


  /** @domName WebKitCSSMatrix.m11 */
  num get m11 native "WebKitCSSMatrix_m11_Getter";


  /** @domName WebKitCSSMatrix.m11 */
  void set m11(num value) native "WebKitCSSMatrix_m11_Setter";


  /** @domName WebKitCSSMatrix.m12 */
  num get m12 native "WebKitCSSMatrix_m12_Getter";


  /** @domName WebKitCSSMatrix.m12 */
  void set m12(num value) native "WebKitCSSMatrix_m12_Setter";


  /** @domName WebKitCSSMatrix.m13 */
  num get m13 native "WebKitCSSMatrix_m13_Getter";


  /** @domName WebKitCSSMatrix.m13 */
  void set m13(num value) native "WebKitCSSMatrix_m13_Setter";


  /** @domName WebKitCSSMatrix.m14 */
  num get m14 native "WebKitCSSMatrix_m14_Getter";


  /** @domName WebKitCSSMatrix.m14 */
  void set m14(num value) native "WebKitCSSMatrix_m14_Setter";


  /** @domName WebKitCSSMatrix.m21 */
  num get m21 native "WebKitCSSMatrix_m21_Getter";


  /** @domName WebKitCSSMatrix.m21 */
  void set m21(num value) native "WebKitCSSMatrix_m21_Setter";


  /** @domName WebKitCSSMatrix.m22 */
  num get m22 native "WebKitCSSMatrix_m22_Getter";


  /** @domName WebKitCSSMatrix.m22 */
  void set m22(num value) native "WebKitCSSMatrix_m22_Setter";


  /** @domName WebKitCSSMatrix.m23 */
  num get m23 native "WebKitCSSMatrix_m23_Getter";


  /** @domName WebKitCSSMatrix.m23 */
  void set m23(num value) native "WebKitCSSMatrix_m23_Setter";


  /** @domName WebKitCSSMatrix.m24 */
  num get m24 native "WebKitCSSMatrix_m24_Getter";


  /** @domName WebKitCSSMatrix.m24 */
  void set m24(num value) native "WebKitCSSMatrix_m24_Setter";


  /** @domName WebKitCSSMatrix.m31 */
  num get m31 native "WebKitCSSMatrix_m31_Getter";


  /** @domName WebKitCSSMatrix.m31 */
  void set m31(num value) native "WebKitCSSMatrix_m31_Setter";


  /** @domName WebKitCSSMatrix.m32 */
  num get m32 native "WebKitCSSMatrix_m32_Getter";


  /** @domName WebKitCSSMatrix.m32 */
  void set m32(num value) native "WebKitCSSMatrix_m32_Setter";


  /** @domName WebKitCSSMatrix.m33 */
  num get m33 native "WebKitCSSMatrix_m33_Getter";


  /** @domName WebKitCSSMatrix.m33 */
  void set m33(num value) native "WebKitCSSMatrix_m33_Setter";


  /** @domName WebKitCSSMatrix.m34 */
  num get m34 native "WebKitCSSMatrix_m34_Getter";


  /** @domName WebKitCSSMatrix.m34 */
  void set m34(num value) native "WebKitCSSMatrix_m34_Setter";


  /** @domName WebKitCSSMatrix.m41 */
  num get m41 native "WebKitCSSMatrix_m41_Getter";


  /** @domName WebKitCSSMatrix.m41 */
  void set m41(num value) native "WebKitCSSMatrix_m41_Setter";


  /** @domName WebKitCSSMatrix.m42 */
  num get m42 native "WebKitCSSMatrix_m42_Getter";


  /** @domName WebKitCSSMatrix.m42 */
  void set m42(num value) native "WebKitCSSMatrix_m42_Setter";


  /** @domName WebKitCSSMatrix.m43 */
  num get m43 native "WebKitCSSMatrix_m43_Getter";


  /** @domName WebKitCSSMatrix.m43 */
  void set m43(num value) native "WebKitCSSMatrix_m43_Setter";


  /** @domName WebKitCSSMatrix.m44 */
  num get m44 native "WebKitCSSMatrix_m44_Getter";


  /** @domName WebKitCSSMatrix.m44 */
  void set m44(num value) native "WebKitCSSMatrix_m44_Setter";


  /** @domName WebKitCSSMatrix.inverse */
  CssMatrix inverse() native "WebKitCSSMatrix_inverse_Callback";


  /** @domName WebKitCSSMatrix.multiply */
  CssMatrix multiply(CssMatrix secondMatrix) native "WebKitCSSMatrix_multiply_Callback";


  /** @domName WebKitCSSMatrix.rotate */
  CssMatrix rotate(num rotX, num rotY, num rotZ) native "WebKitCSSMatrix_rotate_Callback";


  /** @domName WebKitCSSMatrix.rotateAxisAngle */
  CssMatrix rotateAxisAngle(num x, num y, num z, num angle) native "WebKitCSSMatrix_rotateAxisAngle_Callback";


  /** @domName WebKitCSSMatrix.scale */
  CssMatrix scale(num scaleX, num scaleY, num scaleZ) native "WebKitCSSMatrix_scale_Callback";


  /** @domName WebKitCSSMatrix.setMatrixValue */
  void setMatrixValue(String string) native "WebKitCSSMatrix_setMatrixValue_Callback";


  /** @domName WebKitCSSMatrix.skewX */
  CssMatrix skewX(num angle) native "WebKitCSSMatrix_skewX_Callback";


  /** @domName WebKitCSSMatrix.skewY */
  CssMatrix skewY(num angle) native "WebKitCSSMatrix_skewY_Callback";


  /** @domName WebKitCSSMatrix.toString */
  String toString() native "WebKitCSSMatrix_toString_Callback";


  /** @domName WebKitCSSMatrix.translate */
  CssMatrix translate(num x, num y, num z) native "WebKitCSSMatrix_translate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSMediaRule
class CssMediaRule extends CssRule {
  CssMediaRule.internal(): super.internal();


  /** @domName CSSMediaRule.cssRules */
  List<CssRule> get cssRules native "CSSMediaRule_cssRules_Getter";


  /** @domName CSSMediaRule.media */
  MediaList get media native "CSSMediaRule_media_Getter";


  /** @domName CSSMediaRule.deleteRule */
  void deleteRule(int index) native "CSSMediaRule_deleteRule_Callback";


  /** @domName CSSMediaRule.insertRule */
  int insertRule(String rule, int index) native "CSSMediaRule_insertRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSPageRule
class CssPageRule extends CssRule {
  CssPageRule.internal(): super.internal();


  /** @domName CSSPageRule.selectorText */
  String get selectorText native "CSSPageRule_selectorText_Getter";


  /** @domName CSSPageRule.selectorText */
  void set selectorText(String value) native "CSSPageRule_selectorText_Setter";


  /** @domName CSSPageRule.style */
  CssStyleDeclaration get style native "CSSPageRule_style_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSPrimitiveValue
class CssPrimitiveValue extends CssValue {
  CssPrimitiveValue.internal(): super.internal();

  static const int CSS_ATTR = 22;

  static const int CSS_CM = 6;

  static const int CSS_COUNTER = 23;

  static const int CSS_DEG = 11;

  static const int CSS_DIMENSION = 18;

  static const int CSS_EMS = 3;

  static const int CSS_EXS = 4;

  static const int CSS_GRAD = 13;

  static const int CSS_HZ = 16;

  static const int CSS_IDENT = 21;

  static const int CSS_IN = 8;

  static const int CSS_KHZ = 17;

  static const int CSS_MM = 7;

  static const int CSS_MS = 14;

  static const int CSS_NUMBER = 1;

  static const int CSS_PC = 10;

  static const int CSS_PERCENTAGE = 2;

  static const int CSS_PT = 9;

  static const int CSS_PX = 5;

  static const int CSS_RAD = 12;

  static const int CSS_RECT = 24;

  static const int CSS_RGBCOLOR = 25;

  static const int CSS_S = 15;

  static const int CSS_STRING = 19;

  static const int CSS_UNKNOWN = 0;

  static const int CSS_URI = 20;

  static const int CSS_VH = 27;

  static const int CSS_VMIN = 28;

  static const int CSS_VW = 26;


  /** @domName CSSPrimitiveValue.primitiveType */
  int get primitiveType native "CSSPrimitiveValue_primitiveType_Getter";


  /** @domName CSSPrimitiveValue.getCounterValue */
  Counter getCounterValue() native "CSSPrimitiveValue_getCounterValue_Callback";


  /** @domName CSSPrimitiveValue.getFloatValue */
  num getFloatValue(int unitType) native "CSSPrimitiveValue_getFloatValue_Callback";


  /** @domName CSSPrimitiveValue.getRGBColorValue */
  RgbColor getRgbColorValue() native "CSSPrimitiveValue_getRGBColorValue_Callback";


  /** @domName CSSPrimitiveValue.getRectValue */
  Rect getRectValue() native "CSSPrimitiveValue_getRectValue_Callback";


  /** @domName CSSPrimitiveValue.getStringValue */
  String getStringValue() native "CSSPrimitiveValue_getStringValue_Callback";


  /** @domName CSSPrimitiveValue.setFloatValue */
  void setFloatValue(int unitType, num floatValue) native "CSSPrimitiveValue_setFloatValue_Callback";


  /** @domName CSSPrimitiveValue.setStringValue */
  void setStringValue(int stringType, String stringValue) native "CSSPrimitiveValue_setStringValue_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSRule
class CssRule extends NativeFieldWrapperClass1 {
  CssRule.internal();

  static const int CHARSET_RULE = 2;

  static const int FONT_FACE_RULE = 5;

  static const int IMPORT_RULE = 3;

  static const int MEDIA_RULE = 4;

  static const int PAGE_RULE = 6;

  static const int STYLE_RULE = 1;

  static const int UNKNOWN_RULE = 0;

  static const int WEBKIT_KEYFRAMES_RULE = 7;

  static const int WEBKIT_KEYFRAME_RULE = 8;


  /** @domName CSSRule.cssText */
  String get cssText native "CSSRule_cssText_Getter";


  /** @domName CSSRule.cssText */
  void set cssText(String value) native "CSSRule_cssText_Setter";


  /** @domName CSSRule.parentRule */
  CssRule get parentRule native "CSSRule_parentRule_Getter";


  /** @domName CSSRule.parentStyleSheet */
  CssStyleSheet get parentStyleSheet native "CSSRule_parentStyleSheet_Getter";


  /** @domName CSSRule.type */
  int get type native "CSSRule_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


String _cachedBrowserPrefix;

String get _browserPrefix {
  if (_cachedBrowserPrefix == null) {
    if (_Device.isFirefox) {
      _cachedBrowserPrefix = '-moz-';
    } else if (_Device.isIE) {
      _cachedBrowserPrefix = '-ms-';
    } else if (_Device.isOpera) {
      _cachedBrowserPrefix = '-o-';
    } else {
      _cachedBrowserPrefix = '-webkit-';
    }
  }
  return _cachedBrowserPrefix;
}

/// @domName CSSStyleDeclaration
class CssStyleDeclaration extends NativeFieldWrapperClass1 {
  factory CssStyleDeclaration() => _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration();
  factory CssStyleDeclaration.css(String css) =>
      _CssStyleDeclarationFactoryProvider.createCssStyleDeclaration_css(css);

  CssStyleDeclaration.internal();


  /** @domName CSSStyleDeclaration.cssText */
  String get cssText native "CSSStyleDeclaration_cssText_Getter";


  /** @domName CSSStyleDeclaration.cssText */
  void set cssText(String value) native "CSSStyleDeclaration_cssText_Setter";


  /** @domName CSSStyleDeclaration.length */
  int get length native "CSSStyleDeclaration_length_Getter";


  /** @domName CSSStyleDeclaration.parentRule */
  CssRule get parentRule native "CSSStyleDeclaration_parentRule_Getter";


  /** @domName CSSStyleDeclaration.getPropertyCSSValue */
  CssValue getPropertyCssValue(String propertyName) native "CSSStyleDeclaration_getPropertyCSSValue_Callback";


  /** @domName CSSStyleDeclaration.getPropertyPriority */
  String getPropertyPriority(String propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback";


  /** @domName CSSStyleDeclaration.getPropertyShorthand */
  String getPropertyShorthand(String propertyName) native "CSSStyleDeclaration_getPropertyShorthand_Callback";


  /** @domName CSSStyleDeclaration._getPropertyValue */
  String _getPropertyValue(String propertyName) native "CSSStyleDeclaration__getPropertyValue_Callback";


  /** @domName CSSStyleDeclaration.isPropertyImplicit */
  bool isPropertyImplicit(String propertyName) native "CSSStyleDeclaration_isPropertyImplicit_Callback";


  /** @domName CSSStyleDeclaration.item */
  String item(int index) native "CSSStyleDeclaration_item_Callback";


  /** @domName CSSStyleDeclaration.removeProperty */
  String removeProperty(String propertyName) native "CSSStyleDeclaration_removeProperty_Callback";


  /** @domName CSSStyleDeclaration.setProperty */
  void setProperty(String propertyName, String value, [String priority]) native "CSSStyleDeclaration_setProperty_Callback";


  String getPropertyValue(String propertyName) {
    var propValue = _getPropertyValue(propertyName);
    return propValue != null ? propValue : '';
  }


  // TODO(jacobr): generate this list of properties using the existing script.
  /** Gets the value of "align-content" */
  String get alignContent =>
    getPropertyValue('${_browserPrefix}align-content');

  /** Sets the value of "align-content" */
  void set alignContent(String value) {
    setProperty('${_browserPrefix}align-content', value, '');
  }

  /** Gets the value of "align-items" */
  String get alignItems =>
    getPropertyValue('${_browserPrefix}align-items');

  /** Sets the value of "align-items" */
  void set alignItems(String value) {
    setProperty('${_browserPrefix}align-items', value, '');
  }

  /** Gets the value of "align-self" */
  String get alignSelf =>
    getPropertyValue('${_browserPrefix}align-self');

  /** Sets the value of "align-self" */
  void set alignSelf(String value) {
    setProperty('${_browserPrefix}align-self', value, '');
  }

  /** Gets the value of "animation" */
  String get animation =>
    getPropertyValue('${_browserPrefix}animation');

  /** Sets the value of "animation" */
  void set animation(String value) {
    setProperty('${_browserPrefix}animation', value, '');
  }

  /** Gets the value of "animation-delay" */
  String get animationDelay =>
    getPropertyValue('${_browserPrefix}animation-delay');

  /** Sets the value of "animation-delay" */
  void set animationDelay(String value) {
    setProperty('${_browserPrefix}animation-delay', value, '');
  }

  /** Gets the value of "animation-direction" */
  String get animationDirection =>
    getPropertyValue('${_browserPrefix}animation-direction');

  /** Sets the value of "animation-direction" */
  void set animationDirection(String value) {
    setProperty('${_browserPrefix}animation-direction', value, '');
  }

  /** Gets the value of "animation-duration" */
  String get animationDuration =>
    getPropertyValue('${_browserPrefix}animation-duration');

  /** Sets the value of "animation-duration" */
  void set animationDuration(String value) {
    setProperty('${_browserPrefix}animation-duration', value, '');
  }

  /** Gets the value of "animation-fill-mode" */
  String get animationFillMode =>
    getPropertyValue('${_browserPrefix}animation-fill-mode');

  /** Sets the value of "animation-fill-mode" */
  void set animationFillMode(String value) {
    setProperty('${_browserPrefix}animation-fill-mode', value, '');
  }

  /** Gets the value of "animation-iteration-count" */
  String get animationIterationCount =>
    getPropertyValue('${_browserPrefix}animation-iteration-count');

  /** Sets the value of "animation-iteration-count" */
  void set animationIterationCount(String value) {
    setProperty('${_browserPrefix}animation-iteration-count', value, '');
  }

  /** Gets the value of "animation-name" */
  String get animationName =>
    getPropertyValue('${_browserPrefix}animation-name');

  /** Sets the value of "animation-name" */
  void set animationName(String value) {
    setProperty('${_browserPrefix}animation-name', value, '');
  }

  /** Gets the value of "animation-play-state" */
  String get animationPlayState =>
    getPropertyValue('${_browserPrefix}animation-play-state');

  /** Sets the value of "animation-play-state" */
  void set animationPlayState(String value) {
    setProperty('${_browserPrefix}animation-play-state', value, '');
  }

  /** Gets the value of "animation-timing-function" */
  String get animationTimingFunction =>
    getPropertyValue('${_browserPrefix}animation-timing-function');

  /** Sets the value of "animation-timing-function" */
  void set animationTimingFunction(String value) {
    setProperty('${_browserPrefix}animation-timing-function', value, '');
  }

  /** Gets the value of "app-region" */
  String get appRegion =>
    getPropertyValue('${_browserPrefix}app-region');

  /** Sets the value of "app-region" */
  void set appRegion(String value) {
    setProperty('${_browserPrefix}app-region', value, '');
  }

  /** Gets the value of "appearance" */
  String get appearance =>
    getPropertyValue('${_browserPrefix}appearance');

  /** Sets the value of "appearance" */
  void set appearance(String value) {
    setProperty('${_browserPrefix}appearance', value, '');
  }

  /** Gets the value of "aspect-ratio" */
  String get aspectRatio =>
    getPropertyValue('${_browserPrefix}aspect-ratio');

  /** Sets the value of "aspect-ratio" */
  void set aspectRatio(String value) {
    setProperty('${_browserPrefix}aspect-ratio', value, '');
  }

  /** Gets the value of "backface-visibility" */
  String get backfaceVisibility =>
    getPropertyValue('${_browserPrefix}backface-visibility');

  /** Sets the value of "backface-visibility" */
  void set backfaceVisibility(String value) {
    setProperty('${_browserPrefix}backface-visibility', value, '');
  }

  /** Gets the value of "background" */
  String get background =>
    getPropertyValue('background');

  /** Sets the value of "background" */
  void set background(String value) {
    setProperty('background', value, '');
  }

  /** Gets the value of "background-attachment" */
  String get backgroundAttachment =>
    getPropertyValue('background-attachment');

  /** Sets the value of "background-attachment" */
  void set backgroundAttachment(String value) {
    setProperty('background-attachment', value, '');
  }

  /** Gets the value of "background-clip" */
  String get backgroundClip =>
    getPropertyValue('background-clip');

  /** Sets the value of "background-clip" */
  void set backgroundClip(String value) {
    setProperty('background-clip', value, '');
  }

  /** Gets the value of "background-color" */
  String get backgroundColor =>
    getPropertyValue('background-color');

  /** Sets the value of "background-color" */
  void set backgroundColor(String value) {
    setProperty('background-color', value, '');
  }

  /** Gets the value of "background-composite" */
  String get backgroundComposite =>
    getPropertyValue('${_browserPrefix}background-composite');

  /** Sets the value of "background-composite" */
  void set backgroundComposite(String value) {
    setProperty('${_browserPrefix}background-composite', value, '');
  }

  /** Gets the value of "background-image" */
  String get backgroundImage =>
    getPropertyValue('background-image');

  /** Sets the value of "background-image" */
  void set backgroundImage(String value) {
    setProperty('background-image', value, '');
  }

  /** Gets the value of "background-origin" */
  String get backgroundOrigin =>
    getPropertyValue('background-origin');

  /** Sets the value of "background-origin" */
  void set backgroundOrigin(String value) {
    setProperty('background-origin', value, '');
  }

  /** Gets the value of "background-position" */
  String get backgroundPosition =>
    getPropertyValue('background-position');

  /** Sets the value of "background-position" */
  void set backgroundPosition(String value) {
    setProperty('background-position', value, '');
  }

  /** Gets the value of "background-position-x" */
  String get backgroundPositionX =>
    getPropertyValue('background-position-x');

  /** Sets the value of "background-position-x" */
  void set backgroundPositionX(String value) {
    setProperty('background-position-x', value, '');
  }

  /** Gets the value of "background-position-y" */
  String get backgroundPositionY =>
    getPropertyValue('background-position-y');

  /** Sets the value of "background-position-y" */
  void set backgroundPositionY(String value) {
    setProperty('background-position-y', value, '');
  }

  /** Gets the value of "background-repeat" */
  String get backgroundRepeat =>
    getPropertyValue('background-repeat');

  /** Sets the value of "background-repeat" */
  void set backgroundRepeat(String value) {
    setProperty('background-repeat', value, '');
  }

  /** Gets the value of "background-repeat-x" */
  String get backgroundRepeatX =>
    getPropertyValue('background-repeat-x');

  /** Sets the value of "background-repeat-x" */
  void set backgroundRepeatX(String value) {
    setProperty('background-repeat-x', value, '');
  }

  /** Gets the value of "background-repeat-y" */
  String get backgroundRepeatY =>
    getPropertyValue('background-repeat-y');

  /** Sets the value of "background-repeat-y" */
  void set backgroundRepeatY(String value) {
    setProperty('background-repeat-y', value, '');
  }

  /** Gets the value of "background-size" */
  String get backgroundSize =>
    getPropertyValue('background-size');

  /** Sets the value of "background-size" */
  void set backgroundSize(String value) {
    setProperty('background-size', value, '');
  }

  /** Gets the value of "blend-mode" */
  String get blendMode =>
    getPropertyValue('${_browserPrefix}blend-mode');

  /** Sets the value of "blend-mode" */
  void set blendMode(String value) {
    setProperty('${_browserPrefix}blend-mode', value, '');
  }

  /** Gets the value of "border" */
  String get border =>
    getPropertyValue('border');

  /** Sets the value of "border" */
  void set border(String value) {
    setProperty('border', value, '');
  }

  /** Gets the value of "border-after" */
  String get borderAfter =>
    getPropertyValue('${_browserPrefix}border-after');

  /** Sets the value of "border-after" */
  void set borderAfter(String value) {
    setProperty('${_browserPrefix}border-after', value, '');
  }

  /** Gets the value of "border-after-color" */
  String get borderAfterColor =>
    getPropertyValue('${_browserPrefix}border-after-color');

  /** Sets the value of "border-after-color" */
  void set borderAfterColor(String value) {
    setProperty('${_browserPrefix}border-after-color', value, '');
  }

  /** Gets the value of "border-after-style" */
  String get borderAfterStyle =>
    getPropertyValue('${_browserPrefix}border-after-style');

  /** Sets the value of "border-after-style" */
  void set borderAfterStyle(String value) {
    setProperty('${_browserPrefix}border-after-style', value, '');
  }

  /** Gets the value of "border-after-width" */
  String get borderAfterWidth =>
    getPropertyValue('${_browserPrefix}border-after-width');

  /** Sets the value of "border-after-width" */
  void set borderAfterWidth(String value) {
    setProperty('${_browserPrefix}border-after-width', value, '');
  }

  /** Gets the value of "border-before" */
  String get borderBefore =>
    getPropertyValue('${_browserPrefix}border-before');

  /** Sets the value of "border-before" */
  void set borderBefore(String value) {
    setProperty('${_browserPrefix}border-before', value, '');
  }

  /** Gets the value of "border-before-color" */
  String get borderBeforeColor =>
    getPropertyValue('${_browserPrefix}border-before-color');

  /** Sets the value of "border-before-color" */
  void set borderBeforeColor(String value) {
    setProperty('${_browserPrefix}border-before-color', value, '');
  }

  /** Gets the value of "border-before-style" */
  String get borderBeforeStyle =>
    getPropertyValue('${_browserPrefix}border-before-style');

  /** Sets the value of "border-before-style" */
  void set borderBeforeStyle(String value) {
    setProperty('${_browserPrefix}border-before-style', value, '');
  }

  /** Gets the value of "border-before-width" */
  String get borderBeforeWidth =>
    getPropertyValue('${_browserPrefix}border-before-width');

  /** Sets the value of "border-before-width" */
  void set borderBeforeWidth(String value) {
    setProperty('${_browserPrefix}border-before-width', value, '');
  }

  /** Gets the value of "border-bottom" */
  String get borderBottom =>
    getPropertyValue('border-bottom');

  /** Sets the value of "border-bottom" */
  void set borderBottom(String value) {
    setProperty('border-bottom', value, '');
  }

  /** Gets the value of "border-bottom-color" */
  String get borderBottomColor =>
    getPropertyValue('border-bottom-color');

  /** Sets the value of "border-bottom-color" */
  void set borderBottomColor(String value) {
    setProperty('border-bottom-color', value, '');
  }

  /** Gets the value of "border-bottom-left-radius" */
  String get borderBottomLeftRadius =>
    getPropertyValue('border-bottom-left-radius');

  /** Sets the value of "border-bottom-left-radius" */
  void set borderBottomLeftRadius(String value) {
    setProperty('border-bottom-left-radius', value, '');
  }

  /** Gets the value of "border-bottom-right-radius" */
  String get borderBottomRightRadius =>
    getPropertyValue('border-bottom-right-radius');

  /** Sets the value of "border-bottom-right-radius" */
  void set borderBottomRightRadius(String value) {
    setProperty('border-bottom-right-radius', value, '');
  }

  /** Gets the value of "border-bottom-style" */
  String get borderBottomStyle =>
    getPropertyValue('border-bottom-style');

  /** Sets the value of "border-bottom-style" */
  void set borderBottomStyle(String value) {
    setProperty('border-bottom-style', value, '');
  }

  /** Gets the value of "border-bottom-width" */
  String get borderBottomWidth =>
    getPropertyValue('border-bottom-width');

  /** Sets the value of "border-bottom-width" */
  void set borderBottomWidth(String value) {
    setProperty('border-bottom-width', value, '');
  }

  /** Gets the value of "border-collapse" */
  String get borderCollapse =>
    getPropertyValue('border-collapse');

  /** Sets the value of "border-collapse" */
  void set borderCollapse(String value) {
    setProperty('border-collapse', value, '');
  }

  /** Gets the value of "border-color" */
  String get borderColor =>
    getPropertyValue('border-color');

  /** Sets the value of "border-color" */
  void set borderColor(String value) {
    setProperty('border-color', value, '');
  }

  /** Gets the value of "border-end" */
  String get borderEnd =>
    getPropertyValue('${_browserPrefix}border-end');

  /** Sets the value of "border-end" */
  void set borderEnd(String value) {
    setProperty('${_browserPrefix}border-end', value, '');
  }

  /** Gets the value of "border-end-color" */
  String get borderEndColor =>
    getPropertyValue('${_browserPrefix}border-end-color');

  /** Sets the value of "border-end-color" */
  void set borderEndColor(String value) {
    setProperty('${_browserPrefix}border-end-color', value, '');
  }

  /** Gets the value of "border-end-style" */
  String get borderEndStyle =>
    getPropertyValue('${_browserPrefix}border-end-style');

  /** Sets the value of "border-end-style" */
  void set borderEndStyle(String value) {
    setProperty('${_browserPrefix}border-end-style', value, '');
  }

  /** Gets the value of "border-end-width" */
  String get borderEndWidth =>
    getPropertyValue('${_browserPrefix}border-end-width');

  /** Sets the value of "border-end-width" */
  void set borderEndWidth(String value) {
    setProperty('${_browserPrefix}border-end-width', value, '');
  }

  /** Gets the value of "border-fit" */
  String get borderFit =>
    getPropertyValue('${_browserPrefix}border-fit');

  /** Sets the value of "border-fit" */
  void set borderFit(String value) {
    setProperty('${_browserPrefix}border-fit', value, '');
  }

  /** Gets the value of "border-horizontal-spacing" */
  String get borderHorizontalSpacing =>
    getPropertyValue('${_browserPrefix}border-horizontal-spacing');

  /** Sets the value of "border-horizontal-spacing" */
  void set borderHorizontalSpacing(String value) {
    setProperty('${_browserPrefix}border-horizontal-spacing', value, '');
  }

  /** Gets the value of "border-image" */
  String get borderImage =>
    getPropertyValue('border-image');

  /** Sets the value of "border-image" */
  void set borderImage(String value) {
    setProperty('border-image', value, '');
  }

  /** Gets the value of "border-image-outset" */
  String get borderImageOutset =>
    getPropertyValue('border-image-outset');

  /** Sets the value of "border-image-outset" */
  void set borderImageOutset(String value) {
    setProperty('border-image-outset', value, '');
  }

  /** Gets the value of "border-image-repeat" */
  String get borderImageRepeat =>
    getPropertyValue('border-image-repeat');

  /** Sets the value of "border-image-repeat" */
  void set borderImageRepeat(String value) {
    setProperty('border-image-repeat', value, '');
  }

  /** Gets the value of "border-image-slice" */
  String get borderImageSlice =>
    getPropertyValue('border-image-slice');

  /** Sets the value of "border-image-slice" */
  void set borderImageSlice(String value) {
    setProperty('border-image-slice', value, '');
  }

  /** Gets the value of "border-image-source" */
  String get borderImageSource =>
    getPropertyValue('border-image-source');

  /** Sets the value of "border-image-source" */
  void set borderImageSource(String value) {
    setProperty('border-image-source', value, '');
  }

  /** Gets the value of "border-image-width" */
  String get borderImageWidth =>
    getPropertyValue('border-image-width');

  /** Sets the value of "border-image-width" */
  void set borderImageWidth(String value) {
    setProperty('border-image-width', value, '');
  }

  /** Gets the value of "border-left" */
  String get borderLeft =>
    getPropertyValue('border-left');

  /** Sets the value of "border-left" */
  void set borderLeft(String value) {
    setProperty('border-left', value, '');
  }

  /** Gets the value of "border-left-color" */
  String get borderLeftColor =>
    getPropertyValue('border-left-color');

  /** Sets the value of "border-left-color" */
  void set borderLeftColor(String value) {
    setProperty('border-left-color', value, '');
  }

  /** Gets the value of "border-left-style" */
  String get borderLeftStyle =>
    getPropertyValue('border-left-style');

  /** Sets the value of "border-left-style" */
  void set borderLeftStyle(String value) {
    setProperty('border-left-style', value, '');
  }

  /** Gets the value of "border-left-width" */
  String get borderLeftWidth =>
    getPropertyValue('border-left-width');

  /** Sets the value of "border-left-width" */
  void set borderLeftWidth(String value) {
    setProperty('border-left-width', value, '');
  }

  /** Gets the value of "border-radius" */
  String get borderRadius =>
    getPropertyValue('border-radius');

  /** Sets the value of "border-radius" */
  void set borderRadius(String value) {
    setProperty('border-radius', value, '');
  }

  /** Gets the value of "border-right" */
  String get borderRight =>
    getPropertyValue('border-right');

  /** Sets the value of "border-right" */
  void set borderRight(String value) {
    setProperty('border-right', value, '');
  }

  /** Gets the value of "border-right-color" */
  String get borderRightColor =>
    getPropertyValue('border-right-color');

  /** Sets the value of "border-right-color" */
  void set borderRightColor(String value) {
    setProperty('border-right-color', value, '');
  }

  /** Gets the value of "border-right-style" */
  String get borderRightStyle =>
    getPropertyValue('border-right-style');

  /** Sets the value of "border-right-style" */
  void set borderRightStyle(String value) {
    setProperty('border-right-style', value, '');
  }

  /** Gets the value of "border-right-width" */
  String get borderRightWidth =>
    getPropertyValue('border-right-width');

  /** Sets the value of "border-right-width" */
  void set borderRightWidth(String value) {
    setProperty('border-right-width', value, '');
  }

  /** Gets the value of "border-spacing" */
  String get borderSpacing =>
    getPropertyValue('border-spacing');

  /** Sets the value of "border-spacing" */
  void set borderSpacing(String value) {
    setProperty('border-spacing', value, '');
  }

  /** Gets the value of "border-start" */
  String get borderStart =>
    getPropertyValue('${_browserPrefix}border-start');

  /** Sets the value of "border-start" */
  void set borderStart(String value) {
    setProperty('${_browserPrefix}border-start', value, '');
  }

  /** Gets the value of "border-start-color" */
  String get borderStartColor =>
    getPropertyValue('${_browserPrefix}border-start-color');

  /** Sets the value of "border-start-color" */
  void set borderStartColor(String value) {
    setProperty('${_browserPrefix}border-start-color', value, '');
  }

  /** Gets the value of "border-start-style" */
  String get borderStartStyle =>
    getPropertyValue('${_browserPrefix}border-start-style');

  /** Sets the value of "border-start-style" */
  void set borderStartStyle(String value) {
    setProperty('${_browserPrefix}border-start-style', value, '');
  }

  /** Gets the value of "border-start-width" */
  String get borderStartWidth =>
    getPropertyValue('${_browserPrefix}border-start-width');

  /** Sets the value of "border-start-width" */
  void set borderStartWidth(String value) {
    setProperty('${_browserPrefix}border-start-width', value, '');
  }

  /** Gets the value of "border-style" */
  String get borderStyle =>
    getPropertyValue('border-style');

  /** Sets the value of "border-style" */
  void set borderStyle(String value) {
    setProperty('border-style', value, '');
  }

  /** Gets the value of "border-top" */
  String get borderTop =>
    getPropertyValue('border-top');

  /** Sets the value of "border-top" */
  void set borderTop(String value) {
    setProperty('border-top', value, '');
  }

  /** Gets the value of "border-top-color" */
  String get borderTopColor =>
    getPropertyValue('border-top-color');

  /** Sets the value of "border-top-color" */
  void set borderTopColor(String value) {
    setProperty('border-top-color', value, '');
  }

  /** Gets the value of "border-top-left-radius" */
  String get borderTopLeftRadius =>
    getPropertyValue('border-top-left-radius');

  /** Sets the value of "border-top-left-radius" */
  void set borderTopLeftRadius(String value) {
    setProperty('border-top-left-radius', value, '');
  }

  /** Gets the value of "border-top-right-radius" */
  String get borderTopRightRadius =>
    getPropertyValue('border-top-right-radius');

  /** Sets the value of "border-top-right-radius" */
  void set borderTopRightRadius(String value) {
    setProperty('border-top-right-radius', value, '');
  }

  /** Gets the value of "border-top-style" */
  String get borderTopStyle =>
    getPropertyValue('border-top-style');

  /** Sets the value of "border-top-style" */
  void set borderTopStyle(String value) {
    setProperty('border-top-style', value, '');
  }

  /** Gets the value of "border-top-width" */
  String get borderTopWidth =>
    getPropertyValue('border-top-width');

  /** Sets the value of "border-top-width" */
  void set borderTopWidth(String value) {
    setProperty('border-top-width', value, '');
  }

  /** Gets the value of "border-vertical-spacing" */
  String get borderVerticalSpacing =>
    getPropertyValue('${_browserPrefix}border-vertical-spacing');

  /** Sets the value of "border-vertical-spacing" */
  void set borderVerticalSpacing(String value) {
    setProperty('${_browserPrefix}border-vertical-spacing', value, '');
  }

  /** Gets the value of "border-width" */
  String get borderWidth =>
    getPropertyValue('border-width');

  /** Sets the value of "border-width" */
  void set borderWidth(String value) {
    setProperty('border-width', value, '');
  }

  /** Gets the value of "bottom" */
  String get bottom =>
    getPropertyValue('bottom');

  /** Sets the value of "bottom" */
  void set bottom(String value) {
    setProperty('bottom', value, '');
  }

  /** Gets the value of "box-align" */
  String get boxAlign =>
    getPropertyValue('${_browserPrefix}box-align');

  /** Sets the value of "box-align" */
  void set boxAlign(String value) {
    setProperty('${_browserPrefix}box-align', value, '');
  }

  /** Gets the value of "box-decoration-break" */
  String get boxDecorationBreak =>
    getPropertyValue('${_browserPrefix}box-decoration-break');

  /** Sets the value of "box-decoration-break" */
  void set boxDecorationBreak(String value) {
    setProperty('${_browserPrefix}box-decoration-break', value, '');
  }

  /** Gets the value of "box-direction" */
  String get boxDirection =>
    getPropertyValue('${_browserPrefix}box-direction');

  /** Sets the value of "box-direction" */
  void set boxDirection(String value) {
    setProperty('${_browserPrefix}box-direction', value, '');
  }

  /** Gets the value of "box-flex" */
  String get boxFlex =>
    getPropertyValue('${_browserPrefix}box-flex');

  /** Sets the value of "box-flex" */
  void set boxFlex(String value) {
    setProperty('${_browserPrefix}box-flex', value, '');
  }

  /** Gets the value of "box-flex-group" */
  String get boxFlexGroup =>
    getPropertyValue('${_browserPrefix}box-flex-group');

  /** Sets the value of "box-flex-group" */
  void set boxFlexGroup(String value) {
    setProperty('${_browserPrefix}box-flex-group', value, '');
  }

  /** Gets the value of "box-lines" */
  String get boxLines =>
    getPropertyValue('${_browserPrefix}box-lines');

  /** Sets the value of "box-lines" */
  void set boxLines(String value) {
    setProperty('${_browserPrefix}box-lines', value, '');
  }

  /** Gets the value of "box-ordinal-group" */
  String get boxOrdinalGroup =>
    getPropertyValue('${_browserPrefix}box-ordinal-group');

  /** Sets the value of "box-ordinal-group" */
  void set boxOrdinalGroup(String value) {
    setProperty('${_browserPrefix}box-ordinal-group', value, '');
  }

  /** Gets the value of "box-orient" */
  String get boxOrient =>
    getPropertyValue('${_browserPrefix}box-orient');

  /** Sets the value of "box-orient" */
  void set boxOrient(String value) {
    setProperty('${_browserPrefix}box-orient', value, '');
  }

  /** Gets the value of "box-pack" */
  String get boxPack =>
    getPropertyValue('${_browserPrefix}box-pack');

  /** Sets the value of "box-pack" */
  void set boxPack(String value) {
    setProperty('${_browserPrefix}box-pack', value, '');
  }

  /** Gets the value of "box-reflect" */
  String get boxReflect =>
    getPropertyValue('${_browserPrefix}box-reflect');

  /** Sets the value of "box-reflect" */
  void set boxReflect(String value) {
    setProperty('${_browserPrefix}box-reflect', value, '');
  }

  /** Gets the value of "box-shadow" */
  String get boxShadow =>
    getPropertyValue('box-shadow');

  /** Sets the value of "box-shadow" */
  void set boxShadow(String value) {
    setProperty('box-shadow', value, '');
  }

  /** Gets the value of "box-sizing" */
  String get boxSizing =>
    getPropertyValue('box-sizing');

  /** Sets the value of "box-sizing" */
  void set boxSizing(String value) {
    setProperty('box-sizing', value, '');
  }

  /** Gets the value of "caption-side" */
  String get captionSide =>
    getPropertyValue('caption-side');

  /** Sets the value of "caption-side" */
  void set captionSide(String value) {
    setProperty('caption-side', value, '');
  }

  /** Gets the value of "clear" */
  String get clear =>
    getPropertyValue('clear');

  /** Sets the value of "clear" */
  void set clear(String value) {
    setProperty('clear', value, '');
  }

  /** Gets the value of "clip" */
  String get clip =>
    getPropertyValue('clip');

  /** Sets the value of "clip" */
  void set clip(String value) {
    setProperty('clip', value, '');
  }

  /** Gets the value of "clip-path" */
  String get clipPath =>
    getPropertyValue('${_browserPrefix}clip-path');

  /** Sets the value of "clip-path" */
  void set clipPath(String value) {
    setProperty('${_browserPrefix}clip-path', value, '');
  }

  /** Gets the value of "color" */
  String get color =>
    getPropertyValue('color');

  /** Sets the value of "color" */
  void set color(String value) {
    setProperty('color', value, '');
  }

  /** Gets the value of "color-correction" */
  String get colorCorrection =>
    getPropertyValue('${_browserPrefix}color-correction');

  /** Sets the value of "color-correction" */
  void set colorCorrection(String value) {
    setProperty('${_browserPrefix}color-correction', value, '');
  }

  /** Gets the value of "column-axis" */
  String get columnAxis =>
    getPropertyValue('${_browserPrefix}column-axis');

  /** Sets the value of "column-axis" */
  void set columnAxis(String value) {
    setProperty('${_browserPrefix}column-axis', value, '');
  }

  /** Gets the value of "column-break-after" */
  String get columnBreakAfter =>
    getPropertyValue('${_browserPrefix}column-break-after');

  /** Sets the value of "column-break-after" */
  void set columnBreakAfter(String value) {
    setProperty('${_browserPrefix}column-break-after', value, '');
  }

  /** Gets the value of "column-break-before" */
  String get columnBreakBefore =>
    getPropertyValue('${_browserPrefix}column-break-before');

  /** Sets the value of "column-break-before" */
  void set columnBreakBefore(String value) {
    setProperty('${_browserPrefix}column-break-before', value, '');
  }

  /** Gets the value of "column-break-inside" */
  String get columnBreakInside =>
    getPropertyValue('${_browserPrefix}column-break-inside');

  /** Sets the value of "column-break-inside" */
  void set columnBreakInside(String value) {
    setProperty('${_browserPrefix}column-break-inside', value, '');
  }

  /** Gets the value of "column-count" */
  String get columnCount =>
    getPropertyValue('${_browserPrefix}column-count');

  /** Sets the value of "column-count" */
  void set columnCount(String value) {
    setProperty('${_browserPrefix}column-count', value, '');
  }

  /** Gets the value of "column-gap" */
  String get columnGap =>
    getPropertyValue('${_browserPrefix}column-gap');

  /** Sets the value of "column-gap" */
  void set columnGap(String value) {
    setProperty('${_browserPrefix}column-gap', value, '');
  }

  /** Gets the value of "column-progression" */
  String get columnProgression =>
    getPropertyValue('${_browserPrefix}column-progression');

  /** Sets the value of "column-progression" */
  void set columnProgression(String value) {
    setProperty('${_browserPrefix}column-progression', value, '');
  }

  /** Gets the value of "column-rule" */
  String get columnRule =>
    getPropertyValue('${_browserPrefix}column-rule');

  /** Sets the value of "column-rule" */
  void set columnRule(String value) {
    setProperty('${_browserPrefix}column-rule', value, '');
  }

  /** Gets the value of "column-rule-color" */
  String get columnRuleColor =>
    getPropertyValue('${_browserPrefix}column-rule-color');

  /** Sets the value of "column-rule-color" */
  void set columnRuleColor(String value) {
    setProperty('${_browserPrefix}column-rule-color', value, '');
  }

  /** Gets the value of "column-rule-style" */
  String get columnRuleStyle =>
    getPropertyValue('${_browserPrefix}column-rule-style');

  /** Sets the value of "column-rule-style" */
  void set columnRuleStyle(String value) {
    setProperty('${_browserPrefix}column-rule-style', value, '');
  }

  /** Gets the value of "column-rule-width" */
  String get columnRuleWidth =>
    getPropertyValue('${_browserPrefix}column-rule-width');

  /** Sets the value of "column-rule-width" */
  void set columnRuleWidth(String value) {
    setProperty('${_browserPrefix}column-rule-width', value, '');
  }

  /** Gets the value of "column-span" */
  String get columnSpan =>
    getPropertyValue('${_browserPrefix}column-span');

  /** Sets the value of "column-span" */
  void set columnSpan(String value) {
    setProperty('${_browserPrefix}column-span', value, '');
  }

  /** Gets the value of "column-width" */
  String get columnWidth =>
    getPropertyValue('${_browserPrefix}column-width');

  /** Sets the value of "column-width" */
  void set columnWidth(String value) {
    setProperty('${_browserPrefix}column-width', value, '');
  }

  /** Gets the value of "columns" */
  String get columns =>
    getPropertyValue('${_browserPrefix}columns');

  /** Sets the value of "columns" */
  void set columns(String value) {
    setProperty('${_browserPrefix}columns', value, '');
  }

  /** Gets the value of "content" */
  String get content =>
    getPropertyValue('content');

  /** Sets the value of "content" */
  void set content(String value) {
    setProperty('content', value, '');
  }

  /** Gets the value of "counter-increment" */
  String get counterIncrement =>
    getPropertyValue('counter-increment');

  /** Sets the value of "counter-increment" */
  void set counterIncrement(String value) {
    setProperty('counter-increment', value, '');
  }

  /** Gets the value of "counter-reset" */
  String get counterReset =>
    getPropertyValue('counter-reset');

  /** Sets the value of "counter-reset" */
  void set counterReset(String value) {
    setProperty('counter-reset', value, '');
  }

  /** Gets the value of "cursor" */
  String get cursor =>
    getPropertyValue('cursor');

  /** Sets the value of "cursor" */
  void set cursor(String value) {
    setProperty('cursor', value, '');
  }

  /** Gets the value of "dashboard-region" */
  String get dashboardRegion =>
    getPropertyValue('${_browserPrefix}dashboard-region');

  /** Sets the value of "dashboard-region" */
  void set dashboardRegion(String value) {
    setProperty('${_browserPrefix}dashboard-region', value, '');
  }

  /** Gets the value of "direction" */
  String get direction =>
    getPropertyValue('direction');

  /** Sets the value of "direction" */
  void set direction(String value) {
    setProperty('direction', value, '');
  }

  /** Gets the value of "display" */
  String get display =>
    getPropertyValue('display');

  /** Sets the value of "display" */
  void set display(String value) {
    setProperty('display', value, '');
  }

  /** Gets the value of "empty-cells" */
  String get emptyCells =>
    getPropertyValue('empty-cells');

  /** Sets the value of "empty-cells" */
  void set emptyCells(String value) {
    setProperty('empty-cells', value, '');
  }

  /** Gets the value of "filter" */
  String get filter =>
    getPropertyValue('${_browserPrefix}filter');

  /** Sets the value of "filter" */
  void set filter(String value) {
    setProperty('${_browserPrefix}filter', value, '');
  }

  /** Gets the value of "flex" */
  String get flex =>
    getPropertyValue('${_browserPrefix}flex');

  /** Sets the value of "flex" */
  void set flex(String value) {
    setProperty('${_browserPrefix}flex', value, '');
  }

  /** Gets the value of "flex-basis" */
  String get flexBasis =>
    getPropertyValue('${_browserPrefix}flex-basis');

  /** Sets the value of "flex-basis" */
  void set flexBasis(String value) {
    setProperty('${_browserPrefix}flex-basis', value, '');
  }

  /** Gets the value of "flex-direction" */
  String get flexDirection =>
    getPropertyValue('${_browserPrefix}flex-direction');

  /** Sets the value of "flex-direction" */
  void set flexDirection(String value) {
    setProperty('${_browserPrefix}flex-direction', value, '');
  }

  /** Gets the value of "flex-flow" */
  String get flexFlow =>
    getPropertyValue('${_browserPrefix}flex-flow');

  /** Sets the value of "flex-flow" */
  void set flexFlow(String value) {
    setProperty('${_browserPrefix}flex-flow', value, '');
  }

  /** Gets the value of "flex-grow" */
  String get flexGrow =>
    getPropertyValue('${_browserPrefix}flex-grow');

  /** Sets the value of "flex-grow" */
  void set flexGrow(String value) {
    setProperty('${_browserPrefix}flex-grow', value, '');
  }

  /** Gets the value of "flex-shrink" */
  String get flexShrink =>
    getPropertyValue('${_browserPrefix}flex-shrink');

  /** Sets the value of "flex-shrink" */
  void set flexShrink(String value) {
    setProperty('${_browserPrefix}flex-shrink', value, '');
  }

  /** Gets the value of "flex-wrap" */
  String get flexWrap =>
    getPropertyValue('${_browserPrefix}flex-wrap');

  /** Sets the value of "flex-wrap" */
  void set flexWrap(String value) {
    setProperty('${_browserPrefix}flex-wrap', value, '');
  }

  /** Gets the value of "float" */
  String get float =>
    getPropertyValue('float');

  /** Sets the value of "float" */
  void set float(String value) {
    setProperty('float', value, '');
  }

  /** Gets the value of "flow-from" */
  String get flowFrom =>
    getPropertyValue('${_browserPrefix}flow-from');

  /** Sets the value of "flow-from" */
  void set flowFrom(String value) {
    setProperty('${_browserPrefix}flow-from', value, '');
  }

  /** Gets the value of "flow-into" */
  String get flowInto =>
    getPropertyValue('${_browserPrefix}flow-into');

  /** Sets the value of "flow-into" */
  void set flowInto(String value) {
    setProperty('${_browserPrefix}flow-into', value, '');
  }

  /** Gets the value of "font" */
  String get font =>
    getPropertyValue('font');

  /** Sets the value of "font" */
  void set font(String value) {
    setProperty('font', value, '');
  }

  /** Gets the value of "font-family" */
  String get fontFamily =>
    getPropertyValue('font-family');

  /** Sets the value of "font-family" */
  void set fontFamily(String value) {
    setProperty('font-family', value, '');
  }

  /** Gets the value of "font-feature-settings" */
  String get fontFeatureSettings =>
    getPropertyValue('${_browserPrefix}font-feature-settings');

  /** Sets the value of "font-feature-settings" */
  void set fontFeatureSettings(String value) {
    setProperty('${_browserPrefix}font-feature-settings', value, '');
  }

  /** Gets the value of "font-kerning" */
  String get fontKerning =>
    getPropertyValue('${_browserPrefix}font-kerning');

  /** Sets the value of "font-kerning" */
  void set fontKerning(String value) {
    setProperty('${_browserPrefix}font-kerning', value, '');
  }

  /** Gets the value of "font-size" */
  String get fontSize =>
    getPropertyValue('font-size');

  /** Sets the value of "font-size" */
  void set fontSize(String value) {
    setProperty('font-size', value, '');
  }

  /** Gets the value of "font-size-delta" */
  String get fontSizeDelta =>
    getPropertyValue('${_browserPrefix}font-size-delta');

  /** Sets the value of "font-size-delta" */
  void set fontSizeDelta(String value) {
    setProperty('${_browserPrefix}font-size-delta', value, '');
  }

  /** Gets the value of "font-smoothing" */
  String get fontSmoothing =>
    getPropertyValue('${_browserPrefix}font-smoothing');

  /** Sets the value of "font-smoothing" */
  void set fontSmoothing(String value) {
    setProperty('${_browserPrefix}font-smoothing', value, '');
  }

  /** Gets the value of "font-stretch" */
  String get fontStretch =>
    getPropertyValue('font-stretch');

  /** Sets the value of "font-stretch" */
  void set fontStretch(String value) {
    setProperty('font-stretch', value, '');
  }

  /** Gets the value of "font-style" */
  String get fontStyle =>
    getPropertyValue('font-style');

  /** Sets the value of "font-style" */
  void set fontStyle(String value) {
    setProperty('font-style', value, '');
  }

  /** Gets the value of "font-variant" */
  String get fontVariant =>
    getPropertyValue('font-variant');

  /** Sets the value of "font-variant" */
  void set fontVariant(String value) {
    setProperty('font-variant', value, '');
  }

  /** Gets the value of "font-variant-ligatures" */
  String get fontVariantLigatures =>
    getPropertyValue('${_browserPrefix}font-variant-ligatures');

  /** Sets the value of "font-variant-ligatures" */
  void set fontVariantLigatures(String value) {
    setProperty('${_browserPrefix}font-variant-ligatures', value, '');
  }

  /** Gets the value of "font-weight" */
  String get fontWeight =>
    getPropertyValue('font-weight');

  /** Sets the value of "font-weight" */
  void set fontWeight(String value) {
    setProperty('font-weight', value, '');
  }

  /** Gets the value of "grid-column" */
  String get gridColumn =>
    getPropertyValue('${_browserPrefix}grid-column');

  /** Sets the value of "grid-column" */
  void set gridColumn(String value) {
    setProperty('${_browserPrefix}grid-column', value, '');
  }

  /** Gets the value of "grid-columns" */
  String get gridColumns =>
    getPropertyValue('${_browserPrefix}grid-columns');

  /** Sets the value of "grid-columns" */
  void set gridColumns(String value) {
    setProperty('${_browserPrefix}grid-columns', value, '');
  }

  /** Gets the value of "grid-row" */
  String get gridRow =>
    getPropertyValue('${_browserPrefix}grid-row');

  /** Sets the value of "grid-row" */
  void set gridRow(String value) {
    setProperty('${_browserPrefix}grid-row', value, '');
  }

  /** Gets the value of "grid-rows" */
  String get gridRows =>
    getPropertyValue('${_browserPrefix}grid-rows');

  /** Sets the value of "grid-rows" */
  void set gridRows(String value) {
    setProperty('${_browserPrefix}grid-rows', value, '');
  }

  /** Gets the value of "height" */
  String get height =>
    getPropertyValue('height');

  /** Sets the value of "height" */
  void set height(String value) {
    setProperty('height', value, '');
  }

  /** Gets the value of "highlight" */
  String get highlight =>
    getPropertyValue('${_browserPrefix}highlight');

  /** Sets the value of "highlight" */
  void set highlight(String value) {
    setProperty('${_browserPrefix}highlight', value, '');
  }

  /** Gets the value of "hyphenate-character" */
  String get hyphenateCharacter =>
    getPropertyValue('${_browserPrefix}hyphenate-character');

  /** Sets the value of "hyphenate-character" */
  void set hyphenateCharacter(String value) {
    setProperty('${_browserPrefix}hyphenate-character', value, '');
  }

  /** Gets the value of "hyphenate-limit-after" */
  String get hyphenateLimitAfter =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-after');

  /** Sets the value of "hyphenate-limit-after" */
  void set hyphenateLimitAfter(String value) {
    setProperty('${_browserPrefix}hyphenate-limit-after', value, '');
  }

  /** Gets the value of "hyphenate-limit-before" */
  String get hyphenateLimitBefore =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-before');

  /** Sets the value of "hyphenate-limit-before" */
  void set hyphenateLimitBefore(String value) {
    setProperty('${_browserPrefix}hyphenate-limit-before', value, '');
  }

  /** Gets the value of "hyphenate-limit-lines" */
  String get hyphenateLimitLines =>
    getPropertyValue('${_browserPrefix}hyphenate-limit-lines');

  /** Sets the value of "hyphenate-limit-lines" */
  void set hyphenateLimitLines(String value) {
    setProperty('${_browserPrefix}hyphenate-limit-lines', value, '');
  }

  /** Gets the value of "hyphens" */
  String get hyphens =>
    getPropertyValue('${_browserPrefix}hyphens');

  /** Sets the value of "hyphens" */
  void set hyphens(String value) {
    setProperty('${_browserPrefix}hyphens', value, '');
  }

  /** Gets the value of "image-orientation" */
  String get imageOrientation =>
    getPropertyValue('image-orientation');

  /** Sets the value of "image-orientation" */
  void set imageOrientation(String value) {
    setProperty('image-orientation', value, '');
  }

  /** Gets the value of "image-rendering" */
  String get imageRendering =>
    getPropertyValue('image-rendering');

  /** Sets the value of "image-rendering" */
  void set imageRendering(String value) {
    setProperty('image-rendering', value, '');
  }

  /** Gets the value of "image-resolution" */
  String get imageResolution =>
    getPropertyValue('image-resolution');

  /** Sets the value of "image-resolution" */
  void set imageResolution(String value) {
    setProperty('image-resolution', value, '');
  }

  /** Gets the value of "justify-content" */
  String get justifyContent =>
    getPropertyValue('${_browserPrefix}justify-content');

  /** Sets the value of "justify-content" */
  void set justifyContent(String value) {
    setProperty('${_browserPrefix}justify-content', value, '');
  }

  /** Gets the value of "left" */
  String get left =>
    getPropertyValue('left');

  /** Sets the value of "left" */
  void set left(String value) {
    setProperty('left', value, '');
  }

  /** Gets the value of "letter-spacing" */
  String get letterSpacing =>
    getPropertyValue('letter-spacing');

  /** Sets the value of "letter-spacing" */
  void set letterSpacing(String value) {
    setProperty('letter-spacing', value, '');
  }

  /** Gets the value of "line-align" */
  String get lineAlign =>
    getPropertyValue('${_browserPrefix}line-align');

  /** Sets the value of "line-align" */
  void set lineAlign(String value) {
    setProperty('${_browserPrefix}line-align', value, '');
  }

  /** Gets the value of "line-box-contain" */
  String get lineBoxContain =>
    getPropertyValue('${_browserPrefix}line-box-contain');

  /** Sets the value of "line-box-contain" */
  void set lineBoxContain(String value) {
    setProperty('${_browserPrefix}line-box-contain', value, '');
  }

  /** Gets the value of "line-break" */
  String get lineBreak =>
    getPropertyValue('${_browserPrefix}line-break');

  /** Sets the value of "line-break" */
  void set lineBreak(String value) {
    setProperty('${_browserPrefix}line-break', value, '');
  }

  /** Gets the value of "line-clamp" */
  String get lineClamp =>
    getPropertyValue('${_browserPrefix}line-clamp');

  /** Sets the value of "line-clamp" */
  void set lineClamp(String value) {
    setProperty('${_browserPrefix}line-clamp', value, '');
  }

  /** Gets the value of "line-grid" */
  String get lineGrid =>
    getPropertyValue('${_browserPrefix}line-grid');

  /** Sets the value of "line-grid" */
  void set lineGrid(String value) {
    setProperty('${_browserPrefix}line-grid', value, '');
  }

  /** Gets the value of "line-height" */
  String get lineHeight =>
    getPropertyValue('line-height');

  /** Sets the value of "line-height" */
  void set lineHeight(String value) {
    setProperty('line-height', value, '');
  }

  /** Gets the value of "line-snap" */
  String get lineSnap =>
    getPropertyValue('${_browserPrefix}line-snap');

  /** Sets the value of "line-snap" */
  void set lineSnap(String value) {
    setProperty('${_browserPrefix}line-snap', value, '');
  }

  /** Gets the value of "list-style" */
  String get listStyle =>
    getPropertyValue('list-style');

  /** Sets the value of "list-style" */
  void set listStyle(String value) {
    setProperty('list-style', value, '');
  }

  /** Gets the value of "list-style-image" */
  String get listStyleImage =>
    getPropertyValue('list-style-image');

  /** Sets the value of "list-style-image" */
  void set listStyleImage(String value) {
    setProperty('list-style-image', value, '');
  }

  /** Gets the value of "list-style-position" */
  String get listStylePosition =>
    getPropertyValue('list-style-position');

  /** Sets the value of "list-style-position" */
  void set listStylePosition(String value) {
    setProperty('list-style-position', value, '');
  }

  /** Gets the value of "list-style-type" */
  String get listStyleType =>
    getPropertyValue('list-style-type');

  /** Sets the value of "list-style-type" */
  void set listStyleType(String value) {
    setProperty('list-style-type', value, '');
  }

  /** Gets the value of "locale" */
  String get locale =>
    getPropertyValue('${_browserPrefix}locale');

  /** Sets the value of "locale" */
  void set locale(String value) {
    setProperty('${_browserPrefix}locale', value, '');
  }

  /** Gets the value of "logical-height" */
  String get logicalHeight =>
    getPropertyValue('${_browserPrefix}logical-height');

  /** Sets the value of "logical-height" */
  void set logicalHeight(String value) {
    setProperty('${_browserPrefix}logical-height', value, '');
  }

  /** Gets the value of "logical-width" */
  String get logicalWidth =>
    getPropertyValue('${_browserPrefix}logical-width');

  /** Sets the value of "logical-width" */
  void set logicalWidth(String value) {
    setProperty('${_browserPrefix}logical-width', value, '');
  }

  /** Gets the value of "margin" */
  String get margin =>
    getPropertyValue('margin');

  /** Sets the value of "margin" */
  void set margin(String value) {
    setProperty('margin', value, '');
  }

  /** Gets the value of "margin-after" */
  String get marginAfter =>
    getPropertyValue('${_browserPrefix}margin-after');

  /** Sets the value of "margin-after" */
  void set marginAfter(String value) {
    setProperty('${_browserPrefix}margin-after', value, '');
  }

  /** Gets the value of "margin-after-collapse" */
  String get marginAfterCollapse =>
    getPropertyValue('${_browserPrefix}margin-after-collapse');

  /** Sets the value of "margin-after-collapse" */
  void set marginAfterCollapse(String value) {
    setProperty('${_browserPrefix}margin-after-collapse', value, '');
  }

  /** Gets the value of "margin-before" */
  String get marginBefore =>
    getPropertyValue('${_browserPrefix}margin-before');

  /** Sets the value of "margin-before" */
  void set marginBefore(String value) {
    setProperty('${_browserPrefix}margin-before', value, '');
  }

  /** Gets the value of "margin-before-collapse" */
  String get marginBeforeCollapse =>
    getPropertyValue('${_browserPrefix}margin-before-collapse');

  /** Sets the value of "margin-before-collapse" */
  void set marginBeforeCollapse(String value) {
    setProperty('${_browserPrefix}margin-before-collapse', value, '');
  }

  /** Gets the value of "margin-bottom" */
  String get marginBottom =>
    getPropertyValue('margin-bottom');

  /** Sets the value of "margin-bottom" */
  void set marginBottom(String value) {
    setProperty('margin-bottom', value, '');
  }

  /** Gets the value of "margin-bottom-collapse" */
  String get marginBottomCollapse =>
    getPropertyValue('${_browserPrefix}margin-bottom-collapse');

  /** Sets the value of "margin-bottom-collapse" */
  void set marginBottomCollapse(String value) {
    setProperty('${_browserPrefix}margin-bottom-collapse', value, '');
  }

  /** Gets the value of "margin-collapse" */
  String get marginCollapse =>
    getPropertyValue('${_browserPrefix}margin-collapse');

  /** Sets the value of "margin-collapse" */
  void set marginCollapse(String value) {
    setProperty('${_browserPrefix}margin-collapse', value, '');
  }

  /** Gets the value of "margin-end" */
  String get marginEnd =>
    getPropertyValue('${_browserPrefix}margin-end');

  /** Sets the value of "margin-end" */
  void set marginEnd(String value) {
    setProperty('${_browserPrefix}margin-end', value, '');
  }

  /** Gets the value of "margin-left" */
  String get marginLeft =>
    getPropertyValue('margin-left');

  /** Sets the value of "margin-left" */
  void set marginLeft(String value) {
    setProperty('margin-left', value, '');
  }

  /** Gets the value of "margin-right" */
  String get marginRight =>
    getPropertyValue('margin-right');

  /** Sets the value of "margin-right" */
  void set marginRight(String value) {
    setProperty('margin-right', value, '');
  }

  /** Gets the value of "margin-start" */
  String get marginStart =>
    getPropertyValue('${_browserPrefix}margin-start');

  /** Sets the value of "margin-start" */
  void set marginStart(String value) {
    setProperty('${_browserPrefix}margin-start', value, '');
  }

  /** Gets the value of "margin-top" */
  String get marginTop =>
    getPropertyValue('margin-top');

  /** Sets the value of "margin-top" */
  void set marginTop(String value) {
    setProperty('margin-top', value, '');
  }

  /** Gets the value of "margin-top-collapse" */
  String get marginTopCollapse =>
    getPropertyValue('${_browserPrefix}margin-top-collapse');

  /** Sets the value of "margin-top-collapse" */
  void set marginTopCollapse(String value) {
    setProperty('${_browserPrefix}margin-top-collapse', value, '');
  }

  /** Gets the value of "marquee" */
  String get marquee =>
    getPropertyValue('${_browserPrefix}marquee');

  /** Sets the value of "marquee" */
  void set marquee(String value) {
    setProperty('${_browserPrefix}marquee', value, '');
  }

  /** Gets the value of "marquee-direction" */
  String get marqueeDirection =>
    getPropertyValue('${_browserPrefix}marquee-direction');

  /** Sets the value of "marquee-direction" */
  void set marqueeDirection(String value) {
    setProperty('${_browserPrefix}marquee-direction', value, '');
  }

  /** Gets the value of "marquee-increment" */
  String get marqueeIncrement =>
    getPropertyValue('${_browserPrefix}marquee-increment');

  /** Sets the value of "marquee-increment" */
  void set marqueeIncrement(String value) {
    setProperty('${_browserPrefix}marquee-increment', value, '');
  }

  /** Gets the value of "marquee-repetition" */
  String get marqueeRepetition =>
    getPropertyValue('${_browserPrefix}marquee-repetition');

  /** Sets the value of "marquee-repetition" */
  void set marqueeRepetition(String value) {
    setProperty('${_browserPrefix}marquee-repetition', value, '');
  }

  /** Gets the value of "marquee-speed" */
  String get marqueeSpeed =>
    getPropertyValue('${_browserPrefix}marquee-speed');

  /** Sets the value of "marquee-speed" */
  void set marqueeSpeed(String value) {
    setProperty('${_browserPrefix}marquee-speed', value, '');
  }

  /** Gets the value of "marquee-style" */
  String get marqueeStyle =>
    getPropertyValue('${_browserPrefix}marquee-style');

  /** Sets the value of "marquee-style" */
  void set marqueeStyle(String value) {
    setProperty('${_browserPrefix}marquee-style', value, '');
  }

  /** Gets the value of "mask" */
  String get mask =>
    getPropertyValue('${_browserPrefix}mask');

  /** Sets the value of "mask" */
  void set mask(String value) {
    setProperty('${_browserPrefix}mask', value, '');
  }

  /** Gets the value of "mask-attachment" */
  String get maskAttachment =>
    getPropertyValue('${_browserPrefix}mask-attachment');

  /** Sets the value of "mask-attachment" */
  void set maskAttachment(String value) {
    setProperty('${_browserPrefix}mask-attachment', value, '');
  }

  /** Gets the value of "mask-box-image" */
  String get maskBoxImage =>
    getPropertyValue('${_browserPrefix}mask-box-image');

  /** Sets the value of "mask-box-image" */
  void set maskBoxImage(String value) {
    setProperty('${_browserPrefix}mask-box-image', value, '');
  }

  /** Gets the value of "mask-box-image-outset" */
  String get maskBoxImageOutset =>
    getPropertyValue('${_browserPrefix}mask-box-image-outset');

  /** Sets the value of "mask-box-image-outset" */
  void set maskBoxImageOutset(String value) {
    setProperty('${_browserPrefix}mask-box-image-outset', value, '');
  }

  /** Gets the value of "mask-box-image-repeat" */
  String get maskBoxImageRepeat =>
    getPropertyValue('${_browserPrefix}mask-box-image-repeat');

  /** Sets the value of "mask-box-image-repeat" */
  void set maskBoxImageRepeat(String value) {
    setProperty('${_browserPrefix}mask-box-image-repeat', value, '');
  }

  /** Gets the value of "mask-box-image-slice" */
  String get maskBoxImageSlice =>
    getPropertyValue('${_browserPrefix}mask-box-image-slice');

  /** Sets the value of "mask-box-image-slice" */
  void set maskBoxImageSlice(String value) {
    setProperty('${_browserPrefix}mask-box-image-slice', value, '');
  }

  /** Gets the value of "mask-box-image-source" */
  String get maskBoxImageSource =>
    getPropertyValue('${_browserPrefix}mask-box-image-source');

  /** Sets the value of "mask-box-image-source" */
  void set maskBoxImageSource(String value) {
    setProperty('${_browserPrefix}mask-box-image-source', value, '');
  }

  /** Gets the value of "mask-box-image-width" */
  String get maskBoxImageWidth =>
    getPropertyValue('${_browserPrefix}mask-box-image-width');

  /** Sets the value of "mask-box-image-width" */
  void set maskBoxImageWidth(String value) {
    setProperty('${_browserPrefix}mask-box-image-width', value, '');
  }

  /** Gets the value of "mask-clip" */
  String get maskClip =>
    getPropertyValue('${_browserPrefix}mask-clip');

  /** Sets the value of "mask-clip" */
  void set maskClip(String value) {
    setProperty('${_browserPrefix}mask-clip', value, '');
  }

  /** Gets the value of "mask-composite" */
  String get maskComposite =>
    getPropertyValue('${_browserPrefix}mask-composite');

  /** Sets the value of "mask-composite" */
  void set maskComposite(String value) {
    setProperty('${_browserPrefix}mask-composite', value, '');
  }

  /** Gets the value of "mask-image" */
  String get maskImage =>
    getPropertyValue('${_browserPrefix}mask-image');

  /** Sets the value of "mask-image" */
  void set maskImage(String value) {
    setProperty('${_browserPrefix}mask-image', value, '');
  }

  /** Gets the value of "mask-origin" */
  String get maskOrigin =>
    getPropertyValue('${_browserPrefix}mask-origin');

  /** Sets the value of "mask-origin" */
  void set maskOrigin(String value) {
    setProperty('${_browserPrefix}mask-origin', value, '');
  }

  /** Gets the value of "mask-position" */
  String get maskPosition =>
    getPropertyValue('${_browserPrefix}mask-position');

  /** Sets the value of "mask-position" */
  void set maskPosition(String value) {
    setProperty('${_browserPrefix}mask-position', value, '');
  }

  /** Gets the value of "mask-position-x" */
  String get maskPositionX =>
    getPropertyValue('${_browserPrefix}mask-position-x');

  /** Sets the value of "mask-position-x" */
  void set maskPositionX(String value) {
    setProperty('${_browserPrefix}mask-position-x', value, '');
  }

  /** Gets the value of "mask-position-y" */
  String get maskPositionY =>
    getPropertyValue('${_browserPrefix}mask-position-y');

  /** Sets the value of "mask-position-y" */
  void set maskPositionY(String value) {
    setProperty('${_browserPrefix}mask-position-y', value, '');
  }

  /** Gets the value of "mask-repeat" */
  String get maskRepeat =>
    getPropertyValue('${_browserPrefix}mask-repeat');

  /** Sets the value of "mask-repeat" */
  void set maskRepeat(String value) {
    setProperty('${_browserPrefix}mask-repeat', value, '');
  }

  /** Gets the value of "mask-repeat-x" */
  String get maskRepeatX =>
    getPropertyValue('${_browserPrefix}mask-repeat-x');

  /** Sets the value of "mask-repeat-x" */
  void set maskRepeatX(String value) {
    setProperty('${_browserPrefix}mask-repeat-x', value, '');
  }

  /** Gets the value of "mask-repeat-y" */
  String get maskRepeatY =>
    getPropertyValue('${_browserPrefix}mask-repeat-y');

  /** Sets the value of "mask-repeat-y" */
  void set maskRepeatY(String value) {
    setProperty('${_browserPrefix}mask-repeat-y', value, '');
  }

  /** Gets the value of "mask-size" */
  String get maskSize =>
    getPropertyValue('${_browserPrefix}mask-size');

  /** Sets the value of "mask-size" */
  void set maskSize(String value) {
    setProperty('${_browserPrefix}mask-size', value, '');
  }

  /** Gets the value of "max-height" */
  String get maxHeight =>
    getPropertyValue('max-height');

  /** Sets the value of "max-height" */
  void set maxHeight(String value) {
    setProperty('max-height', value, '');
  }

  /** Gets the value of "max-logical-height" */
  String get maxLogicalHeight =>
    getPropertyValue('${_browserPrefix}max-logical-height');

  /** Sets the value of "max-logical-height" */
  void set maxLogicalHeight(String value) {
    setProperty('${_browserPrefix}max-logical-height', value, '');
  }

  /** Gets the value of "max-logical-width" */
  String get maxLogicalWidth =>
    getPropertyValue('${_browserPrefix}max-logical-width');

  /** Sets the value of "max-logical-width" */
  void set maxLogicalWidth(String value) {
    setProperty('${_browserPrefix}max-logical-width', value, '');
  }

  /** Gets the value of "max-width" */
  String get maxWidth =>
    getPropertyValue('max-width');

  /** Sets the value of "max-width" */
  void set maxWidth(String value) {
    setProperty('max-width', value, '');
  }

  /** Gets the value of "max-zoom" */
  String get maxZoom =>
    getPropertyValue('max-zoom');

  /** Sets the value of "max-zoom" */
  void set maxZoom(String value) {
    setProperty('max-zoom', value, '');
  }

  /** Gets the value of "min-height" */
  String get minHeight =>
    getPropertyValue('min-height');

  /** Sets the value of "min-height" */
  void set minHeight(String value) {
    setProperty('min-height', value, '');
  }

  /** Gets the value of "min-logical-height" */
  String get minLogicalHeight =>
    getPropertyValue('${_browserPrefix}min-logical-height');

  /** Sets the value of "min-logical-height" */
  void set minLogicalHeight(String value) {
    setProperty('${_browserPrefix}min-logical-height', value, '');
  }

  /** Gets the value of "min-logical-width" */
  String get minLogicalWidth =>
    getPropertyValue('${_browserPrefix}min-logical-width');

  /** Sets the value of "min-logical-width" */
  void set minLogicalWidth(String value) {
    setProperty('${_browserPrefix}min-logical-width', value, '');
  }

  /** Gets the value of "min-width" */
  String get minWidth =>
    getPropertyValue('min-width');

  /** Sets the value of "min-width" */
  void set minWidth(String value) {
    setProperty('min-width', value, '');
  }

  /** Gets the value of "min-zoom" */
  String get minZoom =>
    getPropertyValue('min-zoom');

  /** Sets the value of "min-zoom" */
  void set minZoom(String value) {
    setProperty('min-zoom', value, '');
  }

  /** Gets the value of "nbsp-mode" */
  String get nbspMode =>
    getPropertyValue('${_browserPrefix}nbsp-mode');

  /** Sets the value of "nbsp-mode" */
  void set nbspMode(String value) {
    setProperty('${_browserPrefix}nbsp-mode', value, '');
  }

  /** Gets the value of "opacity" */
  String get opacity =>
    getPropertyValue('opacity');

  /** Sets the value of "opacity" */
  void set opacity(String value) {
    setProperty('opacity', value, '');
  }

  /** Gets the value of "order" */
  String get order =>
    getPropertyValue('${_browserPrefix}order');

  /** Sets the value of "order" */
  void set order(String value) {
    setProperty('${_browserPrefix}order', value, '');
  }

  /** Gets the value of "orientation" */
  String get orientation =>
    getPropertyValue('orientation');

  /** Sets the value of "orientation" */
  void set orientation(String value) {
    setProperty('orientation', value, '');
  }

  /** Gets the value of "orphans" */
  String get orphans =>
    getPropertyValue('orphans');

  /** Sets the value of "orphans" */
  void set orphans(String value) {
    setProperty('orphans', value, '');
  }

  /** Gets the value of "outline" */
  String get outline =>
    getPropertyValue('outline');

  /** Sets the value of "outline" */
  void set outline(String value) {
    setProperty('outline', value, '');
  }

  /** Gets the value of "outline-color" */
  String get outlineColor =>
    getPropertyValue('outline-color');

  /** Sets the value of "outline-color" */
  void set outlineColor(String value) {
    setProperty('outline-color', value, '');
  }

  /** Gets the value of "outline-offset" */
  String get outlineOffset =>
    getPropertyValue('outline-offset');

  /** Sets the value of "outline-offset" */
  void set outlineOffset(String value) {
    setProperty('outline-offset', value, '');
  }

  /** Gets the value of "outline-style" */
  String get outlineStyle =>
    getPropertyValue('outline-style');

  /** Sets the value of "outline-style" */
  void set outlineStyle(String value) {
    setProperty('outline-style', value, '');
  }

  /** Gets the value of "outline-width" */
  String get outlineWidth =>
    getPropertyValue('outline-width');

  /** Sets the value of "outline-width" */
  void set outlineWidth(String value) {
    setProperty('outline-width', value, '');
  }

  /** Gets the value of "overflow" */
  String get overflow =>
    getPropertyValue('overflow');

  /** Sets the value of "overflow" */
  void set overflow(String value) {
    setProperty('overflow', value, '');
  }

  /** Gets the value of "overflow-scrolling" */
  String get overflowScrolling =>
    getPropertyValue('${_browserPrefix}overflow-scrolling');

  /** Sets the value of "overflow-scrolling" */
  void set overflowScrolling(String value) {
    setProperty('${_browserPrefix}overflow-scrolling', value, '');
  }

  /** Gets the value of "overflow-wrap" */
  String get overflowWrap =>
    getPropertyValue('overflow-wrap');

  /** Sets the value of "overflow-wrap" */
  void set overflowWrap(String value) {
    setProperty('overflow-wrap', value, '');
  }

  /** Gets the value of "overflow-x" */
  String get overflowX =>
    getPropertyValue('overflow-x');

  /** Sets the value of "overflow-x" */
  void set overflowX(String value) {
    setProperty('overflow-x', value, '');
  }

  /** Gets the value of "overflow-y" */
  String get overflowY =>
    getPropertyValue('overflow-y');

  /** Sets the value of "overflow-y" */
  void set overflowY(String value) {
    setProperty('overflow-y', value, '');
  }

  /** Gets the value of "padding" */
  String get padding =>
    getPropertyValue('padding');

  /** Sets the value of "padding" */
  void set padding(String value) {
    setProperty('padding', value, '');
  }

  /** Gets the value of "padding-after" */
  String get paddingAfter =>
    getPropertyValue('${_browserPrefix}padding-after');

  /** Sets the value of "padding-after" */
  void set paddingAfter(String value) {
    setProperty('${_browserPrefix}padding-after', value, '');
  }

  /** Gets the value of "padding-before" */
  String get paddingBefore =>
    getPropertyValue('${_browserPrefix}padding-before');

  /** Sets the value of "padding-before" */
  void set paddingBefore(String value) {
    setProperty('${_browserPrefix}padding-before', value, '');
  }

  /** Gets the value of "padding-bottom" */
  String get paddingBottom =>
    getPropertyValue('padding-bottom');

  /** Sets the value of "padding-bottom" */
  void set paddingBottom(String value) {
    setProperty('padding-bottom', value, '');
  }

  /** Gets the value of "padding-end" */
  String get paddingEnd =>
    getPropertyValue('${_browserPrefix}padding-end');

  /** Sets the value of "padding-end" */
  void set paddingEnd(String value) {
    setProperty('${_browserPrefix}padding-end', value, '');
  }

  /** Gets the value of "padding-left" */
  String get paddingLeft =>
    getPropertyValue('padding-left');

  /** Sets the value of "padding-left" */
  void set paddingLeft(String value) {
    setProperty('padding-left', value, '');
  }

  /** Gets the value of "padding-right" */
  String get paddingRight =>
    getPropertyValue('padding-right');

  /** Sets the value of "padding-right" */
  void set paddingRight(String value) {
    setProperty('padding-right', value, '');
  }

  /** Gets the value of "padding-start" */
  String get paddingStart =>
    getPropertyValue('${_browserPrefix}padding-start');

  /** Sets the value of "padding-start" */
  void set paddingStart(String value) {
    setProperty('${_browserPrefix}padding-start', value, '');
  }

  /** Gets the value of "padding-top" */
  String get paddingTop =>
    getPropertyValue('padding-top');

  /** Sets the value of "padding-top" */
  void set paddingTop(String value) {
    setProperty('padding-top', value, '');
  }

  /** Gets the value of "page" */
  String get page =>
    getPropertyValue('page');

  /** Sets the value of "page" */
  void set page(String value) {
    setProperty('page', value, '');
  }

  /** Gets the value of "page-break-after" */
  String get pageBreakAfter =>
    getPropertyValue('page-break-after');

  /** Sets the value of "page-break-after" */
  void set pageBreakAfter(String value) {
    setProperty('page-break-after', value, '');
  }

  /** Gets the value of "page-break-before" */
  String get pageBreakBefore =>
    getPropertyValue('page-break-before');

  /** Sets the value of "page-break-before" */
  void set pageBreakBefore(String value) {
    setProperty('page-break-before', value, '');
  }

  /** Gets the value of "page-break-inside" */
  String get pageBreakInside =>
    getPropertyValue('page-break-inside');

  /** Sets the value of "page-break-inside" */
  void set pageBreakInside(String value) {
    setProperty('page-break-inside', value, '');
  }

  /** Gets the value of "perspective" */
  String get perspective =>
    getPropertyValue('${_browserPrefix}perspective');

  /** Sets the value of "perspective" */
  void set perspective(String value) {
    setProperty('${_browserPrefix}perspective', value, '');
  }

  /** Gets the value of "perspective-origin" */
  String get perspectiveOrigin =>
    getPropertyValue('${_browserPrefix}perspective-origin');

  /** Sets the value of "perspective-origin" */
  void set perspectiveOrigin(String value) {
    setProperty('${_browserPrefix}perspective-origin', value, '');
  }

  /** Gets the value of "perspective-origin-x" */
  String get perspectiveOriginX =>
    getPropertyValue('${_browserPrefix}perspective-origin-x');

  /** Sets the value of "perspective-origin-x" */
  void set perspectiveOriginX(String value) {
    setProperty('${_browserPrefix}perspective-origin-x', value, '');
  }

  /** Gets the value of "perspective-origin-y" */
  String get perspectiveOriginY =>
    getPropertyValue('${_browserPrefix}perspective-origin-y');

  /** Sets the value of "perspective-origin-y" */
  void set perspectiveOriginY(String value) {
    setProperty('${_browserPrefix}perspective-origin-y', value, '');
  }

  /** Gets the value of "pointer-events" */
  String get pointerEvents =>
    getPropertyValue('pointer-events');

  /** Sets the value of "pointer-events" */
  void set pointerEvents(String value) {
    setProperty('pointer-events', value, '');
  }

  /** Gets the value of "position" */
  String get position =>
    getPropertyValue('position');

  /** Sets the value of "position" */
  void set position(String value) {
    setProperty('position', value, '');
  }

  /** Gets the value of "print-color-adjust" */
  String get printColorAdjust =>
    getPropertyValue('${_browserPrefix}print-color-adjust');

  /** Sets the value of "print-color-adjust" */
  void set printColorAdjust(String value) {
    setProperty('${_browserPrefix}print-color-adjust', value, '');
  }

  /** Gets the value of "quotes" */
  String get quotes =>
    getPropertyValue('quotes');

  /** Sets the value of "quotes" */
  void set quotes(String value) {
    setProperty('quotes', value, '');
  }

  /** Gets the value of "region-break-after" */
  String get regionBreakAfter =>
    getPropertyValue('${_browserPrefix}region-break-after');

  /** Sets the value of "region-break-after" */
  void set regionBreakAfter(String value) {
    setProperty('${_browserPrefix}region-break-after', value, '');
  }

  /** Gets the value of "region-break-before" */
  String get regionBreakBefore =>
    getPropertyValue('${_browserPrefix}region-break-before');

  /** Sets the value of "region-break-before" */
  void set regionBreakBefore(String value) {
    setProperty('${_browserPrefix}region-break-before', value, '');
  }

  /** Gets the value of "region-break-inside" */
  String get regionBreakInside =>
    getPropertyValue('${_browserPrefix}region-break-inside');

  /** Sets the value of "region-break-inside" */
  void set regionBreakInside(String value) {
    setProperty('${_browserPrefix}region-break-inside', value, '');
  }

  /** Gets the value of "region-overflow" */
  String get regionOverflow =>
    getPropertyValue('${_browserPrefix}region-overflow');

  /** Sets the value of "region-overflow" */
  void set regionOverflow(String value) {
    setProperty('${_browserPrefix}region-overflow', value, '');
  }

  /** Gets the value of "resize" */
  String get resize =>
    getPropertyValue('resize');

  /** Sets the value of "resize" */
  void set resize(String value) {
    setProperty('resize', value, '');
  }

  /** Gets the value of "right" */
  String get right =>
    getPropertyValue('right');

  /** Sets the value of "right" */
  void set right(String value) {
    setProperty('right', value, '');
  }

  /** Gets the value of "rtl-ordering" */
  String get rtlOrdering =>
    getPropertyValue('${_browserPrefix}rtl-ordering');

  /** Sets the value of "rtl-ordering" */
  void set rtlOrdering(String value) {
    setProperty('${_browserPrefix}rtl-ordering', value, '');
  }

  /** Gets the value of "shape-inside" */
  String get shapeInside =>
    getPropertyValue('${_browserPrefix}shape-inside');

  /** Sets the value of "shape-inside" */
  void set shapeInside(String value) {
    setProperty('${_browserPrefix}shape-inside', value, '');
  }

  /** Gets the value of "shape-margin" */
  String get shapeMargin =>
    getPropertyValue('${_browserPrefix}shape-margin');

  /** Sets the value of "shape-margin" */
  void set shapeMargin(String value) {
    setProperty('${_browserPrefix}shape-margin', value, '');
  }

  /** Gets the value of "shape-outside" */
  String get shapeOutside =>
    getPropertyValue('${_browserPrefix}shape-outside');

  /** Sets the value of "shape-outside" */
  void set shapeOutside(String value) {
    setProperty('${_browserPrefix}shape-outside', value, '');
  }

  /** Gets the value of "shape-padding" */
  String get shapePadding =>
    getPropertyValue('${_browserPrefix}shape-padding');

  /** Sets the value of "shape-padding" */
  void set shapePadding(String value) {
    setProperty('${_browserPrefix}shape-padding', value, '');
  }

  /** Gets the value of "size" */
  String get size =>
    getPropertyValue('size');

  /** Sets the value of "size" */
  void set size(String value) {
    setProperty('size', value, '');
  }

  /** Gets the value of "speak" */
  String get speak =>
    getPropertyValue('speak');

  /** Sets the value of "speak" */
  void set speak(String value) {
    setProperty('speak', value, '');
  }

  /** Gets the value of "src" */
  String get src =>
    getPropertyValue('src');

  /** Sets the value of "src" */
  void set src(String value) {
    setProperty('src', value, '');
  }

  /** Gets the value of "tab-size" */
  String get tabSize =>
    getPropertyValue('tab-size');

  /** Sets the value of "tab-size" */
  void set tabSize(String value) {
    setProperty('tab-size', value, '');
  }

  /** Gets the value of "table-layout" */
  String get tableLayout =>
    getPropertyValue('table-layout');

  /** Sets the value of "table-layout" */
  void set tableLayout(String value) {
    setProperty('table-layout', value, '');
  }

  /** Gets the value of "tap-highlight-color" */
  String get tapHighlightColor =>
    getPropertyValue('${_browserPrefix}tap-highlight-color');

  /** Sets the value of "tap-highlight-color" */
  void set tapHighlightColor(String value) {
    setProperty('${_browserPrefix}tap-highlight-color', value, '');
  }

  /** Gets the value of "text-align" */
  String get textAlign =>
    getPropertyValue('text-align');

  /** Sets the value of "text-align" */
  void set textAlign(String value) {
    setProperty('text-align', value, '');
  }

  /** Gets the value of "text-align-last" */
  String get textAlignLast =>
    getPropertyValue('${_browserPrefix}text-align-last');

  /** Sets the value of "text-align-last" */
  void set textAlignLast(String value) {
    setProperty('${_browserPrefix}text-align-last', value, '');
  }

  /** Gets the value of "text-combine" */
  String get textCombine =>
    getPropertyValue('${_browserPrefix}text-combine');

  /** Sets the value of "text-combine" */
  void set textCombine(String value) {
    setProperty('${_browserPrefix}text-combine', value, '');
  }

  /** Gets the value of "text-decoration" */
  String get textDecoration =>
    getPropertyValue('text-decoration');

  /** Sets the value of "text-decoration" */
  void set textDecoration(String value) {
    setProperty('text-decoration', value, '');
  }

  /** Gets the value of "text-decoration-line" */
  String get textDecorationLine =>
    getPropertyValue('${_browserPrefix}text-decoration-line');

  /** Sets the value of "text-decoration-line" */
  void set textDecorationLine(String value) {
    setProperty('${_browserPrefix}text-decoration-line', value, '');
  }

  /** Gets the value of "text-decoration-style" */
  String get textDecorationStyle =>
    getPropertyValue('${_browserPrefix}text-decoration-style');

  /** Sets the value of "text-decoration-style" */
  void set textDecorationStyle(String value) {
    setProperty('${_browserPrefix}text-decoration-style', value, '');
  }

  /** Gets the value of "text-decorations-in-effect" */
  String get textDecorationsInEffect =>
    getPropertyValue('${_browserPrefix}text-decorations-in-effect');

  /** Sets the value of "text-decorations-in-effect" */
  void set textDecorationsInEffect(String value) {
    setProperty('${_browserPrefix}text-decorations-in-effect', value, '');
  }

  /** Gets the value of "text-emphasis" */
  String get textEmphasis =>
    getPropertyValue('${_browserPrefix}text-emphasis');

  /** Sets the value of "text-emphasis" */
  void set textEmphasis(String value) {
    setProperty('${_browserPrefix}text-emphasis', value, '');
  }

  /** Gets the value of "text-emphasis-color" */
  String get textEmphasisColor =>
    getPropertyValue('${_browserPrefix}text-emphasis-color');

  /** Sets the value of "text-emphasis-color" */
  void set textEmphasisColor(String value) {
    setProperty('${_browserPrefix}text-emphasis-color', value, '');
  }

  /** Gets the value of "text-emphasis-position" */
  String get textEmphasisPosition =>
    getPropertyValue('${_browserPrefix}text-emphasis-position');

  /** Sets the value of "text-emphasis-position" */
  void set textEmphasisPosition(String value) {
    setProperty('${_browserPrefix}text-emphasis-position', value, '');
  }

  /** Gets the value of "text-emphasis-style" */
  String get textEmphasisStyle =>
    getPropertyValue('${_browserPrefix}text-emphasis-style');

  /** Sets the value of "text-emphasis-style" */
  void set textEmphasisStyle(String value) {
    setProperty('${_browserPrefix}text-emphasis-style', value, '');
  }

  /** Gets the value of "text-fill-color" */
  String get textFillColor =>
    getPropertyValue('${_browserPrefix}text-fill-color');

  /** Sets the value of "text-fill-color" */
  void set textFillColor(String value) {
    setProperty('${_browserPrefix}text-fill-color', value, '');
  }

  /** Gets the value of "text-indent" */
  String get textIndent =>
    getPropertyValue('text-indent');

  /** Sets the value of "text-indent" */
  void set textIndent(String value) {
    setProperty('text-indent', value, '');
  }

  /** Gets the value of "text-line-through" */
  String get textLineThrough =>
    getPropertyValue('text-line-through');

  /** Sets the value of "text-line-through" */
  void set textLineThrough(String value) {
    setProperty('text-line-through', value, '');
  }

  /** Gets the value of "text-line-through-color" */
  String get textLineThroughColor =>
    getPropertyValue('text-line-through-color');

  /** Sets the value of "text-line-through-color" */
  void set textLineThroughColor(String value) {
    setProperty('text-line-through-color', value, '');
  }

  /** Gets the value of "text-line-through-mode" */
  String get textLineThroughMode =>
    getPropertyValue('text-line-through-mode');

  /** Sets the value of "text-line-through-mode" */
  void set textLineThroughMode(String value) {
    setProperty('text-line-through-mode', value, '');
  }

  /** Gets the value of "text-line-through-style" */
  String get textLineThroughStyle =>
    getPropertyValue('text-line-through-style');

  /** Sets the value of "text-line-through-style" */
  void set textLineThroughStyle(String value) {
    setProperty('text-line-through-style', value, '');
  }

  /** Gets the value of "text-line-through-width" */
  String get textLineThroughWidth =>
    getPropertyValue('text-line-through-width');

  /** Sets the value of "text-line-through-width" */
  void set textLineThroughWidth(String value) {
    setProperty('text-line-through-width', value, '');
  }

  /** Gets the value of "text-orientation" */
  String get textOrientation =>
    getPropertyValue('${_browserPrefix}text-orientation');

  /** Sets the value of "text-orientation" */
  void set textOrientation(String value) {
    setProperty('${_browserPrefix}text-orientation', value, '');
  }

  /** Gets the value of "text-overflow" */
  String get textOverflow =>
    getPropertyValue('text-overflow');

  /** Sets the value of "text-overflow" */
  void set textOverflow(String value) {
    setProperty('text-overflow', value, '');
  }

  /** Gets the value of "text-overline" */
  String get textOverline =>
    getPropertyValue('text-overline');

  /** Sets the value of "text-overline" */
  void set textOverline(String value) {
    setProperty('text-overline', value, '');
  }

  /** Gets the value of "text-overline-color" */
  String get textOverlineColor =>
    getPropertyValue('text-overline-color');

  /** Sets the value of "text-overline-color" */
  void set textOverlineColor(String value) {
    setProperty('text-overline-color', value, '');
  }

  /** Gets the value of "text-overline-mode" */
  String get textOverlineMode =>
    getPropertyValue('text-overline-mode');

  /** Sets the value of "text-overline-mode" */
  void set textOverlineMode(String value) {
    setProperty('text-overline-mode', value, '');
  }

  /** Gets the value of "text-overline-style" */
  String get textOverlineStyle =>
    getPropertyValue('text-overline-style');

  /** Sets the value of "text-overline-style" */
  void set textOverlineStyle(String value) {
    setProperty('text-overline-style', value, '');
  }

  /** Gets the value of "text-overline-width" */
  String get textOverlineWidth =>
    getPropertyValue('text-overline-width');

  /** Sets the value of "text-overline-width" */
  void set textOverlineWidth(String value) {
    setProperty('text-overline-width', value, '');
  }

  /** Gets the value of "text-rendering" */
  String get textRendering =>
    getPropertyValue('text-rendering');

  /** Sets the value of "text-rendering" */
  void set textRendering(String value) {
    setProperty('text-rendering', value, '');
  }

  /** Gets the value of "text-security" */
  String get textSecurity =>
    getPropertyValue('${_browserPrefix}text-security');

  /** Sets the value of "text-security" */
  void set textSecurity(String value) {
    setProperty('${_browserPrefix}text-security', value, '');
  }

  /** Gets the value of "text-shadow" */
  String get textShadow =>
    getPropertyValue('text-shadow');

  /** Sets the value of "text-shadow" */
  void set textShadow(String value) {
    setProperty('text-shadow', value, '');
  }

  /** Gets the value of "text-size-adjust" */
  String get textSizeAdjust =>
    getPropertyValue('${_browserPrefix}text-size-adjust');

  /** Sets the value of "text-size-adjust" */
  void set textSizeAdjust(String value) {
    setProperty('${_browserPrefix}text-size-adjust', value, '');
  }

  /** Gets the value of "text-stroke" */
  String get textStroke =>
    getPropertyValue('${_browserPrefix}text-stroke');

  /** Sets the value of "text-stroke" */
  void set textStroke(String value) {
    setProperty('${_browserPrefix}text-stroke', value, '');
  }

  /** Gets the value of "text-stroke-color" */
  String get textStrokeColor =>
    getPropertyValue('${_browserPrefix}text-stroke-color');

  /** Sets the value of "text-stroke-color" */
  void set textStrokeColor(String value) {
    setProperty('${_browserPrefix}text-stroke-color', value, '');
  }

  /** Gets the value of "text-stroke-width" */
  String get textStrokeWidth =>
    getPropertyValue('${_browserPrefix}text-stroke-width');

  /** Sets the value of "text-stroke-width" */
  void set textStrokeWidth(String value) {
    setProperty('${_browserPrefix}text-stroke-width', value, '');
  }

  /** Gets the value of "text-transform" */
  String get textTransform =>
    getPropertyValue('text-transform');

  /** Sets the value of "text-transform" */
  void set textTransform(String value) {
    setProperty('text-transform', value, '');
  }

  /** Gets the value of "text-underline" */
  String get textUnderline =>
    getPropertyValue('text-underline');

  /** Sets the value of "text-underline" */
  void set textUnderline(String value) {
    setProperty('text-underline', value, '');
  }

  /** Gets the value of "text-underline-color" */
  String get textUnderlineColor =>
    getPropertyValue('text-underline-color');

  /** Sets the value of "text-underline-color" */
  void set textUnderlineColor(String value) {
    setProperty('text-underline-color', value, '');
  }

  /** Gets the value of "text-underline-mode" */
  String get textUnderlineMode =>
    getPropertyValue('text-underline-mode');

  /** Sets the value of "text-underline-mode" */
  void set textUnderlineMode(String value) {
    setProperty('text-underline-mode', value, '');
  }

  /** Gets the value of "text-underline-style" */
  String get textUnderlineStyle =>
    getPropertyValue('text-underline-style');

  /** Sets the value of "text-underline-style" */
  void set textUnderlineStyle(String value) {
    setProperty('text-underline-style', value, '');
  }

  /** Gets the value of "text-underline-width" */
  String get textUnderlineWidth =>
    getPropertyValue('text-underline-width');

  /** Sets the value of "text-underline-width" */
  void set textUnderlineWidth(String value) {
    setProperty('text-underline-width', value, '');
  }

  /** Gets the value of "top" */
  String get top =>
    getPropertyValue('top');

  /** Sets the value of "top" */
  void set top(String value) {
    setProperty('top', value, '');
  }

  /** Gets the value of "transform" */
  String get transform =>
    getPropertyValue('${_browserPrefix}transform');

  /** Sets the value of "transform" */
  void set transform(String value) {
    setProperty('${_browserPrefix}transform', value, '');
  }

  /** Gets the value of "transform-origin" */
  String get transformOrigin =>
    getPropertyValue('${_browserPrefix}transform-origin');

  /** Sets the value of "transform-origin" */
  void set transformOrigin(String value) {
    setProperty('${_browserPrefix}transform-origin', value, '');
  }

  /** Gets the value of "transform-origin-x" */
  String get transformOriginX =>
    getPropertyValue('${_browserPrefix}transform-origin-x');

  /** Sets the value of "transform-origin-x" */
  void set transformOriginX(String value) {
    setProperty('${_browserPrefix}transform-origin-x', value, '');
  }

  /** Gets the value of "transform-origin-y" */
  String get transformOriginY =>
    getPropertyValue('${_browserPrefix}transform-origin-y');

  /** Sets the value of "transform-origin-y" */
  void set transformOriginY(String value) {
    setProperty('${_browserPrefix}transform-origin-y', value, '');
  }

  /** Gets the value of "transform-origin-z" */
  String get transformOriginZ =>
    getPropertyValue('${_browserPrefix}transform-origin-z');

  /** Sets the value of "transform-origin-z" */
  void set transformOriginZ(String value) {
    setProperty('${_browserPrefix}transform-origin-z', value, '');
  }

  /** Gets the value of "transform-style" */
  String get transformStyle =>
    getPropertyValue('${_browserPrefix}transform-style');

  /** Sets the value of "transform-style" */
  void set transformStyle(String value) {
    setProperty('${_browserPrefix}transform-style', value, '');
  }

  /** Gets the value of "transition" */
  String get transition =>
    getPropertyValue('${_browserPrefix}transition');

  /** Sets the value of "transition" */
  void set transition(String value) {
    setProperty('${_browserPrefix}transition', value, '');
  }

  /** Gets the value of "transition-delay" */
  String get transitionDelay =>
    getPropertyValue('${_browserPrefix}transition-delay');

  /** Sets the value of "transition-delay" */
  void set transitionDelay(String value) {
    setProperty('${_browserPrefix}transition-delay', value, '');
  }

  /** Gets the value of "transition-duration" */
  String get transitionDuration =>
    getPropertyValue('${_browserPrefix}transition-duration');

  /** Sets the value of "transition-duration" */
  void set transitionDuration(String value) {
    setProperty('${_browserPrefix}transition-duration', value, '');
  }

  /** Gets the value of "transition-property" */
  String get transitionProperty =>
    getPropertyValue('${_browserPrefix}transition-property');

  /** Sets the value of "transition-property" */
  void set transitionProperty(String value) {
    setProperty('${_browserPrefix}transition-property', value, '');
  }

  /** Gets the value of "transition-timing-function" */
  String get transitionTimingFunction =>
    getPropertyValue('${_browserPrefix}transition-timing-function');

  /** Sets the value of "transition-timing-function" */
  void set transitionTimingFunction(String value) {
    setProperty('${_browserPrefix}transition-timing-function', value, '');
  }

  /** Gets the value of "unicode-bidi" */
  String get unicodeBidi =>
    getPropertyValue('unicode-bidi');

  /** Sets the value of "unicode-bidi" */
  void set unicodeBidi(String value) {
    setProperty('unicode-bidi', value, '');
  }

  /** Gets the value of "unicode-range" */
  String get unicodeRange =>
    getPropertyValue('unicode-range');

  /** Sets the value of "unicode-range" */
  void set unicodeRange(String value) {
    setProperty('unicode-range', value, '');
  }

  /** Gets the value of "user-drag" */
  String get userDrag =>
    getPropertyValue('${_browserPrefix}user-drag');

  /** Sets the value of "user-drag" */
  void set userDrag(String value) {
    setProperty('${_browserPrefix}user-drag', value, '');
  }

  /** Gets the value of "user-modify" */
  String get userModify =>
    getPropertyValue('${_browserPrefix}user-modify');

  /** Sets the value of "user-modify" */
  void set userModify(String value) {
    setProperty('${_browserPrefix}user-modify', value, '');
  }

  /** Gets the value of "user-select" */
  String get userSelect =>
    getPropertyValue('${_browserPrefix}user-select');

  /** Sets the value of "user-select" */
  void set userSelect(String value) {
    setProperty('${_browserPrefix}user-select', value, '');
  }

  /** Gets the value of "user-zoom" */
  String get userZoom =>
    getPropertyValue('user-zoom');

  /** Sets the value of "user-zoom" */
  void set userZoom(String value) {
    setProperty('user-zoom', value, '');
  }

  /** Gets the value of "vertical-align" */
  String get verticalAlign =>
    getPropertyValue('vertical-align');

  /** Sets the value of "vertical-align" */
  void set verticalAlign(String value) {
    setProperty('vertical-align', value, '');
  }

  /** Gets the value of "visibility" */
  String get visibility =>
    getPropertyValue('visibility');

  /** Sets the value of "visibility" */
  void set visibility(String value) {
    setProperty('visibility', value, '');
  }

  /** Gets the value of "white-space" */
  String get whiteSpace =>
    getPropertyValue('white-space');

  /** Sets the value of "white-space" */
  void set whiteSpace(String value) {
    setProperty('white-space', value, '');
  }

  /** Gets the value of "widows" */
  String get widows =>
    getPropertyValue('widows');

  /** Sets the value of "widows" */
  void set widows(String value) {
    setProperty('widows', value, '');
  }

  /** Gets the value of "width" */
  String get width =>
    getPropertyValue('width');

  /** Sets the value of "width" */
  void set width(String value) {
    setProperty('width', value, '');
  }

  /** Gets the value of "word-break" */
  String get wordBreak =>
    getPropertyValue('word-break');

  /** Sets the value of "word-break" */
  void set wordBreak(String value) {
    setProperty('word-break', value, '');
  }

  /** Gets the value of "word-spacing" */
  String get wordSpacing =>
    getPropertyValue('word-spacing');

  /** Sets the value of "word-spacing" */
  void set wordSpacing(String value) {
    setProperty('word-spacing', value, '');
  }

  /** Gets the value of "word-wrap" */
  String get wordWrap =>
    getPropertyValue('word-wrap');

  /** Sets the value of "word-wrap" */
  void set wordWrap(String value) {
    setProperty('word-wrap', value, '');
  }

  /** Gets the value of "wrap" */
  String get wrap =>
    getPropertyValue('${_browserPrefix}wrap');

  /** Sets the value of "wrap" */
  void set wrap(String value) {
    setProperty('${_browserPrefix}wrap', value, '');
  }

  /** Gets the value of "wrap-flow" */
  String get wrapFlow =>
    getPropertyValue('${_browserPrefix}wrap-flow');

  /** Sets the value of "wrap-flow" */
  void set wrapFlow(String value) {
    setProperty('${_browserPrefix}wrap-flow', value, '');
  }

  /** Gets the value of "wrap-through" */
  String get wrapThrough =>
    getPropertyValue('${_browserPrefix}wrap-through');

  /** Sets the value of "wrap-through" */
  void set wrapThrough(String value) {
    setProperty('${_browserPrefix}wrap-through', value, '');
  }

  /** Gets the value of "writing-mode" */
  String get writingMode =>
    getPropertyValue('${_browserPrefix}writing-mode');

  /** Sets the value of "writing-mode" */
  void set writingMode(String value) {
    setProperty('${_browserPrefix}writing-mode', value, '');
  }

  /** Gets the value of "z-index" */
  String get zIndex =>
    getPropertyValue('z-index');

  /** Sets the value of "z-index" */
  void set zIndex(String value) {
    setProperty('z-index', value, '');
  }

  /** Gets the value of "zoom" */
  String get zoom =>
    getPropertyValue('zoom');

  /** Sets the value of "zoom" */
  void set zoom(String value) {
    setProperty('zoom', value, '');
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSStyleRule
class CssStyleRule extends CssRule {
  CssStyleRule.internal(): super.internal();


  /** @domName CSSStyleRule.selectorText */
  String get selectorText native "CSSStyleRule_selectorText_Getter";


  /** @domName CSSStyleRule.selectorText */
  void set selectorText(String value) native "CSSStyleRule_selectorText_Setter";


  /** @domName CSSStyleRule.style */
  CssStyleDeclaration get style native "CSSStyleRule_style_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSStyleSheet
class CssStyleSheet extends StyleSheet {
  CssStyleSheet.internal(): super.internal();


  /** @domName CSSStyleSheet.cssRules */
  List<CssRule> get cssRules native "CSSStyleSheet_cssRules_Getter";


  /** @domName CSSStyleSheet.ownerRule */
  CssRule get ownerRule native "CSSStyleSheet_ownerRule_Getter";


  /** @domName CSSStyleSheet.rules */
  List<CssRule> get rules native "CSSStyleSheet_rules_Getter";

  int addRule(/*DOMString*/ selector, /*DOMString*/ style, [/*unsigned long*/ index]) {
    if (?index) {
      return _addRule_1(selector, style, index);
    }
    return _addRule_2(selector, style);
  }


  /** @domName CSSStyleSheet.addRule_1 */
  int _addRule_1(selector, style, index) native "CSSStyleSheet_addRule_1_Callback";


  /** @domName CSSStyleSheet.addRule_2 */
  int _addRule_2(selector, style) native "CSSStyleSheet_addRule_2_Callback";


  /** @domName CSSStyleSheet.deleteRule */
  void deleteRule(int index) native "CSSStyleSheet_deleteRule_Callback";


  /** @domName CSSStyleSheet.insertRule */
  int insertRule(String rule, int index) native "CSSStyleSheet_insertRule_Callback";


  /** @domName CSSStyleSheet.removeRule */
  void removeRule(int index) native "CSSStyleSheet_removeRule_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitCSSTransformValue
class CssTransformValue extends _CssValueList {
  CssTransformValue.internal(): super.internal();

  static const int CSS_MATRIX = 11;

  static const int CSS_MATRIX3D = 21;

  static const int CSS_PERSPECTIVE = 20;

  static const int CSS_ROTATE = 4;

  static const int CSS_ROTATE3D = 17;

  static const int CSS_ROTATEX = 14;

  static const int CSS_ROTATEY = 15;

  static const int CSS_ROTATEZ = 16;

  static const int CSS_SCALE = 5;

  static const int CSS_SCALE3D = 19;

  static const int CSS_SCALEX = 6;

  static const int CSS_SCALEY = 7;

  static const int CSS_SCALEZ = 18;

  static const int CSS_SKEW = 8;

  static const int CSS_SKEWX = 9;

  static const int CSS_SKEWY = 10;

  static const int CSS_TRANSLATE = 1;

  static const int CSS_TRANSLATE3D = 13;

  static const int CSS_TRANSLATEX = 2;

  static const int CSS_TRANSLATEY = 3;

  static const int CSS_TRANSLATEZ = 12;


  /** @domName WebKitCSSTransformValue.operationType */
  int get operationType native "WebKitCSSTransformValue_operationType_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSUnknownRule
class CssUnknownRule extends CssRule {
  CssUnknownRule.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSValue
class CssValue extends NativeFieldWrapperClass1 {
  CssValue.internal();

  static const int CSS_CUSTOM = 3;

  static const int CSS_INHERIT = 0;

  static const int CSS_PRIMITIVE_VALUE = 1;

  static const int CSS_VALUE_LIST = 2;


  /** @domName CSSValue.cssText */
  String get cssText native "CSSValue_cssText_Getter";


  /** @domName CSSValue.cssText */
  void set cssText(String value) native "CSSValue_cssText_Setter";


  /** @domName CSSValue.cssValueType */
  int get cssValueType native "CSSValue_cssValueType_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CustomEvent
class CustomEvent extends Event {
  factory CustomEvent(String type, [bool canBubble = true, bool cancelable = true,
      Object detail]) => _CustomEventFactoryProvider.createCustomEvent(
      type, canBubble, cancelable, detail);
  CustomEvent.internal(): super.internal();


  /** @domName CustomEvent.detail */
  Object get detail native "CustomEvent_detail_Getter";


  /** @domName CustomEvent.initCustomEvent */
  void $dom_initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) native "CustomEvent_initCustomEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDListElement
class DListElement extends _Element_Merged {

  ///@docsEditable true
  factory DListElement() => document.$dom_createElement("dl");
  DListElement.internal(): super.internal();


  /** @domName HTMLDListElement.compact */
  bool get compact native "HTMLDListElement_compact_Getter";


  /** @domName HTMLDListElement.compact */
  void set compact(bool value) native "HTMLDListElement_compact_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDataListElement
class DataListElement extends _Element_Merged {

  ///@docsEditable true
  factory DataListElement() => document.$dom_createElement("datalist");
  DataListElement.internal(): super.internal();


  /** @domName HTMLDataListElement.options */
  HtmlCollection get options native "HTMLDataListElement_options_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DataTransferItem
class DataTransferItem extends NativeFieldWrapperClass1 {
  DataTransferItem.internal();


  /** @domName DataTransferItem.kind */
  String get kind native "DataTransferItem_kind_Getter";


  /** @domName DataTransferItem.type */
  String get type native "DataTransferItem_type_Getter";


  /** @domName DataTransferItem.getAsFile */
  Blob getAsFile() native "DataTransferItem_getAsFile_Callback";


  /** @domName DataTransferItem.getAsString */
  void getAsString([StringCallback callback]) native "DataTransferItem_getAsString_Callback";


  /** @domName DataTransferItem.webkitGetAsEntry */
  Entry webkitGetAsEntry() native "DataTransferItem_webkitGetAsEntry_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DataTransferItemList
class DataTransferItemList extends NativeFieldWrapperClass1 {
  DataTransferItemList.internal();


  /** @domName DataTransferItemList.length */
  int get length native "DataTransferItemList_length_Getter";

  void add(data_OR_file, [/*DOMString*/ type]) {
    if ((data_OR_file is File || data_OR_file == null) && !?type) {
      _add_1(data_OR_file);
      return;
    }
    if ((data_OR_file is String || data_OR_file == null) && (type is String || type == null)) {
      _add_2(data_OR_file, type);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName DataTransferItemList.add_1 */
  void _add_1(data_OR_file) native "DataTransferItemList_add_1_Callback";


  /** @domName DataTransferItemList.add_2 */
  void _add_2(data_OR_file, type) native "DataTransferItemList_add_2_Callback";


  /** @domName DataTransferItemList.clear */
  void clear() native "DataTransferItemList_clear_Callback";


  /** @domName DataTransferItemList.item */
  DataTransferItem item(int index) native "DataTransferItemList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DataView
class DataView extends ArrayBufferView {

  ///@docsEditable true
  factory DataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) {
    if (!?byteOffset) {
      return _DataViewFactoryProvider.createDataView(buffer);
    }
    if (!?byteLength) {
      return _DataViewFactoryProvider.createDataView(buffer, byteOffset);
    }
    return _DataViewFactoryProvider.createDataView(buffer, byteOffset, byteLength);
  }
  DataView.internal(): super.internal();

  num getFloat32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getFloat32_1(byteOffset, littleEndian);
    }
    return _getFloat32_2(byteOffset);
  }


  /** @domName DataView.getFloat32_1 */
  num _getFloat32_1(byteOffset, littleEndian) native "DataView_getFloat32_1_Callback";


  /** @domName DataView.getFloat32_2 */
  num _getFloat32_2(byteOffset) native "DataView_getFloat32_2_Callback";

  num getFloat64(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getFloat64_1(byteOffset, littleEndian);
    }
    return _getFloat64_2(byteOffset);
  }


  /** @domName DataView.getFloat64_1 */
  num _getFloat64_1(byteOffset, littleEndian) native "DataView_getFloat64_1_Callback";


  /** @domName DataView.getFloat64_2 */
  num _getFloat64_2(byteOffset) native "DataView_getFloat64_2_Callback";

  int getInt16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getInt16_1(byteOffset, littleEndian);
    }
    return _getInt16_2(byteOffset);
  }


  /** @domName DataView.getInt16_1 */
  int _getInt16_1(byteOffset, littleEndian) native "DataView_getInt16_1_Callback";


  /** @domName DataView.getInt16_2 */
  int _getInt16_2(byteOffset) native "DataView_getInt16_2_Callback";

  int getInt32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getInt32_1(byteOffset, littleEndian);
    }
    return _getInt32_2(byteOffset);
  }


  /** @domName DataView.getInt32_1 */
  int _getInt32_1(byteOffset, littleEndian) native "DataView_getInt32_1_Callback";


  /** @domName DataView.getInt32_2 */
  int _getInt32_2(byteOffset) native "DataView_getInt32_2_Callback";


  /** @domName DataView.getInt8 */
  int getInt8(int byteOffset) native "DataView_getInt8_Callback";

  int getUint16(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getUint16_1(byteOffset, littleEndian);
    }
    return _getUint16_2(byteOffset);
  }


  /** @domName DataView.getUint16_1 */
  int _getUint16_1(byteOffset, littleEndian) native "DataView_getUint16_1_Callback";


  /** @domName DataView.getUint16_2 */
  int _getUint16_2(byteOffset) native "DataView_getUint16_2_Callback";

  int getUint32(/*unsigned long*/ byteOffset, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      return _getUint32_1(byteOffset, littleEndian);
    }
    return _getUint32_2(byteOffset);
  }


  /** @domName DataView.getUint32_1 */
  int _getUint32_1(byteOffset, littleEndian) native "DataView_getUint32_1_Callback";


  /** @domName DataView.getUint32_2 */
  int _getUint32_2(byteOffset) native "DataView_getUint32_2_Callback";


  /** @domName DataView.getUint8 */
  int getUint8(int byteOffset) native "DataView_getUint8_Callback";

  void setFloat32(/*unsigned long*/ byteOffset, /*float*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setFloat32_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat32_2(byteOffset, value);
  }


  /** @domName DataView.setFloat32_1 */
  void _setFloat32_1(byteOffset, value, littleEndian) native "DataView_setFloat32_1_Callback";


  /** @domName DataView.setFloat32_2 */
  void _setFloat32_2(byteOffset, value) native "DataView_setFloat32_2_Callback";

  void setFloat64(/*unsigned long*/ byteOffset, /*double*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setFloat64_1(byteOffset, value, littleEndian);
      return;
    }
    _setFloat64_2(byteOffset, value);
  }


  /** @domName DataView.setFloat64_1 */
  void _setFloat64_1(byteOffset, value, littleEndian) native "DataView_setFloat64_1_Callback";


  /** @domName DataView.setFloat64_2 */
  void _setFloat64_2(byteOffset, value) native "DataView_setFloat64_2_Callback";

  void setInt16(/*unsigned long*/ byteOffset, /*short*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setInt16_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt16_2(byteOffset, value);
  }


  /** @domName DataView.setInt16_1 */
  void _setInt16_1(byteOffset, value, littleEndian) native "DataView_setInt16_1_Callback";


  /** @domName DataView.setInt16_2 */
  void _setInt16_2(byteOffset, value) native "DataView_setInt16_2_Callback";

  void setInt32(/*unsigned long*/ byteOffset, /*long*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setInt32_1(byteOffset, value, littleEndian);
      return;
    }
    _setInt32_2(byteOffset, value);
  }


  /** @domName DataView.setInt32_1 */
  void _setInt32_1(byteOffset, value, littleEndian) native "DataView_setInt32_1_Callback";


  /** @domName DataView.setInt32_2 */
  void _setInt32_2(byteOffset, value) native "DataView_setInt32_2_Callback";


  /** @domName DataView.setInt8 */
  void setInt8(int byteOffset, int value) native "DataView_setInt8_Callback";

  void setUint16(/*unsigned long*/ byteOffset, /*unsigned short*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setUint16_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint16_2(byteOffset, value);
  }


  /** @domName DataView.setUint16_1 */
  void _setUint16_1(byteOffset, value, littleEndian) native "DataView_setUint16_1_Callback";


  /** @domName DataView.setUint16_2 */
  void _setUint16_2(byteOffset, value) native "DataView_setUint16_2_Callback";

  void setUint32(/*unsigned long*/ byteOffset, /*unsigned long*/ value, {/*boolean*/ littleEndian}) {
    if (?littleEndian) {
      _setUint32_1(byteOffset, value, littleEndian);
      return;
    }
    _setUint32_2(byteOffset, value);
  }


  /** @domName DataView.setUint32_1 */
  void _setUint32_1(byteOffset, value, littleEndian) native "DataView_setUint32_1_Callback";


  /** @domName DataView.setUint32_2 */
  void _setUint32_2(byteOffset, value) native "DataView_setUint32_2_Callback";


  /** @domName DataView.setUint8 */
  void setUint8(int byteOffset, int value) native "DataView_setUint8_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Database
class Database extends NativeFieldWrapperClass1 {
  Database.internal();


  /** @domName Database.version */
  String get version native "Database_version_Getter";


  /** @domName Database.changeVersion */
  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_changeVersion_Callback";


  /** @domName Database.readTransaction */
  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_readTransaction_Callback";


  /** @domName Database.transaction */
  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native "Database_transaction_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void DatabaseCallback(database);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DatabaseSync
class DatabaseSync extends NativeFieldWrapperClass1 {
  DatabaseSync.internal();


  /** @domName DatabaseSync.lastErrorMessage */
  String get lastErrorMessage native "DatabaseSync_lastErrorMessage_Getter";


  /** @domName DatabaseSync.version */
  String get version native "DatabaseSync_version_Getter";


  /** @domName DatabaseSync.changeVersion */
  void changeVersion(String oldVersion, String newVersion, [SqlTransactionSyncCallback callback]) native "DatabaseSync_changeVersion_Callback";


  /** @domName DatabaseSync.readTransaction */
  void readTransaction(SqlTransactionSyncCallback callback) native "DatabaseSync_readTransaction_Callback";


  /** @domName DatabaseSync.transaction */
  void transaction(SqlTransactionSyncCallback callback) native "DatabaseSync_transaction_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DedicatedWorkerContext
class DedicatedWorkerContext extends WorkerContext {
  DedicatedWorkerContext.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  DedicatedWorkerContextEvents get on =>
    new DedicatedWorkerContextEvents(this);


  /** @domName DedicatedWorkerContext.postMessage */
  void postMessage(Object message, [List messagePorts]) native "DedicatedWorkerContext_postMessage_Callback";

}

/// @docsEditable true
class DedicatedWorkerContextEvents extends WorkerContextEvents {
  /// @docsEditable true
  DedicatedWorkerContextEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDetailsElement
class DetailsElement extends _Element_Merged {

  ///@docsEditable true
  factory DetailsElement() => document.$dom_createElement("details");
  DetailsElement.internal(): super.internal();


  /** @domName HTMLDetailsElement.open */
  bool get open native "HTMLDetailsElement_open_Getter";


  /** @domName HTMLDetailsElement.open */
  void set open(bool value) native "HTMLDetailsElement_open_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DeviceMotionEvent
class DeviceMotionEvent extends Event {
  DeviceMotionEvent.internal(): super.internal();


  /** @domName DeviceMotionEvent.interval */
  num get interval native "DeviceMotionEvent_interval_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DeviceOrientationEvent
class DeviceOrientationEvent extends Event {
  DeviceOrientationEvent.internal(): super.internal();


  /** @domName DeviceOrientationEvent.absolute */
  bool get absolute native "DeviceOrientationEvent_absolute_Getter";


  /** @domName DeviceOrientationEvent.alpha */
  num get alpha native "DeviceOrientationEvent_alpha_Getter";


  /** @domName DeviceOrientationEvent.beta */
  num get beta native "DeviceOrientationEvent_beta_Getter";


  /** @domName DeviceOrientationEvent.gamma */
  num get gamma native "DeviceOrientationEvent_gamma_Getter";


  /** @domName DeviceOrientationEvent.initDeviceOrientationEvent */
  void initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDirectoryElement
class DirectoryElement extends _Element_Merged {
  DirectoryElement.internal(): super.internal();


  /** @domName HTMLDirectoryElement.compact */
  bool get compact native "HTMLDirectoryElement_compact_Getter";


  /** @domName HTMLDirectoryElement.compact */
  void set compact(bool value) native "HTMLDirectoryElement_compact_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DirectoryEntry
class DirectoryEntry extends Entry {
  DirectoryEntry.internal(): super.internal();


  /** @domName DirectoryEntry.createReader */
  DirectoryReader createReader() native "DirectoryEntry_createReader_Callback";


  /** @domName DirectoryEntry.getDirectory */
  void getDirectory(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getDirectory_Callback";


  /** @domName DirectoryEntry.getFile */
  void getFile(String path, {Map options, EntryCallback successCallback, ErrorCallback errorCallback}) native "DirectoryEntry_getFile_Callback";


  /** @domName DirectoryEntry.removeRecursively */
  void removeRecursively(VoidCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryEntry_removeRecursively_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DirectoryEntrySync
class DirectoryEntrySync extends EntrySync {
  DirectoryEntrySync.internal(): super.internal();


  /** @domName DirectoryEntrySync.createReader */
  DirectoryReaderSync createReader() native "DirectoryEntrySync_createReader_Callback";


  /** @domName DirectoryEntrySync.getDirectory */
  DirectoryEntrySync getDirectory(String path, Map flags) native "DirectoryEntrySync_getDirectory_Callback";


  /** @domName DirectoryEntrySync.getFile */
  FileEntrySync getFile(String path, Map flags) native "DirectoryEntrySync_getFile_Callback";


  /** @domName DirectoryEntrySync.removeRecursively */
  void removeRecursively() native "DirectoryEntrySync_removeRecursively_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DirectoryReader
class DirectoryReader extends NativeFieldWrapperClass1 {
  DirectoryReader.internal();


  /** @domName DirectoryReader.readEntries */
  void readEntries(EntriesCallback successCallback, [ErrorCallback errorCallback]) native "DirectoryReader_readEntries_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DirectoryReaderSync
class DirectoryReaderSync extends NativeFieldWrapperClass1 {
  DirectoryReaderSync.internal();


  /** @domName DirectoryReaderSync.readEntries */
  List<EntrySync> readEntries() native "DirectoryReaderSync_readEntries_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDivElement
class DivElement extends _Element_Merged {

  ///@docsEditable true
  factory DivElement() => document.$dom_createElement("div");
  DivElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName Document
/**
 * The base class for all documents.
 *
 * Each web page loaded in the browser has its own [Document] object, which is
 * typically an [HtmlDocument].
 *
 * If you aren't comfortable with DOM concepts, see the Dart tutorial
 * [Target 2: Connect Dart & HTML](http://www.dartlang.org/docs/tutorials/connect-dart-html/).
 */
class Document extends Node 
{

  Document.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  DocumentEvents get on =>
    new DocumentEvents(this);


  /** @domName Document.body */
  Element get $dom_body native "Document_body_Getter";


  /** @domName Document.body */
  void set $dom_body(Element value) native "Document_body_Setter";


  /** @domName Document.charset */
  String get charset native "Document_charset_Getter";


  /** @domName Document.charset */
  void set charset(String value) native "Document_charset_Setter";


  /** @domName Document.cookie */
  String get cookie native "Document_cookie_Getter";


  /** @domName Document.cookie */
  void set cookie(String value) native "Document_cookie_Setter";


  /** @domName Document.defaultView */
  Window get window native "Document_defaultView_Getter";


  /** @domName Document.documentElement */
  Element get documentElement native "Document_documentElement_Getter";


  /** @domName Document.domain */
  String get domain native "Document_domain_Getter";


  /** @domName Document.head */
  HeadElement get $dom_head native "Document_head_Getter";


  /** @domName Document.implementation */
  DomImplementation get implementation native "Document_implementation_Getter";


  /** @domName Document.lastModified */
  String get $dom_lastModified native "Document_lastModified_Getter";


  /** @domName Document.preferredStylesheetSet */
  String get $dom_preferredStylesheetSet native "Document_preferredStylesheetSet_Getter";


  /** @domName Document.readyState */
  String get readyState native "Document_readyState_Getter";


  /** @domName Document.referrer */
  String get $dom_referrer native "Document_referrer_Getter";


  /** @domName Document.selectedStylesheetSet */
  String get $dom_selectedStylesheetSet native "Document_selectedStylesheetSet_Getter";


  /** @domName Document.selectedStylesheetSet */
  void set $dom_selectedStylesheetSet(String value) native "Document_selectedStylesheetSet_Setter";


  /** @domName Document.styleSheets */
  List<StyleSheet> get $dom_styleSheets native "Document_styleSheets_Getter";


  /** @domName Document.title */
  String get $dom_title native "Document_title_Getter";


  /** @domName Document.title */
  void set $dom_title(String value) native "Document_title_Setter";


  /** @domName Document.webkitFullscreenElement */
  Element get $dom_webkitFullscreenElement native "Document_webkitFullscreenElement_Getter";


  /** @domName Document.webkitFullscreenEnabled */
  bool get $dom_webkitFullscreenEnabled native "Document_webkitFullscreenEnabled_Getter";


  /** @domName Document.webkitHidden */
  bool get $dom_webkitHidden native "Document_webkitHidden_Getter";


  /** @domName Document.webkitIsFullScreen */
  bool get $dom_webkitIsFullScreen native "Document_webkitIsFullScreen_Getter";


  /** @domName Document.webkitPointerLockElement */
  Element get $dom_webkitPointerLockElement native "Document_webkitPointerLockElement_Getter";


  /** @domName Document.webkitVisibilityState */
  String get $dom_webkitVisibilityState native "Document_webkitVisibilityState_Getter";


  /** @domName Document.caretRangeFromPoint */
  Range $dom_caretRangeFromPoint(int x, int y) native "Document_caretRangeFromPoint_Callback";


  /** @domName Document.createCDATASection */
  CDataSection createCDataSection(String data) native "Document_createCDATASection_Callback";


  /** @domName Document.createDocumentFragment */
  DocumentFragment createDocumentFragment() native "Document_createDocumentFragment_Callback";


  /** @domName Document.createElement */
  Element $dom_createElement(String tagName) native "Document_createElement_Callback";


  /** @domName Document.createElementNS */
  Element $dom_createElementNS(String namespaceURI, String qualifiedName) native "Document_createElementNS_Callback";


  /** @domName Document.createEvent */
  Event $dom_createEvent(String eventType) native "Document_createEvent_Callback";


  /** @domName Document.createRange */
  Range $dom_createRange() native "Document_createRange_Callback";


  /** @domName Document.createTextNode */
  Text $dom_createTextNode(String data) native "Document_createTextNode_Callback";


  /** @domName Document.createTouch */
  Touch $dom_createTouch(LocalWindow window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) native "Document_createTouch_Callback";


  /** @domName Document.createTouchList */
  TouchList $dom_createTouchList() native "Document_createTouchList_Callback";


  /** @domName Document.elementFromPoint */
  Element $dom_elementFromPoint(int x, int y) native "Document_elementFromPoint_Callback";


  /** @domName Document.execCommand */
  bool execCommand(String command, bool userInterface, String value) native "Document_execCommand_Callback";


  /** @domName Document.getCSSCanvasContext */
  CanvasRenderingContext $dom_getCssCanvasContext(String contextId, String name, int width, int height) native "Document_getCSSCanvasContext_Callback";


  /** @domName Document.getElementById */
  Element $dom_getElementById(String elementId) native "Document_getElementById_Callback";


  /** @domName Document.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String tagname) native "Document_getElementsByClassName_Callback";


  /** @domName Document.getElementsByName */
  List<Node> $dom_getElementsByName(String elementName) native "Document_getElementsByName_Callback";


  /** @domName Document.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String tagname) native "Document_getElementsByTagName_Callback";


  /** @domName Document.queryCommandEnabled */
  bool queryCommandEnabled(String command) native "Document_queryCommandEnabled_Callback";


  /** @domName Document.queryCommandIndeterm */
  bool queryCommandIndeterm(String command) native "Document_queryCommandIndeterm_Callback";


  /** @domName Document.queryCommandState */
  bool queryCommandState(String command) native "Document_queryCommandState_Callback";


  /** @domName Document.queryCommandSupported */
  bool queryCommandSupported(String command) native "Document_queryCommandSupported_Callback";


  /** @domName Document.queryCommandValue */
  String queryCommandValue(String command) native "Document_queryCommandValue_Callback";


  /** @domName Document.querySelector */
  Element $dom_querySelector(String selectors) native "Document_querySelector_Callback";


  /** @domName Document.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "Document_querySelectorAll_Callback";


  /** @domName Document.webkitCancelFullScreen */
  void $dom_webkitCancelFullScreen() native "Document_webkitCancelFullScreen_Callback";


  /** @domName Document.webkitExitFullscreen */
  void $dom_webkitExitFullscreen() native "Document_webkitExitFullscreen_Callback";


  /** @domName Document.webkitExitPointerLock */
  void $dom_webkitExitPointerLock() native "Document_webkitExitPointerLock_Callback";


  /**
   * Finds the first descendant element of this document that matches the
   * specified group of selectors.
   *
   * Unless your webpage contains multiple documents, the top-level query
   * method behaves the same as this method, so you should use it instead to
   * save typing a few characters.
   *
   * [selectors] should be a string using CSS selector syntax.
   *     var element1 = document.query('.className');
   *     var element2 = document.query('#id');
   *
   * For details about CSS selector syntax, see the
   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
   */
  Element query(String selectors) {
    // It is fine for our RegExp to detect element id query selectors to have
    // false negatives but not false positives.
    if (new RegExp("^#[_a-zA-Z]\\w*\$").hasMatch(selectors)) {
      return $dom_getElementById(selectors.substring(1));
    }
    return $dom_querySelector(selectors);
  }

  /**
   * Finds all descendant elements of this document that match the specified
   * group of selectors.
   *
   * Unless your webpage contains multiple documents, the top-level queryAll
   * method behaves the same as this method, so you should use it instead to
   * save typing a few characters.
   *
   * [selectors] should be a string using CSS selector syntax.
   *     var items = document.queryAll('.itemClassName');
   *
   * For details about CSS selector syntax, see the
   * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
   */
  List<Element> queryAll(String selectors) {
    if (new RegExp("""^\\[name=["'][^'"]+['"]\\]\$""").hasMatch(selectors)) {
      final mutableMatches = $dom_getElementsByName(
          selectors.substring(7,selectors.length - 2));
      int len = mutableMatches.length;
      final copyOfMatches = new List<Element>(len);
      for (int i = 0; i < len; ++i) {
        copyOfMatches[i] = mutableMatches[i];
      }
      return new _FrozenElementList._wrap(copyOfMatches);
    } else if (new RegExp("^[*a-zA-Z0-9]+\$").hasMatch(selectors)) {
      final mutableMatches = $dom_getElementsByTagName(selectors);
      int len = mutableMatches.length;
      final copyOfMatches = new List<Element>(len);
      for (int i = 0; i < len; ++i) {
        copyOfMatches[i] = mutableMatches[i];
      }
      return new _FrozenElementList._wrap(copyOfMatches);
    } else {
      return new _FrozenElementList._wrap($dom_querySelectorAll(selectors));
    }
  }
}

/// @docsEditable true
class DocumentEvents extends ElementEvents {
  /// @docsEditable true
  DocumentEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get readyStateChange => this['readystatechange'];

  /// @docsEditable true
  EventListenerList get selectionChange => this['selectionchange'];

  /// @docsEditable true
  EventListenerList get pointerLockChange => this['webkitpointerlockchange'];

  /// @docsEditable true
  EventListenerList get pointerLockError => this['webkitpointerlockerror'];
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


Future<CssStyleDeclaration> _emptyStyleFuture() {
  return _createMeasurementFuture(() => new Element.tag('div').style,
                                  new Completer<CssStyleDeclaration>());
}

class _FrozenCssClassSet extends CssClassSet {
  void writeClasses(Set s) {
    throw new UnsupportedError(
        'frozen class set cannot be modified');
  }
  Set<String> readClasses() => new Set<String>();

  bool get frozen => true;
}

/// @domName DocumentFragment
class DocumentFragment extends Node {
  factory DocumentFragment() => _DocumentFragmentFactoryProvider.createDocumentFragment();

  factory DocumentFragment.html(String html) =>
      _DocumentFragmentFactoryProvider.createDocumentFragment_html(html);

  factory DocumentFragment.svg(String svgContent) =>
      _DocumentFragmentFactoryProvider.createDocumentFragment_svg(svgContent);

  @deprecated
  List<Element> get elements => this.children;

  // TODO: The type of value should be Collection<Element>. See http://b/5392897
  @deprecated
  void set elements(value) {
    this.children = value;
  }

  List<Element> _children;

  List<Element> get children {
    if (_children == null) {
      _children = new FilteredElementList(this);
    }
    return _children;
  }

  void set children(List<Element> value) {
    // Copy list first since we don't want liveness during iteration.
    List copy = new List.from(value);
    var children = this.children;
    children.clear();
    children.addAll(copy);
  }

  Element query(String selectors) => $dom_querySelector(selectors);

  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  String get innerHtml {
    final e = new Element.tag("div");
    e.nodes.add(this.clone(true));
    return e.innerHtml;
  }

  String get outerHtml => innerHtml;

  // TODO(nweiz): Do we want to support some variant of innerHtml for XML and/or
  // SVG strings?
  void set innerHtml(String value) {
    this.nodes.clear();

    final e = new Element.tag("div");
    e.innerHtml = value;

    // Copy list first since we don't want liveness during iteration.
    List nodes = new List.from(e.nodes);
    this.nodes.addAll(nodes);
  }

  Node _insertAdjacentNode(String where, Node node) {
    switch (where.toLowerCase()) {
      case "beforebegin": return null;
      case "afterend": return null;
      case "afterbegin":
        var first = this.nodes.length > 0 ? this.nodes[0] : null;
        this.insertBefore(node, first);
        return node;
      case "beforeend":
        this.nodes.add(node);
        return node;
      default:
        throw new ArgumentError("Invalid position ${where}");
    }
  }

  Element insertAdjacentElement(String where, Element element)
    => this._insertAdjacentNode(where, element);

  void insertAdjacentText(String where, String text) {
    this._insertAdjacentNode(where, new Text(text));
  }

  void insertAdjacentHtml(String where, String text) {
    this._insertAdjacentNode(where, new DocumentFragment.html(text));
  }

  void append(Element element) {
    this.children.add(element);
  }

  void appendText(String text) {
    this.insertAdjacentText('beforeend', text);
  }

  void appendHtml(String text) {
    this.insertAdjacentHtml('beforeend', text);
  }

  // If we can come up with a semi-reasonable default value for an Element
  // getter, we'll use it. In general, these return the same values as an
  // element that has no parent.
  String get contentEditable => "false";
  bool get isContentEditable => false;
  bool get draggable => false;
  bool get hidden => false;
  bool get spellcheck => false;
  bool get translate => false;
  int get tabIndex => -1;
  String get id => "";
  String get title => "";
  String get tagName => "";
  String get webkitdropzone => "";
  String get webkitRegionOverflow => "";
  Element get $m_firstElementChild {
    if (children.length > 0) {
      return children[0];
    }
    return null;
  }
  Element get $m_lastElementChild => children.last;
  Element get nextElementSibling => null;
  Element get previousElementSibling => null;
  Element get offsetParent => null;
  Element get parent => null;
  Map<String, String> get attributes => const {};
  CssClassSet get classes => new _FrozenCssClassSet();
  Map<String, String> get dataAttributes => const {};
  CssStyleDeclaration get style => new Element.tag('div').style;
  Future<CssStyleDeclaration> get computedStyle =>
      _emptyStyleFuture();
  Future<CssStyleDeclaration> getComputedStyle(String pseudoElement) =>
      _emptyStyleFuture();
  bool matchesSelector(String selectors) => false;

  // Imperative Element methods are made into no-ops, as they are on parentless
  // elements.
  void blur() {}
  void focus() {}
  void click() {}
  void scrollByLines(int lines) {}
  void scrollByPages(int pages) {}
  void scrollIntoView([bool centerIfNeeded]) {}
  void webkitRequestFullScreen(int flags) {}
  void webkitRequestFullscreen() {}

  // Setters throw errors rather than being no-ops because we aren't going to
  // retain the values that were set, and erroring out seems clearer.
  void set attributes(Map<String, String> value) {
    throw new UnsupportedError(
      "Attributes can't be set for document fragments.");
  }

  void set classes(Collection<String> value) {
    throw new UnsupportedError(
      "Classes can't be set for document fragments.");
  }

  void set dataAttributes(Map<String, String> value) {
    throw new UnsupportedError(
      "Data attributes can't be set for document fragments.");
  }

  void set contentEditable(String value) {
    throw new UnsupportedError(
      "Content editable can't be set for document fragments.");
  }

  String get dir {
    throw new UnsupportedError(
      "Document fragments don't support text direction.");
  }

  void set dir(String value) {
    throw new UnsupportedError(
      "Document fragments don't support text direction.");
  }

  void set draggable(bool value) {
    throw new UnsupportedError(
      "Draggable can't be set for document fragments.");
  }

  void set hidden(bool value) {
    throw new UnsupportedError(
      "Hidden can't be set for document fragments.");
  }

  void set id(String value) {
    throw new UnsupportedError(
      "ID can't be set for document fragments.");
  }

  String get lang {
    throw new UnsupportedError(
      "Document fragments don't support language.");
  }

  void set lang(String value) {
    throw new UnsupportedError(
      "Document fragments don't support language.");
  }

  void set scrollLeft(int value) {
    throw new UnsupportedError(
      "Document fragments don't support scrolling.");
  }

  void set scrollTop(int value) {
    throw new UnsupportedError(
      "Document fragments don't support scrolling.");
  }

  void set spellcheck(bool value) {
     throw new UnsupportedError(
      "Spellcheck can't be set for document fragments.");
  }

  void set translate(bool value) {
     throw new UnsupportedError(
      "Spellcheck can't be set for document fragments.");
  }

  void set tabIndex(int value) {
    throw new UnsupportedError(
      "Tab index can't be set for document fragments.");
  }

  void set title(String value) {
    throw new UnsupportedError(
      "Title can't be set for document fragments.");
  }

  void set webkitdropzone(String value) {
    throw new UnsupportedError(
      "WebKit drop zone can't be set for document fragments.");
  }

  void set webkitRegionOverflow(String value) {
    throw new UnsupportedError(
      "WebKit region overflow can't be set for document fragments.");
  }

  DocumentFragment.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  ElementEvents get on =>
    new ElementEvents(this);


  /** @domName DocumentFragment.querySelector */
  Element $dom_querySelector(String selectors) native "DocumentFragment_querySelector_Callback";


  /** @domName DocumentFragment.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "DocumentFragment_querySelectorAll_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DocumentType
class DocumentType extends Node {
  DocumentType.internal(): super.internal();


  /** @domName DocumentType.entities */
  NamedNodeMap get entities native "DocumentType_entities_Getter";


  /** @domName DocumentType.internalSubset */
  String get internalSubset native "DocumentType_internalSubset_Getter";


  /** @domName DocumentType.name */
  String get name native "DocumentType_name_Getter";


  /** @domName DocumentType.notations */
  NamedNodeMap get notations native "DocumentType_notations_Getter";


  /** @domName DocumentType.publicId */
  String get publicId native "DocumentType_publicId_Getter";


  /** @domName DocumentType.systemId */
  String get systemId native "DocumentType_systemId_Getter";


  /** @domName DocumentType.remove */
  void remove() native "DocumentType_remove_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMError
class DomError extends NativeFieldWrapperClass1 {
  DomError.internal();


  /** @domName DOMError.name */
  String get name native "DOMError_name_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMException
class DomException extends NativeFieldWrapperClass1 {
  DomException.internal();

  static const int ABORT_ERR = 20;

  static const int DATA_CLONE_ERR = 25;

  static const int DOMSTRING_SIZE_ERR = 2;

  static const int HIERARCHY_REQUEST_ERR = 3;

  static const int INDEX_SIZE_ERR = 1;

  static const int INUSE_ATTRIBUTE_ERR = 10;

  static const int INVALID_ACCESS_ERR = 15;

  static const int INVALID_CHARACTER_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 13;

  static const int INVALID_NODE_TYPE_ERR = 24;

  static const int INVALID_STATE_ERR = 11;

  static const int NAMESPACE_ERR = 14;

  static const int NETWORK_ERR = 19;

  static const int NOT_FOUND_ERR = 8;

  static const int NOT_SUPPORTED_ERR = 9;

  static const int NO_DATA_ALLOWED_ERR = 6;

  static const int NO_MODIFICATION_ALLOWED_ERR = 7;

  static const int QUOTA_EXCEEDED_ERR = 22;

  static const int SECURITY_ERR = 18;

  static const int SYNTAX_ERR = 12;

  static const int TIMEOUT_ERR = 23;

  static const int TYPE_MISMATCH_ERR = 17;

  static const int URL_MISMATCH_ERR = 21;

  static const int VALIDATION_ERR = 16;

  static const int WRONG_DOCUMENT_ERR = 4;


  /** @domName DOMCoreException.code */
  int get code native "DOMCoreException_code_Getter";


  /** @domName DOMCoreException.message */
  String get message native "DOMCoreException_message_Getter";


  /** @domName DOMCoreException.name */
  String get name native "DOMCoreException_name_Getter";


  /** @domName DOMCoreException.toString */
  String toString() native "DOMCoreException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMImplementation
class DomImplementation extends NativeFieldWrapperClass1 {
  DomImplementation.internal();


  /** @domName DOMImplementation.createCSSStyleSheet */
  CssStyleSheet createCssStyleSheet(String title, String media) native "DOMImplementation_createCSSStyleSheet_Callback";


  /** @domName DOMImplementation.createDocument */
  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";


  /** @domName DOMImplementation.createDocumentType */
  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";


  /** @domName DOMImplementation.createHTMLDocument */
  HtmlDocument createHtmlDocument(String title) native "DOMImplementation_createHTMLDocument_Callback";


  /** @domName DOMImplementation.hasFeature */
  bool hasFeature(String feature, String version) native "DOMImplementation_hasFeature_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MimeType
class DomMimeType extends NativeFieldWrapperClass1 {
  DomMimeType.internal();


  /** @domName DOMMimeType.description */
  String get description native "DOMMimeType_description_Getter";


  /** @domName DOMMimeType.enabledPlugin */
  DomPlugin get enabledPlugin native "DOMMimeType_enabledPlugin_Getter";


  /** @domName DOMMimeType.suffixes */
  String get suffixes native "DOMMimeType_suffixes_Getter";


  /** @domName DOMMimeType.type */
  String get type native "DOMMimeType_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MimeTypeArray
class DomMimeTypeArray extends NativeFieldWrapperClass1 implements List<DomMimeType> {
  DomMimeTypeArray.internal();


  /** @domName DOMMimeTypeArray.length */
  int get length native "DOMMimeTypeArray_length_Getter";

  DomMimeType operator[](int index) native "DOMMimeTypeArray_item_Callback";

  void operator[]=(int index, DomMimeType value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DomMimeType> mixins.
  // DomMimeType is the element type.

  // From Iterable<DomMimeType>:

  Iterator<DomMimeType> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<DomMimeType>(this);
  }

  // From Collection<DomMimeType>:

  void add(DomMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DomMimeType value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<DomMimeType> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomMimeType)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(DomMimeType element) => Collections.contains(this, element);

  void forEach(void f(DomMimeType element)) => Collections.forEach(this, f);

  Collection map(f(DomMimeType element)) => Collections.map(this, [], f);

  Collection<DomMimeType> filter(bool f(DomMimeType element)) =>
     Collections.filter(this, <DomMimeType>[], f);

  bool every(bool f(DomMimeType element)) => Collections.every(this, f);

  bool some(bool f(DomMimeType element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<DomMimeType>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(DomMimeType a, DomMimeType b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DomMimeType element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DomMimeType element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  DomMimeType get first => this[0];

  DomMimeType get last => this[length - 1];

  DomMimeType removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  DomMimeType removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<DomMimeType> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DomMimeType initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DomMimeType> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <DomMimeType>[]);

  // -- end List<DomMimeType> mixins.


  /** @domName DOMMimeTypeArray.item */
  DomMimeType item(int index) native "DOMMimeTypeArray_item_Callback";


  /** @domName DOMMimeTypeArray.namedItem */
  DomMimeType namedItem(String name) native "DOMMimeTypeArray_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMParser
class DomParser extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory DomParser() => _DomParserFactoryProvider.createDomParser();
  DomParser.internal();


  /** @domName DOMParser.parseFromString */
  Document parseFromString(String str, String contentType) native "DOMParser_parseFromString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Plugin
class DomPlugin extends NativeFieldWrapperClass1 {
  DomPlugin.internal();


  /** @domName DOMPlugin.description */
  String get description native "DOMPlugin_description_Getter";


  /** @domName DOMPlugin.filename */
  String get filename native "DOMPlugin_filename_Getter";


  /** @domName DOMPlugin.length */
  int get length native "DOMPlugin_length_Getter";


  /** @domName DOMPlugin.name */
  String get name native "DOMPlugin_name_Getter";


  /** @domName DOMPlugin.item */
  DomMimeType item(int index) native "DOMPlugin_item_Callback";


  /** @domName DOMPlugin.namedItem */
  DomMimeType namedItem(String name) native "DOMPlugin_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PluginArray
class DomPluginArray extends NativeFieldWrapperClass1 implements List<DomPlugin> {
  DomPluginArray.internal();


  /** @domName DOMPluginArray.length */
  int get length native "DOMPluginArray_length_Getter";

  DomPlugin operator[](int index) native "DOMPluginArray_item_Callback";

  void operator[]=(int index, DomPlugin value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<DomPlugin> mixins.
  // DomPlugin is the element type.

  // From Iterable<DomPlugin>:

  Iterator<DomPlugin> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<DomPlugin>(this);
  }

  // From Collection<DomPlugin>:

  void add(DomPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(DomPlugin value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<DomPlugin> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, DomPlugin)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(DomPlugin element) => Collections.contains(this, element);

  void forEach(void f(DomPlugin element)) => Collections.forEach(this, f);

  Collection map(f(DomPlugin element)) => Collections.map(this, [], f);

  Collection<DomPlugin> filter(bool f(DomPlugin element)) =>
     Collections.filter(this, <DomPlugin>[], f);

  bool every(bool f(DomPlugin element)) => Collections.every(this, f);

  bool some(bool f(DomPlugin element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<DomPlugin>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(DomPlugin a, DomPlugin b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(DomPlugin element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(DomPlugin element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  DomPlugin get first => this[0];

  DomPlugin get last => this[length - 1];

  DomPlugin removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  DomPlugin removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<DomPlugin> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [DomPlugin initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<DomPlugin> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <DomPlugin>[]);

  // -- end List<DomPlugin> mixins.


  /** @domName DOMPluginArray.item */
  DomPlugin item(int index) native "DOMPluginArray_item_Callback";


  /** @domName DOMPluginArray.namedItem */
  DomPlugin namedItem(String name) native "DOMPluginArray_namedItem_Callback";


  /** @domName DOMPluginArray.refresh */
  void refresh(bool reload) native "DOMPluginArray_refresh_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Selection
class DomSelection extends NativeFieldWrapperClass1 {
  DomSelection.internal();


  /** @domName DOMSelection.anchorNode */
  Node get anchorNode native "DOMSelection_anchorNode_Getter";


  /** @domName DOMSelection.anchorOffset */
  int get anchorOffset native "DOMSelection_anchorOffset_Getter";


  /** @domName DOMSelection.baseNode */
  Node get baseNode native "DOMSelection_baseNode_Getter";


  /** @domName DOMSelection.baseOffset */
  int get baseOffset native "DOMSelection_baseOffset_Getter";


  /** @domName DOMSelection.extentNode */
  Node get extentNode native "DOMSelection_extentNode_Getter";


  /** @domName DOMSelection.extentOffset */
  int get extentOffset native "DOMSelection_extentOffset_Getter";


  /** @domName DOMSelection.focusNode */
  Node get focusNode native "DOMSelection_focusNode_Getter";


  /** @domName DOMSelection.focusOffset */
  int get focusOffset native "DOMSelection_focusOffset_Getter";


  /** @domName DOMSelection.isCollapsed */
  bool get isCollapsed native "DOMSelection_isCollapsed_Getter";


  /** @domName DOMSelection.rangeCount */
  int get rangeCount native "DOMSelection_rangeCount_Getter";


  /** @domName DOMSelection.type */
  String get type native "DOMSelection_type_Getter";


  /** @domName DOMSelection.addRange */
  void addRange(Range range) native "DOMSelection_addRange_Callback";


  /** @domName DOMSelection.collapse */
  void collapse(Node node, int index) native "DOMSelection_collapse_Callback";


  /** @domName DOMSelection.collapseToEnd */
  void collapseToEnd() native "DOMSelection_collapseToEnd_Callback";


  /** @domName DOMSelection.collapseToStart */
  void collapseToStart() native "DOMSelection_collapseToStart_Callback";


  /** @domName DOMSelection.containsNode */
  bool containsNode(Node node, bool allowPartial) native "DOMSelection_containsNode_Callback";


  /** @domName DOMSelection.deleteFromDocument */
  void deleteFromDocument() native "DOMSelection_deleteFromDocument_Callback";


  /** @domName DOMSelection.empty */
  void empty() native "DOMSelection_empty_Callback";


  /** @domName DOMSelection.extend */
  void extend(Node node, int offset) native "DOMSelection_extend_Callback";


  /** @domName DOMSelection.getRangeAt */
  Range getRangeAt(int index) native "DOMSelection_getRangeAt_Callback";


  /** @domName DOMSelection.modify */
  void modify(String alter, String direction, String granularity) native "DOMSelection_modify_Callback";


  /** @domName DOMSelection.removeAllRanges */
  void removeAllRanges() native "DOMSelection_removeAllRanges_Callback";


  /** @domName DOMSelection.selectAllChildren */
  void selectAllChildren(Node node) native "DOMSelection_selectAllChildren_Callback";


  /** @domName DOMSelection.setBaseAndExtent */
  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) native "DOMSelection_setBaseAndExtent_Callback";


  /** @domName DOMSelection.setPosition */
  void setPosition(Node node, int offset) native "DOMSelection_setPosition_Callback";


  /** @domName DOMSelection.toString */
  String toString() native "DOMSelection_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMSettableTokenList
class DomSettableTokenList extends DomTokenList {
  DomSettableTokenList.internal(): super.internal();


  /** @domName DOMSettableTokenList.value */
  String get value native "DOMSettableTokenList_value_Getter";


  /** @domName DOMSettableTokenList.value */
  void set value(String value) native "DOMSettableTokenList_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMStringList
class DomStringList extends NativeFieldWrapperClass1 implements List<String> {
  DomStringList.internal();


  /** @domName DOMStringList.length */
  int get length native "DOMStringList_length_Getter";

  String operator[](int index) native "DOMStringList_item_Callback";

  void operator[]=(int index, String value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<String> mixins.
  // String is the element type.

  // From Iterable<String>:

  Iterator<String> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<String>(this);
  }

  // From Collection<String>:

  void add(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(String value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<String> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, String)) {
    return Collections.reduce(this, initialValue, combine);
  }

  // contains() defined by IDL.

  void forEach(void f(String element)) => Collections.forEach(this, f);

  Collection map(f(String element)) => Collections.map(this, [], f);

  Collection<String> filter(bool f(String element)) =>
     Collections.filter(this, <String>[], f);

  bool every(bool f(String element)) => Collections.every(this, f);

  bool some(bool f(String element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<String>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(String a, String b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(String element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(String element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  String get first => this[0];

  String get last => this[length - 1];

  String removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  String removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<String> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [String initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<String> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <String>[]);

  // -- end List<String> mixins.


  /** @domName DOMStringList.contains */
  bool contains(String string) native "DOMStringList_contains_Callback";


  /** @domName DOMStringList.item */
  String item(int index) native "DOMStringList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMStringMap
class DomStringMap extends NativeFieldWrapperClass1 {
  DomStringMap.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMTokenList
class DomTokenList extends NativeFieldWrapperClass1 {
  DomTokenList.internal();


  /** @domName DOMTokenList.length */
  int get length native "DOMTokenList_length_Getter";


  /** @domName DOMTokenList.contains */
  bool contains(String token) native "DOMTokenList_contains_Callback";


  /** @domName DOMTokenList.item */
  String item(int index) native "DOMTokenList_item_Callback";


  /** @domName DOMTokenList.toString */
  String toString() native "DOMTokenList_toString_Callback";

  bool toggle(/*DOMString*/ token, [/*boolean*/ force]) {
    if (?force) {
      return _toggle_1(token, force);
    }
    return _toggle_2(token);
  }


  /** @domName DOMTokenList.toggle_1 */
  bool _toggle_1(token, force) native "DOMTokenList_toggle_1_Callback";


  /** @domName DOMTokenList.toggle_2 */
  bool _toggle_2(token) native "DOMTokenList_toggle_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// TODO(jacobr): use _Lists.dart to remove some of the duplicated
// functionality.
class _ChildrenElementList implements List {
  // Raw Element.
  final Element _element;
  final HtmlCollection _childElements;

  _ChildrenElementList._wrap(Element element)
    : _childElements = element.$dom_children,
      _element = element;

  List<Element> _toList() {
    final output = new List(_childElements.length);
    for (int i = 0, len = _childElements.length; i < len; i++) {
      output[i] = _childElements[i];
    }
    return output;
  }

  bool contains(Element element) => _childElements.contains(element);

  void forEach(void f(Element element)) {
    for (Element element in _childElements) {
      f(element);
    }
  }

  List<Element> filter(bool f(Element element)) {
    final output = [];
    forEach((Element element) {
      if (f(element)) {
        output.add(element);
      }
    });
    return new _FrozenElementList._wrap(output);
  }

  bool every(bool f(Element element)) {
    for (Element element in this) {
      if (!f(element)) {
        return false;
      }
    };
    return true;
  }

  bool some(bool f(Element element)) {
    for (Element element in this) {
      if (f(element)) {
        return true;
      }
    };
    return false;
  }

  Collection map(f(Element element)) {
    final out = [];
    for (Element el in this) {
      out.add(f(el));
    }
    return out;
  }

  bool get isEmpty {
    return _element.$dom_firstElementChild == null;
  }

  int get length {
    return _childElements.length;
  }

  Element operator [](int index) {
    return _childElements[index];
  }

  void operator []=(int index, Element value) {
    _element.$dom_replaceChild(value, _childElements[index]);
  }

   void set length(int newLength) {
     // TODO(jacobr): remove children when length is reduced.
     throw new UnsupportedError('');
   }

  Element add(Element value) {
    _element.$dom_appendChild(value);
    return value;
  }

  Element addLast(Element value) => add(value);

  Iterator<Element> iterator() => _toList().iterator();

  void addAll(Collection<Element> collection) {
    for (Element element in collection) {
      _element.$dom_appendChild(element);
    }
  }

  void sort([int compare(Element a, Element b)]) {
    throw new UnsupportedError('TODO(jacobr): should we impl?');
  }

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Element element)) {
    return Collections.reduce(this, initialValue, combine);
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnimplementedError();
  }

  void removeRange(int start, int rangeLength) {
    throw new UnimplementedError();
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnimplementedError();
  }

  List getRange(int start, int rangeLength) =>
    new _FrozenElementList._wrap(Lists.getRange(this, start, rangeLength,
        []));

  int indexOf(Element element, [int start = 0]) {
    return Lists.indexOf(this, element, start, this.length);
  }

  int lastIndexOf(Element element, [int start = null]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  void clear() {
    // It is unclear if we want to keep non element nodes?
    _element.text = '';
  }

  Element removeAt(int index) {
    final result = this[index];
    if (result != null) {
      _element.$dom_removeChild(result);
    }
    return result;
  }

  Element removeLast() {
    final result = this.last;
    if (result != null) {
      _element.$dom_removeChild(result);
    }
    return result;
  }

  Element get first {
    return _element.$dom_firstElementChild;
  }


  Element get last {
    return _element.$dom_lastElementChild;
  }
}

// TODO(jacobr): this is an inefficient implementation but it is hard to see
// a better option given that we cannot quite force NodeList to be an
// ElementList as there are valid cases where a NodeList JavaScript object
// contains Node objects that are not Elements.
class _FrozenElementList implements List {
  final List<Node> _nodeList;

  _FrozenElementList._wrap(this._nodeList);

  bool contains(Element element) {
    for (Element el in this) {
      if (el == element) return true;
    }
    return false;
  }

  void forEach(void f(Element element)) {
    for (Element el in this) {
      f(el);
    }
  }

  Collection map(f(Element element)) {
    final out = [];
    for (Element el in this) {
      out.add(f(el));
    }
    return out;
  }

  List<Element> filter(bool f(Element element)) {
    final out = [];
    for (Element el in this) {
      if (f(el)) out.add(el);
    }
    return out;
  }

  bool every(bool f(Element element)) {
    for(Element element in this) {
      if (!f(element)) {
        return false;
      }
    };
    return true;
  }

  bool some(bool f(Element element)) {
    for(Element element in this) {
      if (f(element)) {
        return true;
      }
    };
    return false;
  }

  bool get isEmpty => _nodeList.isEmpty;

  int get length => _nodeList.length;

  Element operator [](int index) => _nodeList[index];

  void operator []=(int index, Element value) {
    throw new UnsupportedError('');
  }

  void set length(int newLength) {
    _nodeList.length = newLength;
  }

  void add(Element value) {
    throw new UnsupportedError('');
  }

  void addLast(Element value) {
    throw new UnsupportedError('');
  }

  Iterator<Element> iterator() => new _FrozenElementListIterator(this);

  void addAll(Collection<Element> collection) {
    throw new UnsupportedError('');
  }

  void sort([int compare(Element a, Element b)]) {
    throw new UnsupportedError('');
  }

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Element element)) {
    return Collections.reduce(this, initialValue, combine);
  }

  void setRange(int start, int rangeLength, List from, [int startFrom = 0]) {
    throw new UnsupportedError('');
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError('');
  }

  void insertRange(int start, int rangeLength, [initialValue = null]) {
    throw new UnsupportedError('');
  }

  List<Element> getRange(int start, int rangeLength) =>
    new _FrozenElementList._wrap(_nodeList.getRange(start, rangeLength));

  int indexOf(Element element, [int start = 0]) =>
    _nodeList.indexOf(element, start);

  int lastIndexOf(Element element, [int start = null]) =>
    _nodeList.lastIndexOf(element, start);

  void clear() {
    throw new UnsupportedError('');
  }

  Element removeAt(int index) {
    throw new UnsupportedError('');
  }

  Element removeLast() {
    throw new UnsupportedError('');
  }

  Element get first => _nodeList.first;

  Element get last => _nodeList.last;
}

class _FrozenElementListIterator implements Iterator<Element> {
  final _FrozenElementList _list;
  int _index = 0;

  _FrozenElementListIterator(this._list);

  /**
   * Gets the next element in the iteration. Throws a
   * [StateError("No more elements")] if no element is left.
   */
  Element next() {
    if (!hasNext) {
      throw new StateError("No more elements");
    }

    return _list[_index++];
  }

  /**
   * Returns whether the [Iterator] has elements left.
   */
  bool get hasNext => _index < _list.length;
}

class _ElementCssClassSet extends CssClassSet {

  final Element _element;

  _ElementCssClassSet(this._element);

  Set<String> readClasses() {
    var s = new Set<String>();
    var classname = _element.$dom_className;

    for (String name in classname.split(' ')) {
      String trimmed = name.trim();
      if (!trimmed.isEmpty) {
        s.add(trimmed);
      }
    }
    return s;
  }

  void writeClasses(Set<String> s) {
    List list = new List.from(s);
    _element.$dom_className = Strings.join(list, ' ');
  }
}

/**
 * An abstract class, which all HTML elements extend.
 */
abstract class Element extends Node implements ElementTraversal {

  /**
   * Creates an HTML element from a valid fragment of HTML.
   *
   * The [html] fragment must represent valid HTML with a single element root,
   * which will be parsed and returned.
   *
   * Important: the contents of [html] should not contain any user-supplied
   * data. Without strict data validation it is impossible to prevent script
   * injection exploits.
   *
   * It is instead recommended that elements be constructed via [Element.tag]
   * and text be added via [text].
   *
   *     var element = new Element.html('<div class="foo">content</div>');
   */
  factory Element.html(String html) =>
      _ElementFactoryProvider.createElement_html(html);

  /**
   * Creates the HTML element specified by the tag name.
   *
   * This is similar to [Document.createElement].
   * [tag] should be a valid HTML tag name. If [tag] is an unknown tag then
   * this will create an [UnknownElement].
   *
   *     var divElement = new Element.tag('div');
   *     print(divElement is DivElement); // 'true'
   *     var myElement = new Element.tag('unknownTag');
   *     print(myElement is UnknownElement); // 'true'
   *
   * For standard elements it is more preferable to use the type constructors:
   *     var element = new DivElement();
   */
  factory Element.tag(String tag) =>
      _ElementFactoryProvider.createElement_tag(tag);

  /**
   * All attributes on this element.
   *
   * Any modifications to the attribute map will automatically be applied to
   * this element.
   *
   * This only includes attributes which are not in a namespace
   * (such as 'xlink:href'), additional attributes can be accessed via
   * [getNamespacedAttributes].
   */
  Map<String, String> get attributes => new _ElementAttributeMap(this);

  void set attributes(Map<String, String> value) {
    Map<String, String> attributes = this.attributes;
    attributes.clear();
    for (String key in value.keys) {
      attributes[key] = value[key];
    }
  }

  /**
   * Deprecated, use innerHtml instead.
   */
  @deprecated
  String get innerHTML => this.innerHtml;
  @deprecated
  void set innerHTML(String value) {
    this.innerHtml = value;
  }

  @deprecated
  void set elements(Collection<Element> value) {
    this.children = value;
  }

  /**
   * Deprecated, use [children] instead.
   */
  @deprecated
  List<Element> get elements => this.children;

  /**
   * List of the direct children of this element.
   *
   * This collection can be used to add and remove elements from the document.
   *
   *     var item = new DivElement();
   *     item.text = 'Something';
   *     document.body.children.add(item) // Item is now displayed on the page.
   *     for (var element in document.body.children) {
   *       element.style.background = 'red'; // Turns every child of body red.
   *     }
   */
  List<Element> get children => new _ChildrenElementList._wrap(this);

  void set children(List<Element> value) {
    // Copy list first since we don't want liveness during iteration.
    List copy = new List.from(value);
    var children = this.children;
    children.clear();
    children.addAll(copy);
  }

  /**
   * Finds the first descendant element of this element that matches the
   * specified group of selectors.
   *
   * [selectors] should be a string using CSS selector syntax.
   *
   *     // Gets the first descendant with the class 'classname'
   *     var element = element.query('.className');
   *     // Gets the element with id 'id'
   *     var element = element.query('#id');
   *     // Gets the first descendant [ImageElement]
   *     var img = element.query('img');
   *
   * See also:
   *
   * * [CSS Selectors](http://docs.webplatform.org/wiki/css/selectors)
   */
  Element query(String selectors) => $dom_querySelector(selectors);

  /**
   * Finds all descendent elements of this element that match the specified
   * group of selectors.
   *
   * [selectors] should be a string using CSS selector syntax.
   *
   *     var items = element.query('.itemClassName');
   */
  List<Element> queryAll(String selectors) =>
    new _FrozenElementList._wrap($dom_querySelectorAll(selectors));

  /**
   * The set of CSS classes applied to this element.
   *
   * This set makes it easy to add, remove or toggle the classes applied to
   * this element.
   *
   *     element.classes.add('selected');
   *     element.classes.toggle('isOnline');
   *     element.classes.remove('selected');
   */
  CssClassSet get classes => new _ElementCssClassSet(this);

  void set classes(Collection<String> value) {
    CssClassSet classSet = classes;
    classSet.clear();
    classSet.addAll(value);
  }

  /**
   * Allows access to all custom data attributes (data-*) set on this element.
   *
   * The keys for the map must follow these rules:
   *
   * * The name must not begin with 'xml'.
   * * The name cannot contain a semi-colon (';').
   * * The name cannot contain any capital letters.
   *
   * Any keys from markup will be converted to camel-cased keys in the map.
   *
   * For example, HTML specified as:
   *
   *     <div data-my-random-value='value'></div>
   *
   * Would be accessed in Dart as:
   *
   *     var value = element.dataAttributes['myRandomValue'];
   *
   * See also:
   *
   * * [Custom data attributes](http://www.w3.org/TR/html5/global-attributes.html#custom-data-attribute)
   */
  Map<String, String> get dataAttributes =>
    new _DataAttributeMap(attributes);

  void set dataAttributes(Map<String, String> value) {
    final dataAttributes = this.dataAttributes;
    dataAttributes.clear();
    for (String key in value.keys) {
      dataAttributes[key] = value[key];
    }
  }

  /**
   * Gets a map for manipulating the attributes of a particular namespace.
   *
   * This is primarily useful for SVG attributes such as xref:link.
   */
  Map<String, String> getNamespacedAttributes(String namespace) {
    return new _NamespacedAttributeMap(this, namespace);
  }

  /**
   * The set of all CSS values applied to this element, including inherited
   * and default values.
   *
   * The computedStyle contains values that are inherited from other
   * sources, such as parent elements or stylesheets. This differs from the
   * [style] property, which contains only the values specified directly on this
   * element.
   *
   * See also:
   *
   * * [CSS Inheritance and Cascade](http://docs.webplatform.org/wiki/tutorials/inheritance_and_cascade)
   */
  Future<CssStyleDeclaration> get computedStyle {
     // TODO(jacobr): last param should be null, see b/5045788
     return getComputedStyle('');
  }

  /**
   * Returns the computed styles for pseudo-elements such as `::after`,
   * `::before`, `::marker`, `::line-marker`.
   *
   * See also:
   *
   * * [Pseudo-elements](http://docs.webplatform.org/wiki/css/selectors/pseudo-elements)
   */
  Future<CssStyleDeclaration> getComputedStyle(String pseudoElement) {
    return _createMeasurementFuture(
        () => window.$dom_getComputedStyle(this, pseudoElement),
        new Completer<CssStyleDeclaration>());
  }

  /**
   * Adds the specified element to after the last child of this element.
   */
  void append(Element e) {
    this.children.add(e);
  }

  /**
   * Adds the specified text as a text node after the last child of this
   * element.
   */
  void appendText(String text) {
    this.insertAdjacentText('beforeend', text);
  }

  /**
   * Parses the specified text as HTML and adds the resulting node after the
   * last child of this element.
   */
  void appendHtml(String text) {
    this.insertAdjacentHtml('beforeend', text);
  }

  // Hooks to support custom WebComponents.
  /**
   * Experimental support for [web components][wc]. This field stores a
   * reference to the component implementation. It was inspired by Mozilla's
   * [x-tags][] project. Please note: in the future it may be possible to
   * `extend Element` from your class, in which case this field will be
   * deprecated and will simply return this [Element] object.
   *
   * [wc]: http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html
   * [x-tags]: http://x-tags.org/
   */
  var xtag;

  noSuchMethod(InvocationMirror invocation) {
    if (dynamicUnknownElementDispatcher == null) {
      throw new NoSuchMethodError(this, invocation.memberName,
                                        invocation.positionalArguments,
                                        invocation.namedArguments);
    } else {
      String hackedName = invocation.memberName;
      if (invocation.isGetter) hackedName = "get:$hackedName";
      if (invocation.isSetter) hackedName = "set:$hackedName";
      return dynamicUnknownElementDispatcher(this,
                                             hackedName,
                                             invocation.positionalArguments);
    }
  }


  Element.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  ElementEvents get on =>
    new ElementEvents(this);

  /// @domName HTMLElement.children; @docsEditable true
  HtmlCollection get $dom_children;

  /// @domName HTMLElement.contentEditable; @docsEditable true
  String contentEditable;

  /// @domName HTMLElement.dir; @docsEditable true
  String dir;

  /// @domName HTMLElement.draggable; @docsEditable true
  bool draggable;

  /// @domName HTMLElement.hidden; @docsEditable true
  bool hidden;

  /// @domName HTMLElement.id; @docsEditable true
  String id;

  /// @domName HTMLElement.innerHTML; @docsEditable true
  String innerHtml;

  /// @domName HTMLElement.isContentEditable; @docsEditable true
  bool get isContentEditable;

  /// @domName HTMLElement.lang; @docsEditable true
  String lang;

  /// @domName HTMLElement.outerHTML; @docsEditable true
  String get outerHtml;

  /// @domName HTMLElement.spellcheck; @docsEditable true
  bool spellcheck;

  /// @domName HTMLElement.tabIndex; @docsEditable true
  int tabIndex;

  /// @domName HTMLElement.title; @docsEditable true
  String title;

  /// @domName HTMLElement.translate; @docsEditable true
  bool translate;

  /// @domName HTMLElement.webkitdropzone; @docsEditable true
  String webkitdropzone;

  /// @domName HTMLElement.click; @docsEditable true
  void click();

  /// @domName HTMLElement.insertAdjacentElement; @docsEditable true
  Element insertAdjacentElement(String where, Element element);

  /// @domName HTMLElement.insertAdjacentHTML; @docsEditable true
  void insertAdjacentHtml(String where, String html);

  /// @domName HTMLElement.insertAdjacentText; @docsEditable true
  void insertAdjacentText(String where, String text);

  static const int ALLOW_KEYBOARD_INPUT = 1;


  /** @domName Element.childElementCount */
  int get $dom_childElementCount native "Element_childElementCount_Getter";


  /** @domName Element.className */
  String get $dom_className native "Element_className_Getter";


  /** @domName Element.className */
  void set $dom_className(String value) native "Element_className_Setter";


  /** @domName Element.clientHeight */
  int get clientHeight native "Element_clientHeight_Getter";


  /** @domName Element.clientLeft */
  int get clientLeft native "Element_clientLeft_Getter";


  /** @domName Element.clientTop */
  int get clientTop native "Element_clientTop_Getter";


  /** @domName Element.clientWidth */
  int get clientWidth native "Element_clientWidth_Getter";


  /** @domName Element.dataset */
  Map<String, String> get dataset native "Element_dataset_Getter";


  /** @domName Element.firstElementChild */
  Element get $dom_firstElementChild native "Element_firstElementChild_Getter";


  /** @domName Element.lastElementChild */
  Element get $dom_lastElementChild native "Element_lastElementChild_Getter";


  /** @domName Element.nextElementSibling */
  Element get nextElementSibling native "Element_nextElementSibling_Getter";


  /** @domName Element.offsetHeight */
  int get offsetHeight native "Element_offsetHeight_Getter";


  /** @domName Element.offsetLeft */
  int get offsetLeft native "Element_offsetLeft_Getter";


  /** @domName Element.offsetParent */
  Element get offsetParent native "Element_offsetParent_Getter";


  /** @domName Element.offsetTop */
  int get offsetTop native "Element_offsetTop_Getter";


  /** @domName Element.offsetWidth */
  int get offsetWidth native "Element_offsetWidth_Getter";


  /** @domName Element.previousElementSibling */
  Element get previousElementSibling native "Element_previousElementSibling_Getter";


  /** @domName Element.scrollHeight */
  int get scrollHeight native "Element_scrollHeight_Getter";


  /** @domName Element.scrollLeft */
  int get scrollLeft native "Element_scrollLeft_Getter";


  /** @domName Element.scrollLeft */
  void set scrollLeft(int value) native "Element_scrollLeft_Setter";


  /** @domName Element.scrollTop */
  int get scrollTop native "Element_scrollTop_Getter";


  /** @domName Element.scrollTop */
  void set scrollTop(int value) native "Element_scrollTop_Setter";


  /** @domName Element.scrollWidth */
  int get scrollWidth native "Element_scrollWidth_Getter";


  /** @domName Element.style */
  CssStyleDeclaration get style native "Element_style_Getter";


  /** @domName Element.tagName */
  String get tagName native "Element_tagName_Getter";


  /** @domName Element.blur */
  void blur() native "Element_blur_Callback";


  /** @domName Element.focus */
  void focus() native "Element_focus_Callback";


  /** @domName Element.getAttribute */
  String $dom_getAttribute(String name) native "Element_getAttribute_Callback";


  /** @domName Element.getAttributeNS */
  String $dom_getAttributeNS(String namespaceURI, String localName) native "Element_getAttributeNS_Callback";


  /** @domName Element.getBoundingClientRect */
  ClientRect getBoundingClientRect() native "Element_getBoundingClientRect_Callback";


  /** @domName Element.getClientRects */
  List<ClientRect> getClientRects() native "Element_getClientRects_Callback";


  /** @domName Element.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String name) native "Element_getElementsByClassName_Callback";


  /** @domName Element.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String name) native "Element_getElementsByTagName_Callback";


  /** @domName Element.hasAttribute */
  bool $dom_hasAttribute(String name) native "Element_hasAttribute_Callback";


  /** @domName Element.hasAttributeNS */
  bool $dom_hasAttributeNS(String namespaceURI, String localName) native "Element_hasAttributeNS_Callback";


  /** @domName Element.querySelector */
  Element $dom_querySelector(String selectors) native "Element_querySelector_Callback";


  /** @domName Element.querySelectorAll */
  List<Node> $dom_querySelectorAll(String selectors) native "Element_querySelectorAll_Callback";


  /** @domName Element.remove */
  void remove() native "Element_remove_Callback";


  /** @domName Element.removeAttribute */
  void $dom_removeAttribute(String name) native "Element_removeAttribute_Callback";


  /** @domName Element.removeAttributeNS */
  void $dom_removeAttributeNS(String namespaceURI, String localName) native "Element_removeAttributeNS_Callback";


  /** @domName Element.scrollByLines */
  void scrollByLines(int lines) native "Element_scrollByLines_Callback";


  /** @domName Element.scrollByPages */
  void scrollByPages(int pages) native "Element_scrollByPages_Callback";

  void scrollIntoView([/*boolean*/ centerIfNeeded]) {
    if (?centerIfNeeded) {
      _scrollIntoViewIfNeeded_1(centerIfNeeded);
      return;
    }
    _scrollIntoViewIfNeeded_2();
  }


  /** @domName Element.scrollIntoViewIfNeeded_1 */
  void _scrollIntoViewIfNeeded_1(centerIfNeeded) native "Element_scrollIntoViewIfNeeded_1_Callback";


  /** @domName Element.scrollIntoViewIfNeeded_2 */
  void _scrollIntoViewIfNeeded_2() native "Element_scrollIntoViewIfNeeded_2_Callback";


  /** @domName Element.setAttribute */
  void $dom_setAttribute(String name, String value) native "Element_setAttribute_Callback";


  /** @domName Element.setAttributeNS */
  void $dom_setAttributeNS(String namespaceURI, String qualifiedName, String value) native "Element_setAttributeNS_Callback";


  /** @domName Element.webkitMatchesSelector */
  bool matchesSelector(String selectors) native "Element_webkitMatchesSelector_Callback";


  /** @domName Element.webkitRequestFullScreen */
  void webkitRequestFullScreen(int flags) native "Element_webkitRequestFullScreen_Callback";


  /** @domName Element.webkitRequestFullscreen */
  void webkitRequestFullscreen() native "Element_webkitRequestFullscreen_Callback";


  /** @domName Element.webkitRequestPointerLock */
  void webkitRequestPointerLock() native "Element_webkitRequestPointerLock_Callback";

}

// Temporary dispatch hook to support WebComponents.
Function dynamicUnknownElementDispatcher;

final _START_TAG_REGEXP = new RegExp('<(\\w+)');
class _ElementFactoryProvider {
  static final _CUSTOM_PARENT_TAG_MAP = const {
    'body' : 'html',
    'head' : 'html',
    'caption' : 'table',
    'td': 'tr',
    'colgroup': 'table',
    'col' : 'colgroup',
    'tr' : 'tbody',
    'tbody' : 'table',
    'tfoot' : 'table',
    'thead' : 'table',
    'track' : 'audio',
  };

  /** @domName Document.createElement */
  static Element createElement_html(String html) {
    // TODO(jacobr): this method can be made more robust and performant.
    // 1) Cache the dummy parent elements required to use innerHTML rather than
    //    creating them every call.
    // 2) Verify that the html does not contain leading or trailing text nodes.
    // 3) Verify that the html does not contain both <head> and <body> tags.
    // 4) Detatch the created element from its dummy parent.
    String parentTag = 'div';
    String tag;
    final match = _START_TAG_REGEXP.firstMatch(html);
    if (match != null) {
      tag = match.group(1).toLowerCase();
      if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) {
        parentTag = _CUSTOM_PARENT_TAG_MAP[tag];
      }
    }
    final Element temp = new Element.tag(parentTag);
    temp.innerHtml = html;

    Element element;
    if (temp.children.length == 1) {
      element = temp.children[0];
    } else if (parentTag == 'html' && temp.children.length == 2) {
      // Work around for edge case in WebKit and possibly other browsers where
      // both body and head elements are created even though the inner html
      // only contains a head or body element.
      element = temp.children[tag == 'head' ? 0 : 1];
    } else {
      throw new ArgumentError('HTML had ${temp.children.length} '
          'top level elements but 1 expected');
    }
    element.remove();
    return element;
  }

  /** @domName Document.createElement */
  static Element createElement_tag(String tag) =>
      document.$dom_createElement(tag);
}

/// @docsEditable true
class ElementEvents extends Events {
  /// @docsEditable true
  ElementEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get beforeCopy => this['beforecopy'];

  /// @docsEditable true
  EventListenerList get beforeCut => this['beforecut'];

  /// @docsEditable true
  EventListenerList get beforePaste => this['beforepaste'];

  /// @docsEditable true
  EventListenerList get blur => this['blur'];

  /// @docsEditable true
  EventListenerList get change => this['change'];

  /// @docsEditable true
  EventListenerList get click => this['click'];

  /// @docsEditable true
  EventListenerList get contextMenu => this['contextmenu'];

  /// @docsEditable true
  EventListenerList get copy => this['copy'];

  /// @docsEditable true
  EventListenerList get cut => this['cut'];

  /// @docsEditable true
  EventListenerList get doubleClick => this['dblclick'];

  /// @docsEditable true
  EventListenerList get drag => this['drag'];

  /// @docsEditable true
  EventListenerList get dragEnd => this['dragend'];

  /// @docsEditable true
  EventListenerList get dragEnter => this['dragenter'];

  /// @docsEditable true
  EventListenerList get dragLeave => this['dragleave'];

  /// @docsEditable true
  EventListenerList get dragOver => this['dragover'];

  /// @docsEditable true
  EventListenerList get dragStart => this['dragstart'];

  /// @docsEditable true
  EventListenerList get drop => this['drop'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get focus => this['focus'];

  /// @docsEditable true
  EventListenerList get input => this['input'];

  /// @docsEditable true
  EventListenerList get invalid => this['invalid'];

  /// @docsEditable true
  EventListenerList get keyDown => this['keydown'];

  /// @docsEditable true
  EventListenerList get keyPress => this['keypress'];

  /// @docsEditable true
  EventListenerList get keyUp => this['keyup'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get mouseDown => this['mousedown'];

  /// @docsEditable true
  EventListenerList get mouseMove => this['mousemove'];

  /// @docsEditable true
  EventListenerList get mouseOut => this['mouseout'];

  /// @docsEditable true
  EventListenerList get mouseOver => this['mouseover'];

  /// @docsEditable true
  EventListenerList get mouseUp => this['mouseup'];

  /// @docsEditable true
  EventListenerList get mouseWheel => this['mousewheel'];

  /// @docsEditable true
  EventListenerList get paste => this['paste'];

  /// @docsEditable true
  EventListenerList get reset => this['reset'];

  /// @docsEditable true
  EventListenerList get scroll => this['scroll'];

  /// @docsEditable true
  EventListenerList get search => this['search'];

  /// @docsEditable true
  EventListenerList get select => this['select'];

  /// @docsEditable true
  EventListenerList get selectStart => this['selectstart'];

  /// @docsEditable true
  EventListenerList get submit => this['submit'];

  /// @docsEditable true
  EventListenerList get touchCancel => this['touchcancel'];

  /// @docsEditable true
  EventListenerList get touchEnd => this['touchend'];

  /// @docsEditable true
  EventListenerList get touchEnter => this['touchenter'];

  /// @docsEditable true
  EventListenerList get touchLeave => this['touchleave'];

  /// @docsEditable true
  EventListenerList get touchMove => this['touchmove'];

  /// @docsEditable true
  EventListenerList get touchStart => this['touchstart'];

  /// @docsEditable true
  EventListenerList get transitionEnd => this['webkitTransitionEnd'];

  /// @docsEditable true
  EventListenerList get fullscreenChange => this['webkitfullscreenchange'];

  /// @docsEditable true
  EventListenerList get fullscreenError => this['webkitfullscreenerror'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ElementTraversal
class ElementTraversal extends NativeFieldWrapperClass1 {
  ElementTraversal.internal();


  /** @domName ElementTraversal.childElementCount */
  int get $dom_childElementCount native "ElementTraversal_childElementCount_Getter";


  /** @domName ElementTraversal.firstElementChild */
  Element get $dom_firstElementChild native "ElementTraversal_firstElementChild_Getter";


  /** @domName ElementTraversal.lastElementChild */
  Element get $dom_lastElementChild native "ElementTraversal_lastElementChild_Getter";


  /** @domName ElementTraversal.nextElementSibling */
  Element get nextElementSibling native "ElementTraversal_nextElementSibling_Getter";


  /** @domName ElementTraversal.previousElementSibling */
  Element get previousElementSibling native "ElementTraversal_previousElementSibling_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLEmbedElement
class EmbedElement extends _Element_Merged {

  ///@docsEditable true
  factory EmbedElement() => document.$dom_createElement("embed");
  EmbedElement.internal(): super.internal();


  /** @domName HTMLEmbedElement.align */
  String get align native "HTMLEmbedElement_align_Getter";


  /** @domName HTMLEmbedElement.align */
  void set align(String value) native "HTMLEmbedElement_align_Setter";


  /** @domName HTMLEmbedElement.height */
  String get height native "HTMLEmbedElement_height_Getter";


  /** @domName HTMLEmbedElement.height */
  void set height(String value) native "HTMLEmbedElement_height_Setter";


  /** @domName HTMLEmbedElement.name */
  String get name native "HTMLEmbedElement_name_Getter";


  /** @domName HTMLEmbedElement.name */
  void set name(String value) native "HTMLEmbedElement_name_Setter";


  /** @domName HTMLEmbedElement.src */
  String get src native "HTMLEmbedElement_src_Getter";


  /** @domName HTMLEmbedElement.src */
  void set src(String value) native "HTMLEmbedElement_src_Setter";


  /** @domName HTMLEmbedElement.type */
  String get type native "HTMLEmbedElement_type_Getter";


  /** @domName HTMLEmbedElement.type */
  void set type(String value) native "HTMLEmbedElement_type_Setter";


  /** @domName HTMLEmbedElement.width */
  String get width native "HTMLEmbedElement_width_Getter";


  /** @domName HTMLEmbedElement.width */
  void set width(String value) native "HTMLEmbedElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EntityReference
class EntityReference extends Node {
  EntityReference.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void EntriesCallback(List<Entry> entries);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Entry
class Entry extends NativeFieldWrapperClass1 {
  Entry.internal();


  /** @domName Entry.filesystem */
  FileSystem get filesystem native "Entry_filesystem_Getter";


  /** @domName Entry.fullPath */
  String get fullPath native "Entry_fullPath_Getter";


  /** @domName Entry.isDirectory */
  bool get isDirectory native "Entry_isDirectory_Getter";


  /** @domName Entry.isFile */
  bool get isFile native "Entry_isFile_Getter";


  /** @domName Entry.name */
  String get name native "Entry_name_Getter";

  void copyTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
    if (?name) {
      _copyTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _copyTo_2(parent);
  }


  /** @domName Entry.copyTo_1 */
  void _copyTo_1(parent, name, successCallback, errorCallback) native "Entry_copyTo_1_Callback";


  /** @domName Entry.copyTo_2 */
  void _copyTo_2(parent) native "Entry_copyTo_2_Callback";


  /** @domName Entry.getMetadata */
  void getMetadata(MetadataCallback successCallback, [ErrorCallback errorCallback]) native "Entry_getMetadata_Callback";


  /** @domName Entry.getParent */
  void getParent([EntryCallback successCallback, ErrorCallback errorCallback]) native "Entry_getParent_Callback";

  void moveTo(/*DirectoryEntry*/ parent, [/*DOMString*/ name, /*EntryCallback*/ successCallback, /*ErrorCallback*/ errorCallback]) {
    if (?name) {
      _moveTo_1(parent, name, successCallback, errorCallback);
      return;
    }
    _moveTo_2(parent);
  }


  /** @domName Entry.moveTo_1 */
  void _moveTo_1(parent, name, successCallback, errorCallback) native "Entry_moveTo_1_Callback";


  /** @domName Entry.moveTo_2 */
  void _moveTo_2(parent) native "Entry_moveTo_2_Callback";


  /** @domName Entry.remove */
  void remove(VoidCallback successCallback, [ErrorCallback errorCallback]) native "Entry_remove_Callback";


  /** @domName Entry.toURL */
  String toUrl() native "Entry_toURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void EntryCallback(Entry entry);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EntrySync
class EntrySync extends NativeFieldWrapperClass1 {
  EntrySync.internal();


  /** @domName EntrySync.filesystem */
  FileSystemSync get filesystem native "EntrySync_filesystem_Getter";


  /** @domName EntrySync.fullPath */
  String get fullPath native "EntrySync_fullPath_Getter";


  /** @domName EntrySync.isDirectory */
  bool get isDirectory native "EntrySync_isDirectory_Getter";


  /** @domName EntrySync.isFile */
  bool get isFile native "EntrySync_isFile_Getter";


  /** @domName EntrySync.name */
  String get name native "EntrySync_name_Getter";


  /** @domName EntrySync.copyTo */
  EntrySync copyTo(DirectoryEntrySync parent, String name) native "EntrySync_copyTo_Callback";


  /** @domName EntrySync.getMetadata */
  Metadata getMetadata() native "EntrySync_getMetadata_Callback";


  /** @domName EntrySync.getParent */
  EntrySync getParent() native "EntrySync_getParent_Callback";


  /** @domName EntrySync.moveTo */
  EntrySync moveTo(DirectoryEntrySync parent, String name) native "EntrySync_moveTo_Callback";


  /** @domName EntrySync.remove */
  void remove() native "EntrySync_remove_Callback";


  /** @domName EntrySync.toURL */
  String toUrl() native "EntrySync_toURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void ErrorCallback(FileError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ErrorEvent
class ErrorEvent extends Event {
  ErrorEvent.internal(): super.internal();


  /** @domName ErrorEvent.filename */
  String get filename native "ErrorEvent_filename_Getter";


  /** @domName ErrorEvent.lineno */
  int get lineno native "ErrorEvent_lineno_Getter";


  /** @domName ErrorEvent.message */
  String get message native "ErrorEvent_message_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Event
class Event extends NativeFieldWrapperClass1 {
  // In JS, canBubble and cancelable are technically required parameters to
  // init*Event. In practice, though, if they aren't provided they simply
  // default to false (since that's Boolean(undefined)).
  //
  // Contrary to JS, we default canBubble and cancelable to true, since that's
  // what people want most of the time anyway.
  factory Event(String type, [bool canBubble = true, bool cancelable = true]) =>
      _EventFactoryProvider.createEvent(type, canBubble, cancelable);
  Event.internal();

  static const int AT_TARGET = 2;

  static const int BLUR = 8192;

  static const int BUBBLING_PHASE = 3;

  static const int CAPTURING_PHASE = 1;

  static const int CHANGE = 32768;

  static const int CLICK = 64;

  static const int DBLCLICK = 128;

  static const int DRAGDROP = 2048;

  static const int FOCUS = 4096;

  static const int KEYDOWN = 256;

  static const int KEYPRESS = 1024;

  static const int KEYUP = 512;

  static const int MOUSEDOWN = 1;

  static const int MOUSEDRAG = 32;

  static const int MOUSEMOVE = 16;

  static const int MOUSEOUT = 8;

  static const int MOUSEOVER = 4;

  static const int MOUSEUP = 2;

  static const int NONE = 0;

  static const int SELECT = 16384;


  /** @domName Event.bubbles */
  bool get bubbles native "Event_bubbles_Getter";


  /** @domName Event.cancelBubble */
  bool get cancelBubble native "Event_cancelBubble_Getter";


  /** @domName Event.cancelBubble */
  void set cancelBubble(bool value) native "Event_cancelBubble_Setter";


  /** @domName Event.cancelable */
  bool get cancelable native "Event_cancelable_Getter";


  /** @domName Event.clipboardData */
  Clipboard get clipboardData native "Event_clipboardData_Getter";


  /** @domName Event.currentTarget */
  EventTarget get currentTarget native "Event_currentTarget_Getter";


  /** @domName Event.defaultPrevented */
  bool get defaultPrevented native "Event_defaultPrevented_Getter";


  /** @domName Event.eventPhase */
  int get eventPhase native "Event_eventPhase_Getter";


  /** @domName Event.returnValue */
  bool get returnValue native "Event_returnValue_Getter";


  /** @domName Event.returnValue */
  void set returnValue(bool value) native "Event_returnValue_Setter";


  /** @domName Event.target */
  EventTarget get target native "Event_target_Getter";


  /** @domName Event.timeStamp */
  int get timeStamp native "Event_timeStamp_Getter";


  /** @domName Event.type */
  String get type native "Event_type_Getter";


  /** @domName Event.initEvent */
  void $dom_initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) native "Event_initEvent_Callback";


  /** @domName Event.preventDefault */
  void preventDefault() native "Event_preventDefault_Callback";


  /** @domName Event.stopImmediatePropagation */
  void stopImmediatePropagation() native "Event_stopImmediatePropagation_Callback";


  /** @domName Event.stopPropagation */
  void stopPropagation() native "Event_stopPropagation_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EventException
class EventException extends NativeFieldWrapperClass1 {
  EventException.internal();

  static const int DISPATCH_REQUEST_ERR = 1;

  static const int UNSPECIFIED_EVENT_TYPE_ERR = 0;


  /** @domName EventException.code */
  int get code native "EventException_code_Getter";


  /** @domName EventException.message */
  String get message native "EventException_message_Getter";


  /** @domName EventException.name */
  String get name native "EventException_name_Getter";


  /** @domName EventException.toString */
  String toString() native "EventException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EventSource
class EventSource extends EventTarget {

  ///@docsEditable true
  factory EventSource(String scriptUrl) => _EventSourceFactoryProvider.createEventSource(scriptUrl);
  EventSource.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  EventSourceEvents get on =>
    new EventSourceEvents(this);

  static const int CLOSED = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;


  /** @domName EventSource.readyState */
  int get readyState native "EventSource_readyState_Getter";


  /** @domName EventSource.url */
  String get url native "EventSource_url_Getter";


  /** @domName EventSource.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_addEventListener_Callback";


  /** @domName EventSource.close */
  void close() native "EventSource_close_Callback";


  /** @domName EventSource.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "EventSource_dispatchEvent_Callback";


  /** @domName EventSource.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventSource_removeEventListener_Callback";

}

/// @docsEditable true
class EventSourceEvents extends Events {
  /// @docsEditable true
  EventSourceEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Base class that supports listening for and dispatching browser events.
 *
 * Events can either be accessed by string name (using the indexed getter) or by
 * getters exposed by subclasses. Use the getters exposed by subclasses when
 * possible for better compile-time type checks.
 * 
 * Using an indexed getter:
 *     events['mouseover'].add((e) => print("Mouse over!"));
 *
 * Using a getter provided by a subclass:
 *     elementEvents.mouseOver.add((e) => print("Mouse over!"));
 */
class Events {
  /* Raw event target. */
  final EventTarget _ptr;

  Events(this._ptr);

  EventListenerList operator [](String type) {
    return new EventListenerList(_ptr, type);
  }
}

/**
 * Supports adding, removing, and dispatching events for a specific event type.
 */
class EventListenerList {

  final EventTarget _ptr;
  final String _type;

  EventListenerList(this._ptr, this._type);

  // TODO(jacobr): implement equals.

  EventListenerList add(EventListener listener,
      [bool useCapture = false]) {
    _add(listener, useCapture);
    return this;
  }

  EventListenerList remove(EventListener listener,
      [bool useCapture = false]) {
    _remove(listener, useCapture);
    return this;
  }

  bool dispatch(Event evt) {
    return _ptr.$dom_dispatchEvent(evt);
  }

  void _add(EventListener listener, bool useCapture) {
    _ptr.$dom_addEventListener(_type, listener, useCapture);
  }

  void _remove(EventListener listener, bool useCapture) {
    _ptr.$dom_removeEventListener(_type, listener, useCapture);
  }
}

/// @domName EventTarget
/**
 * Base class for all browser objects that support events.
 *
 * Use the [on] property to add, remove, and dispatch events (rather than
 * [$dom_addEventListener], [$dom_dispatchEvent], and
 * [$dom_removeEventListener]) for compile-time type checks and a more concise
 * API.
 */ 
class EventTarget extends NativeFieldWrapperClass1 {

  /** @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent */
  Events get on => new Events(this);
  EventTarget.internal();


  /** @domName EventTarget.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_addEventListener_Callback";


  /** @domName EventTarget.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "EventTarget_dispatchEvent_Callback";


  /** @domName EventTarget.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "EventTarget_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EXTTextureFilterAnisotropic
class ExtTextureFilterAnisotropic extends NativeFieldWrapperClass1 {
  ExtTextureFilterAnisotropic.internal();

  static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;

  static const int TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLFieldSetElement
class FieldSetElement extends _Element_Merged {

  ///@docsEditable true
  factory FieldSetElement() => document.$dom_createElement("fieldset");
  FieldSetElement.internal(): super.internal();


  /** @domName HTMLFieldSetElement.disabled */
  bool get disabled native "HTMLFieldSetElement_disabled_Getter";


  /** @domName HTMLFieldSetElement.disabled */
  void set disabled(bool value) native "HTMLFieldSetElement_disabled_Setter";


  /** @domName HTMLFieldSetElement.elements */
  HtmlCollection get elements native "HTMLFieldSetElement_elements_Getter";


  /** @domName HTMLFieldSetElement.form */
  FormElement get form native "HTMLFieldSetElement_form_Getter";


  /** @domName HTMLFieldSetElement.name */
  String get name native "HTMLFieldSetElement_name_Getter";


  /** @domName HTMLFieldSetElement.name */
  void set name(String value) native "HTMLFieldSetElement_name_Setter";


  /** @domName HTMLFieldSetElement.type */
  String get type native "HTMLFieldSetElement_type_Getter";


  /** @domName HTMLFieldSetElement.validationMessage */
  String get validationMessage native "HTMLFieldSetElement_validationMessage_Getter";


  /** @domName HTMLFieldSetElement.validity */
  ValidityState get validity native "HTMLFieldSetElement_validity_Getter";


  /** @domName HTMLFieldSetElement.willValidate */
  bool get willValidate native "HTMLFieldSetElement_willValidate_Getter";


  /** @domName HTMLFieldSetElement.checkValidity */
  bool checkValidity() native "HTMLFieldSetElement_checkValidity_Callback";


  /** @domName HTMLFieldSetElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLFieldSetElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName File
class File extends Blob {
  File.internal(): super.internal();


  /** @domName File.lastModifiedDate */
  Date get lastModifiedDate native "File_lastModifiedDate_Getter";


  /** @domName File.name */
  String get name native "File_name_Getter";


  /** @domName File.webkitRelativePath */
  String get webkitRelativePath native "File_webkitRelativePath_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void FileCallback(File file);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileEntry
class FileEntry extends Entry {
  FileEntry.internal(): super.internal();


  /** @domName FileEntry.createWriter */
  void createWriter(FileWriterCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_createWriter_Callback";


  /** @domName FileEntry.file */
  void file(FileCallback successCallback, [ErrorCallback errorCallback]) native "FileEntry_file_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileEntrySync
class FileEntrySync extends EntrySync {
  FileEntrySync.internal(): super.internal();


  /** @domName FileEntrySync.createWriter */
  FileWriterSync createWriter() native "FileEntrySync_createWriter_Callback";


  /** @domName FileEntrySync.file */
  File file() native "FileEntrySync_file_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileError
class FileError extends NativeFieldWrapperClass1 {
  FileError.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;


  /** @domName FileError.code */
  int get code native "FileError_code_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileException
class FileException extends NativeFieldWrapperClass1 {
  FileException.internal();

  static const int ABORT_ERR = 3;

  static const int ENCODING_ERR = 5;

  static const int INVALID_MODIFICATION_ERR = 9;

  static const int INVALID_STATE_ERR = 7;

  static const int NOT_FOUND_ERR = 1;

  static const int NOT_READABLE_ERR = 4;

  static const int NO_MODIFICATION_ALLOWED_ERR = 6;

  static const int PATH_EXISTS_ERR = 12;

  static const int QUOTA_EXCEEDED_ERR = 10;

  static const int SECURITY_ERR = 2;

  static const int SYNTAX_ERR = 8;

  static const int TYPE_MISMATCH_ERR = 11;


  /** @domName FileException.code */
  int get code native "FileException_code_Getter";


  /** @domName FileException.message */
  String get message native "FileException_message_Getter";


  /** @domName FileException.name */
  String get name native "FileException_name_Getter";


  /** @domName FileException.toString */
  String toString() native "FileException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileList
class FileList extends NativeFieldWrapperClass1 implements List<File> {
  FileList.internal();


  /** @domName FileList.length */
  int get length native "FileList_length_Getter";

  File operator[](int index) native "FileList_item_Callback";

  void operator[]=(int index, File value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<File> mixins.
  // File is the element type.

  // From Iterable<File>:

  Iterator<File> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<File>(this);
  }

  // From Collection<File>:

  void add(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(File value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<File> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, File)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(File element) => Collections.contains(this, element);

  void forEach(void f(File element)) => Collections.forEach(this, f);

  Collection map(f(File element)) => Collections.map(this, [], f);

  Collection<File> filter(bool f(File element)) =>
     Collections.filter(this, <File>[], f);

  bool every(bool f(File element)) => Collections.every(this, f);

  bool some(bool f(File element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<File>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(File a, File b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(File element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(File element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  File get first => this[0];

  File get last => this[length - 1];

  File removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  File removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<File> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [File initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<File> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <File>[]);

  // -- end List<File> mixins.


  /** @domName FileList.item */
  File item(int index) native "FileList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileReader
class FileReader extends EventTarget {

  ///@docsEditable true
  factory FileReader() => _FileReaderFactoryProvider.createFileReader();
  FileReader.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  FileReaderEvents get on =>
    new FileReaderEvents(this);

  static const int DONE = 2;

  static const int EMPTY = 0;

  static const int LOADING = 1;


  /** @domName FileReader.error */
  FileError get error native "FileReader_error_Getter";


  /** @domName FileReader.readyState */
  int get readyState native "FileReader_readyState_Getter";


  /** @domName FileReader.result */
  Object get result native "FileReader_result_Getter";


  /** @domName FileReader.abort */
  void abort() native "FileReader_abort_Callback";


  /** @domName FileReader.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_addEventListener_Callback";


  /** @domName FileReader.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "FileReader_dispatchEvent_Callback";


  /** @domName FileReader.readAsArrayBuffer */
  void readAsArrayBuffer(Blob blob) native "FileReader_readAsArrayBuffer_Callback";


  /** @domName FileReader.readAsBinaryString */
  void readAsBinaryString(Blob blob) native "FileReader_readAsBinaryString_Callback";


  /** @domName FileReader.readAsDataURL */
  void readAsDataUrl(Blob blob) native "FileReader_readAsDataURL_Callback";

  void readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
    if (?encoding) {
      _readAsText_1(blob, encoding);
      return;
    }
    _readAsText_2(blob);
  }


  /** @domName FileReader.readAsText_1 */
  void _readAsText_1(blob, encoding) native "FileReader_readAsText_1_Callback";


  /** @domName FileReader.readAsText_2 */
  void _readAsText_2(blob) native "FileReader_readAsText_2_Callback";


  /** @domName FileReader.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileReader_removeEventListener_Callback";

}

/// @docsEditable true
class FileReaderEvents extends Events {
  /// @docsEditable true
  FileReaderEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get loadEnd => this['loadend'];

  /// @docsEditable true
  EventListenerList get loadStart => this['loadstart'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileReaderSync
class FileReaderSync extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory FileReaderSync() => _FileReaderSyncFactoryProvider.createFileReaderSync();
  FileReaderSync.internal();


  /** @domName FileReaderSync.readAsArrayBuffer */
  ArrayBuffer readAsArrayBuffer(Blob blob) native "FileReaderSync_readAsArrayBuffer_Callback";


  /** @domName FileReaderSync.readAsBinaryString */
  String readAsBinaryString(Blob blob) native "FileReaderSync_readAsBinaryString_Callback";


  /** @domName FileReaderSync.readAsDataURL */
  String readAsDataUrl(Blob blob) native "FileReaderSync_readAsDataURL_Callback";

  String readAsText(/*Blob*/ blob, [/*DOMString*/ encoding]) {
    if (?encoding) {
      return _readAsText_1(blob, encoding);
    }
    return _readAsText_2(blob);
  }


  /** @domName FileReaderSync.readAsText_1 */
  String _readAsText_1(blob, encoding) native "FileReaderSync_readAsText_1_Callback";


  /** @domName FileReaderSync.readAsText_2 */
  String _readAsText_2(blob) native "FileReaderSync_readAsText_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMFileSystem
class FileSystem extends NativeFieldWrapperClass1 {
  FileSystem.internal();


  /** @domName DOMFileSystem.name */
  String get name native "DOMFileSystem_name_Getter";


  /** @domName DOMFileSystem.root */
  DirectoryEntry get root native "DOMFileSystem_root_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void FileSystemCallback(FileSystem fileSystem);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName DOMFileSystemSync
class FileSystemSync extends NativeFieldWrapperClass1 {
  FileSystemSync.internal();


  /** @domName DOMFileSystemSync.name */
  String get name native "DOMFileSystemSync_name_Getter";


  /** @domName DOMFileSystemSync.root */
  DirectoryEntrySync get root native "DOMFileSystemSync_root_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileWriter
class FileWriter extends EventTarget {
  FileWriter.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  FileWriterEvents get on =>
    new FileWriterEvents(this);

  static const int DONE = 2;

  static const int INIT = 0;

  static const int WRITING = 1;


  /** @domName FileWriter.error */
  FileError get error native "FileWriter_error_Getter";


  /** @domName FileWriter.length */
  int get length native "FileWriter_length_Getter";


  /** @domName FileWriter.position */
  int get position native "FileWriter_position_Getter";


  /** @domName FileWriter.readyState */
  int get readyState native "FileWriter_readyState_Getter";


  /** @domName FileWriter.abort */
  void abort() native "FileWriter_abort_Callback";


  /** @domName FileWriter.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_addEventListener_Callback";


  /** @domName FileWriter.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "FileWriter_dispatchEvent_Callback";


  /** @domName FileWriter.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "FileWriter_removeEventListener_Callback";


  /** @domName FileWriter.seek */
  void seek(int position) native "FileWriter_seek_Callback";


  /** @domName FileWriter.truncate */
  void truncate(int size) native "FileWriter_truncate_Callback";


  /** @domName FileWriter.write */
  void write(Blob data) native "FileWriter_write_Callback";

}

/// @docsEditable true
class FileWriterEvents extends Events {
  /// @docsEditable true
  FileWriterEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];

  /// @docsEditable true
  EventListenerList get write => this['write'];

  /// @docsEditable true
  EventListenerList get writeEnd => this['writeend'];

  /// @docsEditable true
  EventListenerList get writeStart => this['writestart'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void FileWriterCallback(FileWriter fileWriter);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FileWriterSync
class FileWriterSync extends NativeFieldWrapperClass1 {
  FileWriterSync.internal();


  /** @domName FileWriterSync.length */
  int get length native "FileWriterSync_length_Getter";


  /** @domName FileWriterSync.position */
  int get position native "FileWriterSync_position_Getter";


  /** @domName FileWriterSync.seek */
  void seek(int position) native "FileWriterSync_seek_Callback";


  /** @domName FileWriterSync.truncate */
  void truncate(int size) native "FileWriterSync_truncate_Callback";


  /** @domName FileWriterSync.write */
  void write(Blob data) native "FileWriterSync_write_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Float32Array
class Float32Array extends ArrayBufferView implements List<num> {

  factory Float32Array(int length) =>
    _TypedArrayFactoryProvider.createFloat32Array(length);

  factory Float32Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat32Array_fromList(list);

  factory Float32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat32Array_fromBuffer(buffer, byteOffset, length);
  Float32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Float32Array.length */
  int get length native "Float32Array_length_Getter";


  /** @domName Float32Array.numericIndexGetter */
  num operator[](int index) native "Float32Array_numericIndexGetter_Callback";


  /** @domName Float32Array.numericIndexSetter */
  void operator[]=(int index, num value) native "Float32Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<num>(this);
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<num> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(num element) => Collections.contains(this, element);

  void forEach(void f(num element)) => Collections.forEach(this, f);

  Collection map(f(num element)) => Collections.map(this, [], f);

  Collection<num> filter(bool f(num element)) =>
     Collections.filter(this, <num>[], f);

  bool every(bool f(num element)) => Collections.every(this, f);

  bool some(bool f(num element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<num>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(num a, num b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  num get first => this[0];

  num get last => this[length - 1];

  num removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  num removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <num>[]);

  // -- end List<num> mixins.


  /** @domName Float32Array.setElements */
  void setElements(Object array, [int offset]) native "Float32Array_setElements_Callback";

  Float32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Float32Array.subarray_1 */
  Float32Array _subarray_1(start, end) native "Float32Array_subarray_1_Callback";


  /** @domName Float32Array.subarray_2 */
  Float32Array _subarray_2(start) native "Float32Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Float64Array
class Float64Array extends ArrayBufferView implements List<num> {

  factory Float64Array(int length) =>
    _TypedArrayFactoryProvider.createFloat64Array(length);

  factory Float64Array.fromList(List<num> list) =>
    _TypedArrayFactoryProvider.createFloat64Array_fromList(list);

  factory Float64Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createFloat64Array_fromBuffer(buffer, byteOffset, length);
  Float64Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 8;


  /** @domName Float64Array.length */
  int get length native "Float64Array_length_Getter";


  /** @domName Float64Array.numericIndexGetter */
  num operator[](int index) native "Float64Array_numericIndexGetter_Callback";


  /** @domName Float64Array.numericIndexSetter */
  void operator[]=(int index, num value) native "Float64Array_numericIndexSetter_Callback";
  // -- start List<num> mixins.
  // num is the element type.

  // From Iterable<num>:

  Iterator<num> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<num>(this);
  }

  // From Collection<num>:

  void add(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(num value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<num> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, num)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(num element) => Collections.contains(this, element);

  void forEach(void f(num element)) => Collections.forEach(this, f);

  Collection map(f(num element)) => Collections.map(this, [], f);

  Collection<num> filter(bool f(num element)) =>
     Collections.filter(this, <num>[], f);

  bool every(bool f(num element)) => Collections.every(this, f);

  bool some(bool f(num element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<num>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(num a, num b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(num element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(num element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  num get first => this[0];

  num get last => this[length - 1];

  num removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  num removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<num> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [num initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<num> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <num>[]);

  // -- end List<num> mixins.


  /** @domName Float64Array.setElements */
  void setElements(Object array, [int offset]) native "Float64Array_setElements_Callback";

  Float64Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Float64Array.subarray_1 */
  Float64Array _subarray_1(start, end) native "Float64Array_subarray_1_Callback";


  /** @domName Float64Array.subarray_2 */
  Float64Array _subarray_2(start) native "Float64Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLFontElement
class FontElement extends _Element_Merged {
  FontElement.internal(): super.internal();


  /** @domName HTMLFontElement.color */
  String get color native "HTMLFontElement_color_Getter";


  /** @domName HTMLFontElement.color */
  void set color(String value) native "HTMLFontElement_color_Setter";


  /** @domName HTMLFontElement.face */
  String get face native "HTMLFontElement_face_Getter";


  /** @domName HTMLFontElement.face */
  void set face(String value) native "HTMLFontElement_face_Setter";


  /** @domName HTMLFontElement.size */
  String get size native "HTMLFontElement_size_Getter";


  /** @domName HTMLFontElement.size */
  void set size(String value) native "HTMLFontElement_size_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName FormData
class FormData extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory FormData([FormElement form]) {
    if (!?form) {
      return _FormDataFactoryProvider.createFormData();
    }
    return _FormDataFactoryProvider.createFormData(form);
  }
  FormData.internal();


  /** @domName DOMFormData.append */
  void append(String name, value, [String filename]) native "DOMFormData_append_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLFormElement
class FormElement extends _Element_Merged {

  ///@docsEditable true
  factory FormElement() => document.$dom_createElement("form");
  FormElement.internal(): super.internal();


  /** @domName HTMLFormElement.acceptCharset */
  String get acceptCharset native "HTMLFormElement_acceptCharset_Getter";


  /** @domName HTMLFormElement.acceptCharset */
  void set acceptCharset(String value) native "HTMLFormElement_acceptCharset_Setter";


  /** @domName HTMLFormElement.action */
  String get action native "HTMLFormElement_action_Getter";


  /** @domName HTMLFormElement.action */
  void set action(String value) native "HTMLFormElement_action_Setter";


  /** @domName HTMLFormElement.autocomplete */
  String get autocomplete native "HTMLFormElement_autocomplete_Getter";


  /** @domName HTMLFormElement.autocomplete */
  void set autocomplete(String value) native "HTMLFormElement_autocomplete_Setter";


  /** @domName HTMLFormElement.encoding */
  String get encoding native "HTMLFormElement_encoding_Getter";


  /** @domName HTMLFormElement.encoding */
  void set encoding(String value) native "HTMLFormElement_encoding_Setter";


  /** @domName HTMLFormElement.enctype */
  String get enctype native "HTMLFormElement_enctype_Getter";


  /** @domName HTMLFormElement.enctype */
  void set enctype(String value) native "HTMLFormElement_enctype_Setter";


  /** @domName HTMLFormElement.length */
  int get length native "HTMLFormElement_length_Getter";


  /** @domName HTMLFormElement.method */
  String get method native "HTMLFormElement_method_Getter";


  /** @domName HTMLFormElement.method */
  void set method(String value) native "HTMLFormElement_method_Setter";


  /** @domName HTMLFormElement.name */
  String get name native "HTMLFormElement_name_Getter";


  /** @domName HTMLFormElement.name */
  void set name(String value) native "HTMLFormElement_name_Setter";


  /** @domName HTMLFormElement.noValidate */
  bool get noValidate native "HTMLFormElement_noValidate_Getter";


  /** @domName HTMLFormElement.noValidate */
  void set noValidate(bool value) native "HTMLFormElement_noValidate_Setter";


  /** @domName HTMLFormElement.target */
  String get target native "HTMLFormElement_target_Getter";


  /** @domName HTMLFormElement.target */
  void set target(String value) native "HTMLFormElement_target_Setter";


  /** @domName HTMLFormElement.checkValidity */
  bool checkValidity() native "HTMLFormElement_checkValidity_Callback";


  /** @domName HTMLFormElement.reset */
  void reset() native "HTMLFormElement_reset_Callback";


  /** @domName HTMLFormElement.submit */
  void submit() native "HTMLFormElement_submit_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLFrameElement
class FrameElement extends _Element_Merged {
  FrameElement.internal(): super.internal();


  /** @domName HTMLFrameElement.contentWindow */
  Window get contentWindow native "HTMLFrameElement_contentWindow_Getter";


  /** @domName HTMLFrameElement.frameBorder */
  String get frameBorder native "HTMLFrameElement_frameBorder_Getter";


  /** @domName HTMLFrameElement.frameBorder */
  void set frameBorder(String value) native "HTMLFrameElement_frameBorder_Setter";


  /** @domName HTMLFrameElement.height */
  int get height native "HTMLFrameElement_height_Getter";


  /** @domName HTMLFrameElement.location */
  String get location native "HTMLFrameElement_location_Getter";


  /** @domName HTMLFrameElement.location */
  void set location(String value) native "HTMLFrameElement_location_Setter";


  /** @domName HTMLFrameElement.longDesc */
  String get longDesc native "HTMLFrameElement_longDesc_Getter";


  /** @domName HTMLFrameElement.longDesc */
  void set longDesc(String value) native "HTMLFrameElement_longDesc_Setter";


  /** @domName HTMLFrameElement.marginHeight */
  String get marginHeight native "HTMLFrameElement_marginHeight_Getter";


  /** @domName HTMLFrameElement.marginHeight */
  void set marginHeight(String value) native "HTMLFrameElement_marginHeight_Setter";


  /** @domName HTMLFrameElement.marginWidth */
  String get marginWidth native "HTMLFrameElement_marginWidth_Getter";


  /** @domName HTMLFrameElement.marginWidth */
  void set marginWidth(String value) native "HTMLFrameElement_marginWidth_Setter";


  /** @domName HTMLFrameElement.name */
  String get name native "HTMLFrameElement_name_Getter";


  /** @domName HTMLFrameElement.name */
  void set name(String value) native "HTMLFrameElement_name_Setter";


  /** @domName HTMLFrameElement.noResize */
  bool get noResize native "HTMLFrameElement_noResize_Getter";


  /** @domName HTMLFrameElement.noResize */
  void set noResize(bool value) native "HTMLFrameElement_noResize_Setter";


  /** @domName HTMLFrameElement.scrolling */
  String get scrolling native "HTMLFrameElement_scrolling_Getter";


  /** @domName HTMLFrameElement.scrolling */
  void set scrolling(String value) native "HTMLFrameElement_scrolling_Setter";


  /** @domName HTMLFrameElement.src */
  String get src native "HTMLFrameElement_src_Getter";


  /** @domName HTMLFrameElement.src */
  void set src(String value) native "HTMLFrameElement_src_Setter";


  /** @domName HTMLFrameElement.width */
  int get width native "HTMLFrameElement_width_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLFrameSetElement
class FrameSetElement extends _Element_Merged {
  FrameSetElement.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  FrameSetElementEvents get on =>
    new FrameSetElementEvents(this);


  /** @domName HTMLFrameSetElement.cols */
  String get cols native "HTMLFrameSetElement_cols_Getter";


  /** @domName HTMLFrameSetElement.cols */
  void set cols(String value) native "HTMLFrameSetElement_cols_Setter";


  /** @domName HTMLFrameSetElement.rows */
  String get rows native "HTMLFrameSetElement_rows_Getter";


  /** @domName HTMLFrameSetElement.rows */
  void set rows(String value) native "HTMLFrameSetElement_rows_Setter";

}

/// @docsEditable true
class FrameSetElementEvents extends ElementEvents {
  /// @docsEditable true
  FrameSetElementEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get beforeUnload => this['beforeunload'];

  /// @docsEditable true
  EventListenerList get blur => this['blur'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get focus => this['focus'];

  /// @docsEditable true
  EventListenerList get hashChange => this['hashchange'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get offline => this['offline'];

  /// @docsEditable true
  EventListenerList get online => this['online'];

  /// @docsEditable true
  EventListenerList get popState => this['popstate'];

  /// @docsEditable true
  EventListenerList get resize => this['resize'];

  /// @docsEditable true
  EventListenerList get storage => this['storage'];

  /// @docsEditable true
  EventListenerList get unload => this['unload'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Gamepad
class Gamepad extends NativeFieldWrapperClass1 {
  Gamepad.internal();


  /** @domName Gamepad.axes */
  List<num> get axes native "Gamepad_axes_Getter";


  /** @domName Gamepad.buttons */
  List<num> get buttons native "Gamepad_buttons_Getter";


  /** @domName Gamepad.id */
  String get id native "Gamepad_id_Getter";


  /** @domName Gamepad.index */
  int get index native "Gamepad_index_Getter";


  /** @domName Gamepad.timestamp */
  int get timestamp native "Gamepad_timestamp_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Geolocation
class Geolocation extends NativeFieldWrapperClass1 {
  Geolocation.internal();


  /** @domName Geolocation.clearWatch */
  void clearWatch(int watchId) native "Geolocation_clearWatch_Callback";


  /** @domName Geolocation.getCurrentPosition */
  void getCurrentPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_getCurrentPosition_Callback";


  /** @domName Geolocation.watchPosition */
  int watchPosition(PositionCallback successCallback, [PositionErrorCallback errorCallback, Object options]) native "Geolocation_watchPosition_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Geoposition
class Geoposition extends NativeFieldWrapperClass1 {
  Geoposition.internal();


  /** @domName Geoposition.coords */
  Coordinates get coords native "Geoposition_coords_Getter";


  /** @domName Geoposition.timestamp */
  int get timestamp native "Geoposition_timestamp_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLHRElement
class HRElement extends _Element_Merged {

  ///@docsEditable true
  factory HRElement() => document.$dom_createElement("hr");
  HRElement.internal(): super.internal();


  /** @domName HTMLHRElement.align */
  String get align native "HTMLHRElement_align_Getter";


  /** @domName HTMLHRElement.align */
  void set align(String value) native "HTMLHRElement_align_Setter";


  /** @domName HTMLHRElement.noShade */
  bool get noShade native "HTMLHRElement_noShade_Getter";


  /** @domName HTMLHRElement.noShade */
  void set noShade(bool value) native "HTMLHRElement_noShade_Setter";


  /** @domName HTMLHRElement.size */
  String get size native "HTMLHRElement_size_Getter";


  /** @domName HTMLHRElement.size */
  void set size(String value) native "HTMLHRElement_size_Setter";


  /** @domName HTMLHRElement.width */
  String get width native "HTMLHRElement_width_Getter";


  /** @domName HTMLHRElement.width */
  void set width(String value) native "HTMLHRElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HashChangeEvent
class HashChangeEvent extends Event {
  HashChangeEvent.internal(): super.internal();


  /** @domName HashChangeEvent.newURL */
  String get newUrl native "HashChangeEvent_newURL_Getter";


  /** @domName HashChangeEvent.oldURL */
  String get oldUrl native "HashChangeEvent_oldURL_Getter";


  /** @domName HashChangeEvent.initHashChangeEvent */
  void initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) native "HashChangeEvent_initHashChangeEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLHeadElement
class HeadElement extends _Element_Merged {

  ///@docsEditable true
  factory HeadElement() => document.$dom_createElement("head");
  HeadElement.internal(): super.internal();


  /** @domName HTMLHeadElement.profile */
  String get profile native "HTMLHeadElement_profile_Getter";


  /** @domName HTMLHeadElement.profile */
  void set profile(String value) native "HTMLHeadElement_profile_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLHeadingElement
class HeadingElement extends _Element_Merged {

  ///@docsEditable true
  factory HeadingElement.h1() => document.$dom_createElement("h1");

  ///@docsEditable true
  factory HeadingElement.h2() => document.$dom_createElement("h2");

  ///@docsEditable true
  factory HeadingElement.h3() => document.$dom_createElement("h3");

  ///@docsEditable true
  factory HeadingElement.h4() => document.$dom_createElement("h4");

  ///@docsEditable true
  factory HeadingElement.h5() => document.$dom_createElement("h5");

  ///@docsEditable true
  factory HeadingElement.h6() => document.$dom_createElement("h6");
  HeadingElement.internal(): super.internal();


  /** @domName HTMLHeadingElement.align */
  String get align native "HTMLHeadingElement_align_Getter";


  /** @domName HTMLHeadingElement.align */
  void set align(String value) native "HTMLHeadingElement_align_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLAllCollection
class HtmlAllCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HtmlAllCollection.internal();


  /** @domName HTMLAllCollection.length */
  int get length native "HTMLAllCollection_length_Getter";

  Node operator[](int index) native "HTMLAllCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => Collections.contains(this, element);

  void forEach(void f(Node element)) => Collections.forEach(this, f);

  Collection map(f(Node element)) => Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => Collections.every(this, f);

  bool some(bool f(Node element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first => this[0];

  Node get last => this[length - 1];

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName HTMLAllCollection.item */
  Node item(int index) native "HTMLAllCollection_item_Callback";


  /** @domName HTMLAllCollection.namedItem */
  Node namedItem(String name) native "HTMLAllCollection_namedItem_Callback";


  /** @domName HTMLAllCollection.tags */
  List<Node> tags(String name) native "HTMLAllCollection_tags_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLCollection
class HtmlCollection extends NativeFieldWrapperClass1 implements List<Node> {
  HtmlCollection.internal();


  /** @domName HTMLCollection.length */
  int get length native "HTMLCollection_length_Getter";

  Node operator[](int index) native "HTMLCollection_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => Collections.contains(this, element);

  void forEach(void f(Node element)) => Collections.forEach(this, f);

  Collection map(f(Node element)) => Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => Collections.every(this, f);

  bool some(bool f(Node element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first => this[0];

  Node get last => this[length - 1];

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName HTMLCollection.item */
  Node item(int index) native "HTMLCollection_item_Callback";


  /** @domName HTMLCollection.namedItem */
  Node namedItem(String name) native "HTMLCollection_namedItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLDocument
class HtmlDocument extends Document {
  HtmlDocument.internal(): super.internal();


  /** @domName HTMLDocument.activeElement */
  Element get activeElement native "HTMLDocument_activeElement_Getter";

  /** @domName Document.body */
  BodyElement get body => document.$dom_body;

  /** @domName Document.body */
  void set body(BodyElement value) {
    document.$dom_body = value;
  }

  /** @domName Document.caretRangeFromPoint */
  Range caretRangeFromPoint(int x, int y) {
    return document.$dom_caretRangeFromPoint(x, y);
  }

  /** @domName Document.elementFromPoint */
  Element elementFromPoint(int x, int y) {
    return document.$dom_elementFromPoint(x, y);
  }

  /** @domName Document.getCSSCanvasContext */
  CanvasRenderingContext getCssCanvasContext(String contextId, String name,
      int width, int height) {
    return document.$dom_getCssCanvasContext(contextId, name, width, height);
  }

  /** @domName Document.head */
  HeadElement get head => document.$dom_head;

  /** @domName Document.lastModified */
  String get lastModified => document.$dom_lastModified;

  /** @domName Document.preferredStylesheetSet */
  String get preferredStylesheetSet => document.$dom_preferredStylesheetSet;

  /** @domName Document.referrer */
  String get referrer => document.$dom_referrer;

  /** @domName Document.selectedStylesheetSet */
  String get selectedStylesheetSet => document.$dom_selectedStylesheetSet;
  void set selectedStylesheetSet(String value) {
    document.$dom_selectedStylesheetSet = value;
  }

  /** @domName Document.styleSheets */
  List<StyleSheet> get styleSheets => document.$dom_styleSheets;

  /** @domName Document.title */
  String get title => document.$dom_title;

  /** @domName Document.title */
  void set title(String value) {
    document.$dom_title = value;
  }

  /** @domName Document.webkitCancelFullScreen */
  void webkitCancelFullScreen() {
    document.$dom_webkitCancelFullScreen();
  }

  /** @domName Document.webkitExitFullscreen */
  void webkitExitFullscreen() {
    document.$dom_webkitExitFullscreen();
  }

  /** @domName Document.webkitExitPointerLock */
  void webkitExitPointerLock() {
    document.$dom_webkitExitPointerLock();
  }

  /** @domName Document.webkitFullscreenElement */
  Element get webkitFullscreenElement => document.$dom_webkitFullscreenElement;

  /** @domName Document.webkitFullscreenEnabled */
  bool get webkitFullscreenEnabled => document.$dom_webkitFullscreenEnabled;

  /** @domName Document.webkitHidden */
  bool get webkitHidden => document.$dom_webkitHidden;

  /** @domName Document.webkitIsFullScreen */
  bool get webkitIsFullScreen => document.$dom_webkitIsFullScreen;

  /** @domName Document.webkitPointerLockElement */
  Element get webkitPointerLockElement =>
      document.$dom_webkitPointerLockElement;

  /** @domName Document.webkitVisibilityState */
  String get webkitVisibilityState => document.$dom_webkitVisibilityState;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLHtmlElement
class HtmlElement extends _Element_Merged {

  ///@docsEditable true
  factory HtmlElement() => document.$dom_createElement("html");
  HtmlElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLOptionsCollection
class HtmlOptionsCollection extends HtmlCollection {
  HtmlOptionsCollection.internal(): super.internal();


  /** @domName HTMLOptionsCollection.length */
  int get length native "HTMLOptionsCollection_length_Getter";


  /** @domName HTMLOptionsCollection.length */
  void set length(int value) native "HTMLOptionsCollection_length_Setter";


  /** @domName HTMLOptionsCollection.selectedIndex */
  int get selectedIndex native "HTMLOptionsCollection_selectedIndex_Getter";


  /** @domName HTMLOptionsCollection.selectedIndex */
  void set selectedIndex(int value) native "HTMLOptionsCollection_selectedIndex_Setter";


  /** @domName HTMLOptionsCollection.numericIndexSetter */
  void operator[]=(int index, Node value) native "HTMLOptionsCollection_numericIndexSetter_Callback";


  /** @domName HTMLOptionsCollection.remove */
  void remove(int index) native "HTMLOptionsCollection_remove_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * A utility for retrieving data from a URL.
 * 
 * HttpRequest can be used to obtain data from http, ftp, and file
 * protocols. 
 * 
 * For example, suppose we're developing these API docs, and we
 * wish to retrieve the HTML of the top-level page and print it out.
 * The easiest way to do that would be:
 * 
 *     var httpRequest = HttpRequest.get('http://api.dartlang.org',
 *         (request) => print(request.responseText));
 * 
 * **Important**: With the default behavior of this class, your
 * code making the request should be served from the same origin (domain name,
 * port, and application layer protocol) as the URL you are trying to access
 * with HttpRequest. However, there are ways to 
 * [get around this restriction](http://www.dartlang.org/articles/json-web-service/#note-on-jsonp).
 * 
 * See also:
 *
 * * [Dart article on using HttpRequests](http://www.dartlang.org/articles/json-web-service/#getting-data)
 * * [JS XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest)
 * * [Using XMLHttpRequest](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest)
 */
/// @domName XMLHttpRequest
class HttpRequest extends EventTarget {
  /**
   * Creates a URL get request for the specified `url`.
   * 
   * After completing the request, the object will call the user-provided
   * [onComplete] callback.
   */
  factory HttpRequest.get(String url, onComplete(HttpRequest request)) =>
      _HttpRequestFactoryProvider.createHttpRequest_get(url, onComplete);

  /**
   * Creates a URL GET request for the specified `url` with
   * credentials such a cookie (already) set in the header or
   * (authorization headers)[http://tools.ietf.org/html/rfc1945#section-10.2].
   * 
   * After completing the request, the object will call the user-provided 
   * [onComplete] callback.
   * 
   * See also: (authorization headers)[http://en.wikipedia.org/wiki/Basic_access_authentication].
   */
  factory HttpRequest.getWithCredentials(String url,
      onComplete(HttpRequest request)) =>
      _HttpRequestFactoryProvider.createHttpRequest_getWithCredentials(url,
      onComplete);


  ///@docsEditable true
  factory HttpRequest() => _HttpRequestFactoryProvider.createHttpRequest();
  HttpRequest.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  HttpRequestEvents get on =>
    new HttpRequestEvents(this);

  static const int DONE = 4;

  static const int HEADERS_RECEIVED = 2;

  static const int LOADING = 3;

  static const int OPENED = 1;

  static const int UNSENT = 0;


  /** @domName XMLHttpRequest.readyState */
  int get readyState native "XMLHttpRequest_readyState_Getter";


  /** @domName XMLHttpRequest.response */
  Object get response native "XMLHttpRequest_response_Getter";


  /** @domName XMLHttpRequest.responseText */
  String get responseText native "XMLHttpRequest_responseText_Getter";


  /** @domName XMLHttpRequest.responseType */
  String get responseType native "XMLHttpRequest_responseType_Getter";


  /** @domName XMLHttpRequest.responseType */
  void set responseType(String value) native "XMLHttpRequest_responseType_Setter";


  /** @domName XMLHttpRequest.responseXML */
  Document get responseXml native "XMLHttpRequest_responseXML_Getter";


  /** @domName XMLHttpRequest.status */
  int get status native "XMLHttpRequest_status_Getter";


  /** @domName XMLHttpRequest.statusText */
  String get statusText native "XMLHttpRequest_statusText_Getter";


  /** @domName XMLHttpRequest.upload */
  HttpRequestUpload get upload native "XMLHttpRequest_upload_Getter";


  /** @domName XMLHttpRequest.withCredentials */
  bool get withCredentials native "XMLHttpRequest_withCredentials_Getter";


  /** @domName XMLHttpRequest.withCredentials */
  void set withCredentials(bool value) native "XMLHttpRequest_withCredentials_Setter";


  /** @domName XMLHttpRequest.abort */
  void abort() native "XMLHttpRequest_abort_Callback";


  /** @domName XMLHttpRequest.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_addEventListener_Callback";


  /** @domName XMLHttpRequest.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "XMLHttpRequest_dispatchEvent_Callback";


  /** @domName XMLHttpRequest.getAllResponseHeaders */
  String getAllResponseHeaders() native "XMLHttpRequest_getAllResponseHeaders_Callback";


  /** @domName XMLHttpRequest.getResponseHeader */
  String getResponseHeader(String header) native "XMLHttpRequest_getResponseHeader_Callback";


  /** @domName XMLHttpRequest.open */
  void open(String method, String url, [bool async, String user, String password]) native "XMLHttpRequest_open_Callback";


  /** @domName XMLHttpRequest.overrideMimeType */
  void overrideMimeType(String override) native "XMLHttpRequest_overrideMimeType_Callback";


  /** @domName XMLHttpRequest.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequest_removeEventListener_Callback";


  /** @domName XMLHttpRequest.send */
  void send([data]) native "XMLHttpRequest_send_Callback";


  /** @domName XMLHttpRequest.setRequestHeader */
  void setRequestHeader(String header, String value) native "XMLHttpRequest_setRequestHeader_Callback";

}

/// @docsEditable true
class HttpRequestEvents extends Events {
  /// @docsEditable true
  HttpRequestEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get loadEnd => this['loadend'];

  /// @docsEditable true
  EventListenerList get loadStart => this['loadstart'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];

  /// @docsEditable true
  EventListenerList get readyStateChange => this['readystatechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XMLHttpRequestException
class HttpRequestException extends NativeFieldWrapperClass1 {
  HttpRequestException.internal();

  static const int ABORT_ERR = 102;

  static const int NETWORK_ERR = 101;


  /** @domName XMLHttpRequestException.code */
  int get code native "XMLHttpRequestException_code_Getter";


  /** @domName XMLHttpRequestException.message */
  String get message native "XMLHttpRequestException_message_Getter";


  /** @domName XMLHttpRequestException.name */
  String get name native "XMLHttpRequestException_name_Getter";


  /** @domName XMLHttpRequestException.toString */
  String toString() native "XMLHttpRequestException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XMLHttpRequestProgressEvent
class HttpRequestProgressEvent extends ProgressEvent {
  HttpRequestProgressEvent.internal(): super.internal();


  /** @domName XMLHttpRequestProgressEvent.position */
  int get position native "XMLHttpRequestProgressEvent_position_Getter";


  /** @domName XMLHttpRequestProgressEvent.totalSize */
  int get totalSize native "XMLHttpRequestProgressEvent_totalSize_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XMLHttpRequestUpload
class HttpRequestUpload extends EventTarget {
  HttpRequestUpload.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  HttpRequestUploadEvents get on =>
    new HttpRequestUploadEvents(this);


  /** @domName XMLHttpRequestUpload.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_addEventListener_Callback";


  /** @domName XMLHttpRequestUpload.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "XMLHttpRequestUpload_dispatchEvent_Callback";


  /** @domName XMLHttpRequestUpload.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "XMLHttpRequestUpload_removeEventListener_Callback";

}

/// @docsEditable true
class HttpRequestUploadEvents extends Events {
  /// @docsEditable true
  HttpRequestUploadEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get loadEnd => this['loadend'];

  /// @docsEditable true
  EventListenerList get loadStart => this['loadstart'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLIFrameElement
class IFrameElement extends _Element_Merged {

  ///@docsEditable true
  factory IFrameElement() => document.$dom_createElement("iframe");
  IFrameElement.internal(): super.internal();


  /** @domName HTMLIFrameElement.align */
  String get align native "HTMLIFrameElement_align_Getter";


  /** @domName HTMLIFrameElement.align */
  void set align(String value) native "HTMLIFrameElement_align_Setter";


  /** @domName HTMLIFrameElement.contentWindow */
  Window get contentWindow native "HTMLIFrameElement_contentWindow_Getter";


  /** @domName HTMLIFrameElement.frameBorder */
  String get frameBorder native "HTMLIFrameElement_frameBorder_Getter";


  /** @domName HTMLIFrameElement.frameBorder */
  void set frameBorder(String value) native "HTMLIFrameElement_frameBorder_Setter";


  /** @domName HTMLIFrameElement.height */
  String get height native "HTMLIFrameElement_height_Getter";


  /** @domName HTMLIFrameElement.height */
  void set height(String value) native "HTMLIFrameElement_height_Setter";


  /** @domName HTMLIFrameElement.longDesc */
  String get longDesc native "HTMLIFrameElement_longDesc_Getter";


  /** @domName HTMLIFrameElement.longDesc */
  void set longDesc(String value) native "HTMLIFrameElement_longDesc_Setter";


  /** @domName HTMLIFrameElement.marginHeight */
  String get marginHeight native "HTMLIFrameElement_marginHeight_Getter";


  /** @domName HTMLIFrameElement.marginHeight */
  void set marginHeight(String value) native "HTMLIFrameElement_marginHeight_Setter";


  /** @domName HTMLIFrameElement.marginWidth */
  String get marginWidth native "HTMLIFrameElement_marginWidth_Getter";


  /** @domName HTMLIFrameElement.marginWidth */
  void set marginWidth(String value) native "HTMLIFrameElement_marginWidth_Setter";


  /** @domName HTMLIFrameElement.name */
  String get name native "HTMLIFrameElement_name_Getter";


  /** @domName HTMLIFrameElement.name */
  void set name(String value) native "HTMLIFrameElement_name_Setter";


  /** @domName HTMLIFrameElement.sandbox */
  String get sandbox native "HTMLIFrameElement_sandbox_Getter";


  /** @domName HTMLIFrameElement.sandbox */
  void set sandbox(String value) native "HTMLIFrameElement_sandbox_Setter";


  /** @domName HTMLIFrameElement.scrolling */
  String get scrolling native "HTMLIFrameElement_scrolling_Getter";


  /** @domName HTMLIFrameElement.scrolling */
  void set scrolling(String value) native "HTMLIFrameElement_scrolling_Setter";


  /** @domName HTMLIFrameElement.src */
  String get src native "HTMLIFrameElement_src_Getter";


  /** @domName HTMLIFrameElement.src */
  void set src(String value) native "HTMLIFrameElement_src_Setter";


  /** @domName HTMLIFrameElement.srcdoc */
  String get srcdoc native "HTMLIFrameElement_srcdoc_Getter";


  /** @domName HTMLIFrameElement.srcdoc */
  void set srcdoc(String value) native "HTMLIFrameElement_srcdoc_Setter";


  /** @domName HTMLIFrameElement.width */
  String get width native "HTMLIFrameElement_width_Getter";


  /** @domName HTMLIFrameElement.width */
  void set width(String value) native "HTMLIFrameElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void IceCallback(IceCandidate candidate, bool moreToFollow, PeerConnection00 source);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName IceCandidate
class IceCandidate extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory IceCandidate(String label, String candidateLine) => _IceCandidateFactoryProvider.createIceCandidate(label, candidateLine);
  IceCandidate.internal();


  /** @domName IceCandidate.label */
  String get label native "IceCandidate_label_Getter";


  /** @domName IceCandidate.toSdp */
  String toSdp() native "IceCandidate_toSdp_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ImageData
class ImageData extends NativeFieldWrapperClass1 {
  ImageData.internal();


  /** @domName ImageData.data */
  Uint8ClampedArray get data native "ImageData_data_Getter";


  /** @domName ImageData.height */
  int get height native "ImageData_height_Getter";


  /** @domName ImageData.width */
  int get width native "ImageData_width_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLImageElement
class ImageElement extends _Element_Merged {

  ///@docsEditable true
  factory ImageElement({String src, int width, int height}) {
    var e = document.$dom_createElement("img");
    if (src != null) e.src = src;
    if (width != null) e.width = width;
    if (height != null) e.height = height;
    return e;
  }
  ImageElement.internal(): super.internal();


  /** @domName HTMLImageElement.align */
  String get align native "HTMLImageElement_align_Getter";


  /** @domName HTMLImageElement.align */
  void set align(String value) native "HTMLImageElement_align_Setter";


  /** @domName HTMLImageElement.alt */
  String get alt native "HTMLImageElement_alt_Getter";


  /** @domName HTMLImageElement.alt */
  void set alt(String value) native "HTMLImageElement_alt_Setter";


  /** @domName HTMLImageElement.border */
  String get border native "HTMLImageElement_border_Getter";


  /** @domName HTMLImageElement.border */
  void set border(String value) native "HTMLImageElement_border_Setter";


  /** @domName HTMLImageElement.complete */
  bool get complete native "HTMLImageElement_complete_Getter";


  /** @domName HTMLImageElement.crossOrigin */
  String get crossOrigin native "HTMLImageElement_crossOrigin_Getter";


  /** @domName HTMLImageElement.crossOrigin */
  void set crossOrigin(String value) native "HTMLImageElement_crossOrigin_Setter";


  /** @domName HTMLImageElement.height */
  int get height native "HTMLImageElement_height_Getter";


  /** @domName HTMLImageElement.height */
  void set height(int value) native "HTMLImageElement_height_Setter";


  /** @domName HTMLImageElement.hspace */
  int get hspace native "HTMLImageElement_hspace_Getter";


  /** @domName HTMLImageElement.hspace */
  void set hspace(int value) native "HTMLImageElement_hspace_Setter";


  /** @domName HTMLImageElement.isMap */
  bool get isMap native "HTMLImageElement_isMap_Getter";


  /** @domName HTMLImageElement.isMap */
  void set isMap(bool value) native "HTMLImageElement_isMap_Setter";


  /** @domName HTMLImageElement.longDesc */
  String get longDesc native "HTMLImageElement_longDesc_Getter";


  /** @domName HTMLImageElement.longDesc */
  void set longDesc(String value) native "HTMLImageElement_longDesc_Setter";


  /** @domName HTMLImageElement.lowsrc */
  String get lowsrc native "HTMLImageElement_lowsrc_Getter";


  /** @domName HTMLImageElement.lowsrc */
  void set lowsrc(String value) native "HTMLImageElement_lowsrc_Setter";


  /** @domName HTMLImageElement.name */
  String get name native "HTMLImageElement_name_Getter";


  /** @domName HTMLImageElement.name */
  void set name(String value) native "HTMLImageElement_name_Setter";


  /** @domName HTMLImageElement.naturalHeight */
  int get naturalHeight native "HTMLImageElement_naturalHeight_Getter";


  /** @domName HTMLImageElement.naturalWidth */
  int get naturalWidth native "HTMLImageElement_naturalWidth_Getter";


  /** @domName HTMLImageElement.src */
  String get src native "HTMLImageElement_src_Getter";


  /** @domName HTMLImageElement.src */
  void set src(String value) native "HTMLImageElement_src_Setter";


  /** @domName HTMLImageElement.useMap */
  String get useMap native "HTMLImageElement_useMap_Getter";


  /** @domName HTMLImageElement.useMap */
  void set useMap(String value) native "HTMLImageElement_useMap_Setter";


  /** @domName HTMLImageElement.vspace */
  int get vspace native "HTMLImageElement_vspace_Getter";


  /** @domName HTMLImageElement.vspace */
  void set vspace(int value) native "HTMLImageElement_vspace_Setter";


  /** @domName HTMLImageElement.width */
  int get width native "HTMLImageElement_width_Getter";


  /** @domName HTMLImageElement.width */
  void set width(int value) native "HTMLImageElement_width_Setter";


  /** @domName HTMLImageElement.x */
  int get x native "HTMLImageElement_x_Getter";


  /** @domName HTMLImageElement.y */
  int get y native "HTMLImageElement_y_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName HTMLInputElement
class InputElement extends _Element_Merged implements
    HiddenInputElement,
    SearchInputElement,
    TextInputElement,
    UrlInputElement,
    TelephoneInputElement,
    EmailInputElement,
    PasswordInputElement,
    DateTimeInputElement,
    DateInputElement,
    MonthInputElement,
    WeekInputElement,
    TimeInputElement,
    LocalDateTimeInputElement,
    NumberInputElement,
    RangeInputElement,
    CheckboxInputElement,
    RadioButtonInputElement,
    FileUploadInputElement,
    SubmitButtonInputElement,
    ImageButtonInputElement,
    ResetButtonInputElement,
    ButtonInputElement
     {

  ///@docsEditable true
  factory InputElement({String type}) {
    var e = document.$dom_createElement("input");
    if (type != null) e.type = type;
    return e;
  }
  InputElement.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  InputElementEvents get on =>
    new InputElementEvents(this);


  /** @domName HTMLInputElement.accept */
  String get accept native "HTMLInputElement_accept_Getter";


  /** @domName HTMLInputElement.accept */
  void set accept(String value) native "HTMLInputElement_accept_Setter";


  /** @domName HTMLInputElement.align */
  String get align native "HTMLInputElement_align_Getter";


  /** @domName HTMLInputElement.align */
  void set align(String value) native "HTMLInputElement_align_Setter";


  /** @domName HTMLInputElement.alt */
  String get alt native "HTMLInputElement_alt_Getter";


  /** @domName HTMLInputElement.alt */
  void set alt(String value) native "HTMLInputElement_alt_Setter";


  /** @domName HTMLInputElement.autocomplete */
  String get autocomplete native "HTMLInputElement_autocomplete_Getter";


  /** @domName HTMLInputElement.autocomplete */
  void set autocomplete(String value) native "HTMLInputElement_autocomplete_Setter";


  /** @domName HTMLInputElement.autofocus */
  bool get autofocus native "HTMLInputElement_autofocus_Getter";


  /** @domName HTMLInputElement.autofocus */
  void set autofocus(bool value) native "HTMLInputElement_autofocus_Setter";


  /** @domName HTMLInputElement.checked */
  bool get checked native "HTMLInputElement_checked_Getter";


  /** @domName HTMLInputElement.checked */
  void set checked(bool value) native "HTMLInputElement_checked_Setter";


  /** @domName HTMLInputElement.defaultChecked */
  bool get defaultChecked native "HTMLInputElement_defaultChecked_Getter";


  /** @domName HTMLInputElement.defaultChecked */
  void set defaultChecked(bool value) native "HTMLInputElement_defaultChecked_Setter";


  /** @domName HTMLInputElement.defaultValue */
  String get defaultValue native "HTMLInputElement_defaultValue_Getter";


  /** @domName HTMLInputElement.defaultValue */
  void set defaultValue(String value) native "HTMLInputElement_defaultValue_Setter";


  /** @domName HTMLInputElement.dirName */
  String get dirName native "HTMLInputElement_dirName_Getter";


  /** @domName HTMLInputElement.dirName */
  void set dirName(String value) native "HTMLInputElement_dirName_Setter";


  /** @domName HTMLInputElement.disabled */
  bool get disabled native "HTMLInputElement_disabled_Getter";


  /** @domName HTMLInputElement.disabled */
  void set disabled(bool value) native "HTMLInputElement_disabled_Setter";


  /** @domName HTMLInputElement.files */
  List<File> get files native "HTMLInputElement_files_Getter";


  /** @domName HTMLInputElement.files */
  void set files(List<File> value) native "HTMLInputElement_files_Setter";


  /** @domName HTMLInputElement.form */
  FormElement get form native "HTMLInputElement_form_Getter";


  /** @domName HTMLInputElement.formAction */
  String get formAction native "HTMLInputElement_formAction_Getter";


  /** @domName HTMLInputElement.formAction */
  void set formAction(String value) native "HTMLInputElement_formAction_Setter";


  /** @domName HTMLInputElement.formEnctype */
  String get formEnctype native "HTMLInputElement_formEnctype_Getter";


  /** @domName HTMLInputElement.formEnctype */
  void set formEnctype(String value) native "HTMLInputElement_formEnctype_Setter";


  /** @domName HTMLInputElement.formMethod */
  String get formMethod native "HTMLInputElement_formMethod_Getter";


  /** @domName HTMLInputElement.formMethod */
  void set formMethod(String value) native "HTMLInputElement_formMethod_Setter";


  /** @domName HTMLInputElement.formNoValidate */
  bool get formNoValidate native "HTMLInputElement_formNoValidate_Getter";


  /** @domName HTMLInputElement.formNoValidate */
  void set formNoValidate(bool value) native "HTMLInputElement_formNoValidate_Setter";


  /** @domName HTMLInputElement.formTarget */
  String get formTarget native "HTMLInputElement_formTarget_Getter";


  /** @domName HTMLInputElement.formTarget */
  void set formTarget(String value) native "HTMLInputElement_formTarget_Setter";


  /** @domName HTMLInputElement.height */
  int get height native "HTMLInputElement_height_Getter";


  /** @domName HTMLInputElement.height */
  void set height(int value) native "HTMLInputElement_height_Setter";


  /** @domName HTMLInputElement.incremental */
  bool get incremental native "HTMLInputElement_incremental_Getter";


  /** @domName HTMLInputElement.incremental */
  void set incremental(bool value) native "HTMLInputElement_incremental_Setter";


  /** @domName HTMLInputElement.indeterminate */
  bool get indeterminate native "HTMLInputElement_indeterminate_Getter";


  /** @domName HTMLInputElement.indeterminate */
  void set indeterminate(bool value) native "HTMLInputElement_indeterminate_Setter";


  /** @domName HTMLInputElement.labels */
  List<Node> get labels native "HTMLInputElement_labels_Getter";


  /** @domName HTMLInputElement.list */
  Element get list native "HTMLInputElement_list_Getter";


  /** @domName HTMLInputElement.max */
  String get max native "HTMLInputElement_max_Getter";


  /** @domName HTMLInputElement.max */
  void set max(String value) native "HTMLInputElement_max_Setter";


  /** @domName HTMLInputElement.maxLength */
  int get maxLength native "HTMLInputElement_maxLength_Getter";


  /** @domName HTMLInputElement.maxLength */
  void set maxLength(int value) native "HTMLInputElement_maxLength_Setter";


  /** @domName HTMLInputElement.min */
  String get min native "HTMLInputElement_min_Getter";


  /** @domName HTMLInputElement.min */
  void set min(String value) native "HTMLInputElement_min_Setter";


  /** @domName HTMLInputElement.multiple */
  bool get multiple native "HTMLInputElement_multiple_Getter";


  /** @domName HTMLInputElement.multiple */
  void set multiple(bool value) native "HTMLInputElement_multiple_Setter";


  /** @domName HTMLInputElement.name */
  String get name native "HTMLInputElement_name_Getter";


  /** @domName HTMLInputElement.name */
  void set name(String value) native "HTMLInputElement_name_Setter";


  /** @domName HTMLInputElement.pattern */
  String get pattern native "HTMLInputElement_pattern_Getter";


  /** @domName HTMLInputElement.pattern */
  void set pattern(String value) native "HTMLInputElement_pattern_Setter";


  /** @domName HTMLInputElement.placeholder */
  String get placeholder native "HTMLInputElement_placeholder_Getter";


  /** @domName HTMLInputElement.placeholder */
  void set placeholder(String value) native "HTMLInputElement_placeholder_Setter";


  /** @domName HTMLInputElement.readOnly */
  bool get readOnly native "HTMLInputElement_readOnly_Getter";


  /** @domName HTMLInputElement.readOnly */
  void set readOnly(bool value) native "HTMLInputElement_readOnly_Setter";


  /** @domName HTMLInputElement.required */
  bool get required native "HTMLInputElement_required_Getter";


  /** @domName HTMLInputElement.required */
  void set required(bool value) native "HTMLInputElement_required_Setter";


  /** @domName HTMLInputElement.selectionDirection */
  String get selectionDirection native "HTMLInputElement_selectionDirection_Getter";


  /** @domName HTMLInputElement.selectionDirection */
  void set selectionDirection(String value) native "HTMLInputElement_selectionDirection_Setter";


  /** @domName HTMLInputElement.selectionEnd */
  int get selectionEnd native "HTMLInputElement_selectionEnd_Getter";


  /** @domName HTMLInputElement.selectionEnd */
  void set selectionEnd(int value) native "HTMLInputElement_selectionEnd_Setter";


  /** @domName HTMLInputElement.selectionStart */
  int get selectionStart native "HTMLInputElement_selectionStart_Getter";


  /** @domName HTMLInputElement.selectionStart */
  void set selectionStart(int value) native "HTMLInputElement_selectionStart_Setter";


  /** @domName HTMLInputElement.size */
  int get size native "HTMLInputElement_size_Getter";


  /** @domName HTMLInputElement.size */
  void set size(int value) native "HTMLInputElement_size_Setter";


  /** @domName HTMLInputElement.src */
  String get src native "HTMLInputElement_src_Getter";


  /** @domName HTMLInputElement.src */
  void set src(String value) native "HTMLInputElement_src_Setter";


  /** @domName HTMLInputElement.step */
  String get step native "HTMLInputElement_step_Getter";


  /** @domName HTMLInputElement.step */
  void set step(String value) native "HTMLInputElement_step_Setter";


  /** @domName HTMLInputElement.type */
  String get type native "HTMLInputElement_type_Getter";


  /** @domName HTMLInputElement.type */
  void set type(String value) native "HTMLInputElement_type_Setter";


  /** @domName HTMLInputElement.useMap */
  String get useMap native "HTMLInputElement_useMap_Getter";


  /** @domName HTMLInputElement.useMap */
  void set useMap(String value) native "HTMLInputElement_useMap_Setter";


  /** @domName HTMLInputElement.validationMessage */
  String get validationMessage native "HTMLInputElement_validationMessage_Getter";


  /** @domName HTMLInputElement.validity */
  ValidityState get validity native "HTMLInputElement_validity_Getter";


  /** @domName HTMLInputElement.value */
  String get value native "HTMLInputElement_value_Getter";


  /** @domName HTMLInputElement.value */
  void set value(String value) native "HTMLInputElement_value_Setter";


  /** @domName HTMLInputElement.valueAsDate */
  Date get valueAsDate native "HTMLInputElement_valueAsDate_Getter";


  /** @domName HTMLInputElement.valueAsDate */
  void set valueAsDate(Date value) native "HTMLInputElement_valueAsDate_Setter";


  /** @domName HTMLInputElement.valueAsNumber */
  num get valueAsNumber native "HTMLInputElement_valueAsNumber_Getter";


  /** @domName HTMLInputElement.valueAsNumber */
  void set valueAsNumber(num value) native "HTMLInputElement_valueAsNumber_Setter";


  /** @domName HTMLInputElement.webkitEntries */
  List<Entry> get webkitEntries native "HTMLInputElement_webkitEntries_Getter";


  /** @domName HTMLInputElement.webkitGrammar */
  bool get webkitGrammar native "HTMLInputElement_webkitGrammar_Getter";


  /** @domName HTMLInputElement.webkitGrammar */
  void set webkitGrammar(bool value) native "HTMLInputElement_webkitGrammar_Setter";


  /** @domName HTMLInputElement.webkitSpeech */
  bool get webkitSpeech native "HTMLInputElement_webkitSpeech_Getter";


  /** @domName HTMLInputElement.webkitSpeech */
  void set webkitSpeech(bool value) native "HTMLInputElement_webkitSpeech_Setter";


  /** @domName HTMLInputElement.webkitdirectory */
  bool get webkitdirectory native "HTMLInputElement_webkitdirectory_Getter";


  /** @domName HTMLInputElement.webkitdirectory */
  void set webkitdirectory(bool value) native "HTMLInputElement_webkitdirectory_Setter";


  /** @domName HTMLInputElement.width */
  int get width native "HTMLInputElement_width_Getter";


  /** @domName HTMLInputElement.width */
  void set width(int value) native "HTMLInputElement_width_Setter";


  /** @domName HTMLInputElement.willValidate */
  bool get willValidate native "HTMLInputElement_willValidate_Getter";


  /** @domName HTMLInputElement.checkValidity */
  bool checkValidity() native "HTMLInputElement_checkValidity_Callback";


  /** @domName HTMLInputElement.select */
  void select() native "HTMLInputElement_select_Callback";


  /** @domName HTMLInputElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLInputElement_setCustomValidity_Callback";

  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName HTMLInputElement.setRangeText_1 */
  void _setRangeText_1(replacement) native "HTMLInputElement_setRangeText_1_Callback";


  /** @domName HTMLInputElement.setRangeText_2 */
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_2_Callback";


  /** @domName HTMLInputElement.setSelectionRange */
  void setSelectionRange(int start, int end, [String direction]) native "HTMLInputElement_setSelectionRange_Callback";

  void stepDown([/*long*/ n]) {
    if (?n) {
      _stepDown_1(n);
      return;
    }
    _stepDown_2();
  }


  /** @domName HTMLInputElement.stepDown_1 */
  void _stepDown_1(n) native "HTMLInputElement_stepDown_1_Callback";


  /** @domName HTMLInputElement.stepDown_2 */
  void _stepDown_2() native "HTMLInputElement_stepDown_2_Callback";

  void stepUp([/*long*/ n]) {
    if (?n) {
      _stepUp_1(n);
      return;
    }
    _stepUp_2();
  }


  /** @domName HTMLInputElement.stepUp_1 */
  void _stepUp_1(n) native "HTMLInputElement_stepUp_1_Callback";


  /** @domName HTMLInputElement.stepUp_2 */
  void _stepUp_2() native "HTMLInputElement_stepUp_2_Callback";

}


// Interfaces representing the InputElement APIs which are supported
// for the various types of InputElement.
// From http://dev.w3.org/html5/spec/the-input-element.html#the-input-element.

/**
 * Exposes the functionality common between all InputElement types.
 */
abstract class InputElementBase implements Element {
  /// @domName HTMLInputElement.autofocus
  bool autofocus;

  /// @domName HTMLInputElement.disabled
  bool disabled;

  /// @domName HTMLInputElement.incremental
  bool incremental;

  /// @domName HTMLInputElement.indeterminate
  bool indeterminate;

  /// @domName HTMLInputElement.labels
  List<Node> get labels;

  /// @domName HTMLInputElement.name
  String name;

  /// @domName HTMLInputElement.validationMessage
  String get validationMessage;

  /// @domName HTMLInputElement.validity
  ValidityState get validity;

  /// @domName HTMLInputElement.value
  String value;

  /// @domName HTMLInputElement.willValidate
  bool get willValidate;

  /// @domName HTMLInputElement.checkValidity
  bool checkValidity();

  /// @domName HTMLInputElement.setCustomValidity
  void setCustomValidity(String error);
}

/**
 * Hidden input which is not intended to be seen or edited by the user.
 */
abstract class HiddenInputElement implements Element {
  factory HiddenInputElement() => new InputElement(type: 'hidden');
}


/**
 * Base interface for all inputs which involve text editing.
 */
abstract class TextInputElementBase implements InputElementBase {
  /// @domName HTMLInputElement.autocomplete
  String autocomplete;

  /// @domName HTMLInputElement.maxLength
  int maxLength;

  /// @domName HTMLInputElement.pattern
  String pattern;

  /// @domName HTMLInputElement.placeholder
  String placeholder;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;

  /// @domName HTMLInputElement.size
  int size;

  /// @domName HTMLInputElement.select
  void select();

  /// @domName HTMLInputElement.selectionDirection
  String selectionDirection;

  /// @domName HTMLInputElement.selectionEnd
  int selectionEnd;

  /// @domName HTMLInputElement.selectionStart
  int selectionStart;

  /// @domName HTMLInputElement.setSelectionRange
  void setSelectionRange(int start, int end, [String direction]);
}

/**
 * Similar to [TextInputElement], but on platforms where search is styled
 * differently this will get the search style.
 */
abstract class SearchInputElement implements TextInputElementBase {
  factory SearchInputElement() => new InputElement(type: 'search');

  /// @domName HTMLInputElement.dirName;
  String dirName;

  /// @domName HTMLInputElement.list;
  Element get list;
}

/**
 * A basic text input editor control.
 */
abstract class TextInputElement implements TextInputElementBase {
  factory TextInputElement() => new InputElement(type: 'text');

  /// @domName HTMLInputElement.dirName;
  String dirName;

  /// @domName HTMLInputElement.list;
  Element get list;
}

/**
 * A control for editing an absolute URL.
 */
abstract class UrlInputElement implements TextInputElementBase {
  factory UrlInputElement() => new InputElement(type: 'url');

  /// @domName HTMLInputElement.list;
  Element get list;
}

/**
 * Represents a control for editing a telephone number.
 *
 * This provides a single line of text with minimal formatting help since
 * there is a wide variety of telephone numbers.
 */
abstract class TelephoneInputElement implements TextInputElementBase {
  factory TelephoneInputElement() => new InputElement(type: 'tel');

  /// @domName HTMLInputElement.list;
  Element get list;
}

/**
 * An e-mail address or list of e-mail addresses.
 */
abstract class EmailInputElement implements TextInputElementBase {
  factory EmailInputElement() => new InputElement(type: 'email');

  /// @domName HTMLInputElement.autocomplete
  String autocomplete;

  /// @domName HTMLInputElement.autofocus
  bool autofocus;

  /// @domName HTMLInputElement.list;
  Element get list;

  /// @domName HTMLInputElement.maxLength
  int maxLength;

  /// @domName HTMLInputElement.multiple;
  bool multiple;

  /// @domName HTMLInputElement.pattern
  String pattern;

  /// @domName HTMLInputElement.placeholder
  String placeholder;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;

  /// @domName HTMLInputElement.size
  int size;
}

/**
 * Text with no line breaks (sensitive information).
 */
abstract class PasswordInputElement implements TextInputElementBase {
  factory PasswordInputElement() => new InputElement(type: 'password');
}

/**
 * Base interface for all input element types which involve ranges.
 */
abstract class RangeInputElementBase implements InputElementBase {

  /// @domName HTMLInputElement.list
  Element get list;

  /// @domName HTMLInputElement.max
  String max;

  /// @domName HTMLInputElement.min
  String min;

  /// @domName HTMLInputElement.step
  String step;

  /// @domName HTMLInputElement.valueAsNumber
  num valueAsNumber;

  /// @domName HTMLInputElement.stepDown
  void stepDown([int n]);

  /// @domName HTMLInputElement.stepUp
  void stepUp([int n]);
}

/**
 * A date and time (year, month, day, hour, minute, second, fraction of a
 * second) with the time zone set to UTC.
 */
abstract class DateTimeInputElement implements RangeInputElementBase {
  factory DateTimeInputElement() => new InputElement(type: 'datetime');

  /// @domName HTMLInputElement.valueAsDate
  Date valueAsDate;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A date (year, month, day) with no time zone.
 */
abstract class DateInputElement implements RangeInputElementBase {
  factory DateInputElement() => new InputElement(type: 'date');

  /// @domName HTMLInputElement.valueAsDate
  Date valueAsDate;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A date consisting of a year and a month with no time zone.
 */
abstract class MonthInputElement implements RangeInputElementBase {
  factory MonthInputElement() => new InputElement(type: 'month');

  /// @domName HTMLInputElement.valueAsDate
  Date valueAsDate;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A date consisting of a week-year number and a week number with no time zone.
 */
abstract class WeekInputElement implements RangeInputElementBase {
  factory WeekInputElement() => new InputElement(type: 'week');

  /// @domName HTMLInputElement.valueAsDate
  Date valueAsDate;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A time (hour, minute, seconds, fractional seconds) with no time zone.
 */
abstract class TimeInputElement implements RangeInputElementBase {
  factory TimeInputElement() => new InputElement(type: 'time');

  /// @domName HTMLInputElement.valueAsDate
  Date valueAsDate;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A date and time (year, month, day, hour, minute, second, fraction of a
 * second) with no time zone.
 */
abstract class LocalDateTimeInputElement implements RangeInputElementBase {
  factory LocalDateTimeInputElement() =>
      new InputElement(type: 'datetime-local');

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A numeric editor control.
 */
abstract class NumberInputElement implements RangeInputElementBase {
  factory NumberInputElement() => new InputElement(type: 'number');

  /// @domName HTMLInputElement.placeholder
  String placeholder;

  /// @domName HTMLInputElement.readOnly
  bool readOnly;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * Similar to [NumberInputElement] but the browser may provide more optimal
 * styling (such as a slider control).
 */
abstract class RangeInputElement implements RangeInputElementBase {
  factory RangeInputElement() => new InputElement(type: 'range');
}

/**
 * A boolean editor control.
 *
 * Note that if [indeterminate] is set then this control is in a third
 * indeterminate state.
 */
abstract class CheckboxInputElement implements InputElementBase {
  factory CheckboxInputElement() => new InputElement(type: 'checkbox');

  /// @domName HTMLInputElement.checked
  bool checked;

  /// @domName HTMLInputElement.required
  bool required;
}


/**
 * A control that when used with other [ReadioButtonInputElement] controls
 * forms a radio button group in which only one control can be checked at a
 * time.
 *
 * Radio buttons are considered to be in the same radio button group if:
 *
 * * They are all of type 'radio'.
 * * They all have either the same [FormElement] owner, or no owner.
 * * Their name attributes contain the same name.
 */
abstract class RadioButtonInputElement implements InputElementBase {
  factory RadioButtonInputElement() => new InputElement(type: 'radio');

  /// @domName HTMLInputElement.checked
  bool checked;

  /// @domName HTMLInputElement.required
  bool required;
}

/**
 * A control for picking files from the user's computer.
 */
abstract class FileUploadInputElement implements InputElementBase {
  factory FileUploadInputElement() => new InputElement(type: 'file');

  /// @domName HTMLInputElement.accept
  String accept;

  /// @domName HTMLInputElement.multiple
  bool multiple;

  /// @domName HTMLInputElement.required
  bool required;

  /// @domName HTMLInputElement.files
  List<File> files;
}

/**
 * A button, which when clicked, submits the form.
 */
abstract class SubmitButtonInputElement implements InputElementBase {
  factory SubmitButtonInputElement() => new InputElement(type: 'submit');

  /// @domName HTMLInputElement.formAction
  String formAction;

  /// @domName HTMLInputElement.formEnctype
  String formEnctype;

  /// @domName HTMLInputElement.formMethod
  String formMethod;

  /// @domName HTMLInputElement.formNoValidate
  bool formNoValidate;

  /// @domName HTMLInputElement.formTarget
  String formTarget;
}

/**
 * Either an image which the user can select a coordinate to or a form
 * submit button.
 */
abstract class ImageButtonInputElement implements InputElementBase {
  factory ImageButtonInputElement() => new InputElement(type: 'image');

  /// @domName HTMLInputElement.alt
  String alt;

  /// @domName HTMLInputElement.formAction
  String formAction;

  /// @domName HTMLInputElement.formEnctype
  String formEnctype;

  /// @domName HTMLInputElement.formMethod
  String formMethod;

  /// @domName HTMLInputElement.formNoValidate
  bool formNoValidate;

  /// @domName HTMLInputElement.formTarget
  String formTarget;

  /// @domName HTMLInputElement.height
  int height;

  /// @domName HTMLInputElement.src
  String src;

  /// @domName HTMLInputElement.width
  int width;
}

/**
 * A button, which when clicked, resets the form.
 */
abstract class ResetButtonInputElement implements InputElementBase {
  factory ResetButtonInputElement() => new InputElement(type: 'reset');
}

/**
 * A button, with no default behavior.
 */
abstract class ButtonInputElement implements InputElementBase {
  factory ButtonInputElement() => new InputElement(type: 'button');
}


/// @docsEditable true
class InputElementEvents extends ElementEvents {
  /// @docsEditable true
  InputElementEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get speechChange => this['webkitSpeechChange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Int16Array
class Int16Array extends ArrayBufferView implements List<int> {

  factory Int16Array(int length) =>
    _TypedArrayFactoryProvider.createInt16Array(length);

  factory Int16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt16Array_fromList(list);

  factory Int16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt16Array_fromBuffer(buffer, byteOffset, length);
  Int16Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 2;


  /** @domName Int16Array.length */
  int get length native "Int16Array_length_Getter";


  /** @domName Int16Array.numericIndexGetter */
  int operator[](int index) native "Int16Array_numericIndexGetter_Callback";


  /** @domName Int16Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int16Array.setElements */
  void setElements(Object array, [int offset]) native "Int16Array_setElements_Callback";

  Int16Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int16Array.subarray_1 */
  Int16Array _subarray_1(start, end) native "Int16Array_subarray_1_Callback";


  /** @domName Int16Array.subarray_2 */
  Int16Array _subarray_2(start) native "Int16Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Int32Array
class Int32Array extends ArrayBufferView implements List<int> {

  factory Int32Array(int length) =>
    _TypedArrayFactoryProvider.createInt32Array(length);

  factory Int32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt32Array_fromList(list);

  factory Int32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt32Array_fromBuffer(buffer, byteOffset, length);
  Int32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Int32Array.length */
  int get length native "Int32Array_length_Getter";


  /** @domName Int32Array.numericIndexGetter */
  int operator[](int index) native "Int32Array_numericIndexGetter_Callback";


  /** @domName Int32Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int32Array.setElements */
  void setElements(Object array, [int offset]) native "Int32Array_setElements_Callback";

  Int32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int32Array.subarray_1 */
  Int32Array _subarray_1(start, end) native "Int32Array_subarray_1_Callback";


  /** @domName Int32Array.subarray_2 */
  Int32Array _subarray_2(start) native "Int32Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Int8Array
class Int8Array extends ArrayBufferView implements List<int> {

  factory Int8Array(int length) =>
    _TypedArrayFactoryProvider.createInt8Array(length);

  factory Int8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createInt8Array_fromList(list);

  factory Int8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createInt8Array_fromBuffer(buffer, byteOffset, length);
  Int8Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 1;


  /** @domName Int8Array.length */
  int get length native "Int8Array_length_Getter";


  /** @domName Int8Array.numericIndexGetter */
  int operator[](int index) native "Int8Array_numericIndexGetter_Callback";


  /** @domName Int8Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Int8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Int8Array.setElements */
  void setElements(Object array, [int offset]) native "Int8Array_setElements_Callback";

  Int8Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Int8Array.subarray_1 */
  Int8Array _subarray_1(start, end) native "Int8Array_subarray_1_Callback";


  /** @domName Int8Array.subarray_2 */
  Int8Array _subarray_2(start) native "Int8Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName JavaScriptCallFrame
class JavaScriptCallFrame extends NativeFieldWrapperClass1 {
  JavaScriptCallFrame.internal();

  static const int CATCH_SCOPE = 4;

  static const int CLOSURE_SCOPE = 3;

  static const int GLOBAL_SCOPE = 0;

  static const int LOCAL_SCOPE = 1;

  static const int WITH_SCOPE = 2;


  /** @domName JavaScriptCallFrame.caller */
  JavaScriptCallFrame get caller native "JavaScriptCallFrame_caller_Getter";


  /** @domName JavaScriptCallFrame.column */
  int get column native "JavaScriptCallFrame_column_Getter";


  /** @domName JavaScriptCallFrame.functionName */
  String get functionName native "JavaScriptCallFrame_functionName_Getter";


  /** @domName JavaScriptCallFrame.line */
  int get line native "JavaScriptCallFrame_line_Getter";


  /** @domName JavaScriptCallFrame.scopeChain */
  List get scopeChain native "JavaScriptCallFrame_scopeChain_Getter";


  /** @domName JavaScriptCallFrame.sourceID */
  int get sourceID native "JavaScriptCallFrame_sourceID_Getter";


  /** @domName JavaScriptCallFrame.thisObject */
  Object get thisObject native "JavaScriptCallFrame_thisObject_Getter";


  /** @domName JavaScriptCallFrame.type */
  String get type native "JavaScriptCallFrame_type_Getter";


  /** @domName JavaScriptCallFrame.evaluate */
  void evaluate(String script) native "JavaScriptCallFrame_evaluate_Callback";


  /** @domName JavaScriptCallFrame.restart */
  Object restart() native "JavaScriptCallFrame_restart_Callback";


  /** @domName JavaScriptCallFrame.scopeType */
  int scopeType(int scopeIndex) native "JavaScriptCallFrame_scopeType_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName KeyboardEvent; @docsEditable true
class KeyboardEvent extends UIEvent {

  factory KeyboardEvent(String type, Window view,
      [bool canBubble = true, bool cancelable = true, 
      String keyIdentifier = "", int keyLocation = 1, bool ctrlKey = false,
      bool altKey = false, bool shiftKey = false, bool metaKey = false,
      bool altGraphKey = false]) {
    final e = document.$dom_createEvent("KeyboardEvent");
    e.$dom_initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier,
        keyLocation, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
    return e;
  }

  /** @domName KeyboardEvent.keyCode */
  int get keyCode => $dom_keyCode;
  
  /** @domName KeyboardEvent.charCode */
  int get charCode => $dom_charCode;
  KeyboardEvent.internal(): super.internal();


  /** @domName KeyboardEvent.altGraphKey */
  bool get altGraphKey native "KeyboardEvent_altGraphKey_Getter";


  /** @domName KeyboardEvent.altKey */
  bool get altKey native "KeyboardEvent_altKey_Getter";


  /** @domName KeyboardEvent.ctrlKey */
  bool get ctrlKey native "KeyboardEvent_ctrlKey_Getter";


  /** @domName KeyboardEvent.keyIdentifier */
  String get $dom_keyIdentifier native "KeyboardEvent_keyIdentifier_Getter";


  /** @domName KeyboardEvent.keyLocation */
  int get keyLocation native "KeyboardEvent_keyLocation_Getter";


  /** @domName KeyboardEvent.metaKey */
  bool get metaKey native "KeyboardEvent_metaKey_Getter";


  /** @domName KeyboardEvent.shiftKey */
  bool get shiftKey native "KeyboardEvent_shiftKey_Getter";


  /** @domName KeyboardEvent.initKeyboardEvent */
  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable, LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLKeygenElement
class KeygenElement extends _Element_Merged {

  ///@docsEditable true
  factory KeygenElement() => document.$dom_createElement("keygen");
  KeygenElement.internal(): super.internal();


  /** @domName HTMLKeygenElement.autofocus */
  bool get autofocus native "HTMLKeygenElement_autofocus_Getter";


  /** @domName HTMLKeygenElement.autofocus */
  void set autofocus(bool value) native "HTMLKeygenElement_autofocus_Setter";


  /** @domName HTMLKeygenElement.challenge */
  String get challenge native "HTMLKeygenElement_challenge_Getter";


  /** @domName HTMLKeygenElement.challenge */
  void set challenge(String value) native "HTMLKeygenElement_challenge_Setter";


  /** @domName HTMLKeygenElement.disabled */
  bool get disabled native "HTMLKeygenElement_disabled_Getter";


  /** @domName HTMLKeygenElement.disabled */
  void set disabled(bool value) native "HTMLKeygenElement_disabled_Setter";


  /** @domName HTMLKeygenElement.form */
  FormElement get form native "HTMLKeygenElement_form_Getter";


  /** @domName HTMLKeygenElement.keytype */
  String get keytype native "HTMLKeygenElement_keytype_Getter";


  /** @domName HTMLKeygenElement.keytype */
  void set keytype(String value) native "HTMLKeygenElement_keytype_Setter";


  /** @domName HTMLKeygenElement.labels */
  List<Node> get labels native "HTMLKeygenElement_labels_Getter";


  /** @domName HTMLKeygenElement.name */
  String get name native "HTMLKeygenElement_name_Getter";


  /** @domName HTMLKeygenElement.name */
  void set name(String value) native "HTMLKeygenElement_name_Setter";


  /** @domName HTMLKeygenElement.type */
  String get type native "HTMLKeygenElement_type_Getter";


  /** @domName HTMLKeygenElement.validationMessage */
  String get validationMessage native "HTMLKeygenElement_validationMessage_Getter";


  /** @domName HTMLKeygenElement.validity */
  ValidityState get validity native "HTMLKeygenElement_validity_Getter";


  /** @domName HTMLKeygenElement.willValidate */
  bool get willValidate native "HTMLKeygenElement_willValidate_Getter";


  /** @domName HTMLKeygenElement.checkValidity */
  bool checkValidity() native "HTMLKeygenElement_checkValidity_Callback";


  /** @domName HTMLKeygenElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLKeygenElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLLIElement
class LIElement extends _Element_Merged {

  ///@docsEditable true
  factory LIElement() => document.$dom_createElement("li");
  LIElement.internal(): super.internal();


  /** @domName HTMLLIElement.type */
  String get type native "HTMLLIElement_type_Getter";


  /** @domName HTMLLIElement.type */
  void set type(String value) native "HTMLLIElement_type_Setter";


  /** @domName HTMLLIElement.value */
  int get value native "HTMLLIElement_value_Getter";


  /** @domName HTMLLIElement.value */
  void set value(int value) native "HTMLLIElement_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLLabelElement
class LabelElement extends _Element_Merged {

  ///@docsEditable true
  factory LabelElement() => document.$dom_createElement("label");
  LabelElement.internal(): super.internal();


  /** @domName HTMLLabelElement.control */
  Element get control native "HTMLLabelElement_control_Getter";


  /** @domName HTMLLabelElement.form */
  FormElement get form native "HTMLLabelElement_form_Getter";


  /** @domName HTMLLabelElement.htmlFor */
  String get htmlFor native "HTMLLabelElement_htmlFor_Getter";


  /** @domName HTMLLabelElement.htmlFor */
  void set htmlFor(String value) native "HTMLLabelElement_htmlFor_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLLegendElement
class LegendElement extends _Element_Merged {

  ///@docsEditable true
  factory LegendElement() => document.$dom_createElement("legend");
  LegendElement.internal(): super.internal();


  /** @domName HTMLLegendElement.align */
  String get align native "HTMLLegendElement_align_Getter";


  /** @domName HTMLLegendElement.align */
  void set align(String value) native "HTMLLegendElement_align_Setter";


  /** @domName HTMLLegendElement.form */
  FormElement get form native "HTMLLegendElement_form_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLLinkElement
class LinkElement extends _Element_Merged {

  ///@docsEditable true
  factory LinkElement() => document.$dom_createElement("link");
  LinkElement.internal(): super.internal();


  /** @domName HTMLLinkElement.charset */
  String get charset native "HTMLLinkElement_charset_Getter";


  /** @domName HTMLLinkElement.charset */
  void set charset(String value) native "HTMLLinkElement_charset_Setter";


  /** @domName HTMLLinkElement.disabled */
  bool get disabled native "HTMLLinkElement_disabled_Getter";


  /** @domName HTMLLinkElement.disabled */
  void set disabled(bool value) native "HTMLLinkElement_disabled_Setter";


  /** @domName HTMLLinkElement.href */
  String get href native "HTMLLinkElement_href_Getter";


  /** @domName HTMLLinkElement.href */
  void set href(String value) native "HTMLLinkElement_href_Setter";


  /** @domName HTMLLinkElement.hreflang */
  String get hreflang native "HTMLLinkElement_hreflang_Getter";


  /** @domName HTMLLinkElement.hreflang */
  void set hreflang(String value) native "HTMLLinkElement_hreflang_Setter";


  /** @domName HTMLLinkElement.media */
  String get media native "HTMLLinkElement_media_Getter";


  /** @domName HTMLLinkElement.media */
  void set media(String value) native "HTMLLinkElement_media_Setter";


  /** @domName HTMLLinkElement.rel */
  String get rel native "HTMLLinkElement_rel_Getter";


  /** @domName HTMLLinkElement.rel */
  void set rel(String value) native "HTMLLinkElement_rel_Setter";


  /** @domName HTMLLinkElement.rev */
  String get rev native "HTMLLinkElement_rev_Getter";


  /** @domName HTMLLinkElement.rev */
  void set rev(String value) native "HTMLLinkElement_rev_Setter";


  /** @domName HTMLLinkElement.sheet */
  StyleSheet get sheet native "HTMLLinkElement_sheet_Getter";


  /** @domName HTMLLinkElement.sizes */
  DomSettableTokenList get sizes native "HTMLLinkElement_sizes_Getter";


  /** @domName HTMLLinkElement.sizes */
  void set sizes(DomSettableTokenList value) native "HTMLLinkElement_sizes_Setter";


  /** @domName HTMLLinkElement.target */
  String get target native "HTMLLinkElement_target_Getter";


  /** @domName HTMLLinkElement.target */
  void set target(String value) native "HTMLLinkElement_target_Setter";


  /** @domName HTMLLinkElement.type */
  String get type native "HTMLLinkElement_type_Getter";


  /** @domName HTMLLinkElement.type */
  void set type(String value) native "HTMLLinkElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName History
class LocalHistory extends NativeFieldWrapperClass1 implements History {
  LocalHistory.internal();


  /** @domName History.length */
  int get length native "History_length_Getter";


  /** @domName History.state */
  dynamic get state native "History_state_Getter";


  /** @domName History.back */
  void back() native "History_back_Callback";


  /** @domName History.forward */
  void forward() native "History_forward_Callback";


  /** @domName History.go */
  void go(int distance) native "History_go_Callback";


  /** @domName History.pushState */
  void pushState(Object data, String title, [String url]) native "History_pushState_Callback";


  /** @domName History.replaceState */
  void replaceState(Object data, String title, [String url]) native "History_replaceState_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Location
class LocalLocation extends NativeFieldWrapperClass1 implements Location {
  LocalLocation.internal();


  /** @domName Location.ancestorOrigins */
  List<String> get ancestorOrigins native "Location_ancestorOrigins_Getter";


  /** @domName Location.hash */
  String get hash native "Location_hash_Getter";


  /** @domName Location.hash */
  void set hash(String value) native "Location_hash_Setter";


  /** @domName Location.host */
  String get host native "Location_host_Getter";


  /** @domName Location.host */
  void set host(String value) native "Location_host_Setter";


  /** @domName Location.hostname */
  String get hostname native "Location_hostname_Getter";


  /** @domName Location.hostname */
  void set hostname(String value) native "Location_hostname_Setter";


  /** @domName Location.href */
  String get href native "Location_href_Getter";


  /** @domName Location.href */
  void set href(String value) native "Location_href_Setter";


  /** @domName Location.origin */
  String get origin native "Location_origin_Getter";


  /** @domName Location.pathname */
  String get pathname native "Location_pathname_Getter";


  /** @domName Location.pathname */
  void set pathname(String value) native "Location_pathname_Setter";


  /** @domName Location.port */
  String get port native "Location_port_Getter";


  /** @domName Location.port */
  void set port(String value) native "Location_port_Setter";


  /** @domName Location.protocol */
  String get protocol native "Location_protocol_Getter";


  /** @domName Location.protocol */
  void set protocol(String value) native "Location_protocol_Setter";


  /** @domName Location.search */
  String get search native "Location_search_Getter";


  /** @domName Location.search */
  void set search(String value) native "Location_search_Setter";


  /** @domName Location.assign */
  void assign(String url) native "Location_assign_Callback";


  /** @domName Location.reload */
  void reload() native "Location_reload_Callback";


  /** @domName Location.replace */
  void replace(String url) native "Location_replace_Callback";


  /** @domName Location.toString */
  String toString() native "Location_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName LocalMediaStream
class LocalMediaStream extends MediaStream implements EventTarget {
  LocalMediaStream.internal(): super.internal();


  /** @domName LocalMediaStream.stop */
  void stop() native "LocalMediaStream_stop_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName Window
class LocalWindow extends EventTarget implements Window {

  /**
   * Executes a [callback] after the next batch of browser layout measurements
   * has completed or would have completed if any browser layout measurements
   * had been scheduled.
   */
  void requestLayoutFrame(TimeoutHandler callback) {
    _addMeasurementFrameCallback(callback);
  }

  /**
   * Lookup a port by its [name].  Return null if no port is
   * registered under [name].
   */
  lookupPort(String name) {
    var port = JSON.parse(document.documentElement.attributes['dart-port:$name']);
    return _deserialize(port);
  }

  /**
   * Register a [port] on this window under the given [name].  This
   * port may be retrieved by any isolate (or JavaScript script)
   * running in this window.
   */
  registerPort(String name, var port) {
    var serialized = _serialize(port);
    document.documentElement.attributes['dart-port:$name'] = JSON.stringify(serialized);
  }

  LocalWindow.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  LocalWindowEvents get on =>
    new LocalWindowEvents(this);

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName DOMWindow.applicationCache */
  ApplicationCache get applicationCache native "DOMWindow_applicationCache_Getter";


  /** @domName DOMWindow.closed */
  bool get closed native "DOMWindow_closed_Getter";


  /** @domName DOMWindow.console */
  Console get console native "DOMWindow_console_Getter";


  /** @domName DOMWindow.crypto */
  Crypto get crypto native "DOMWindow_crypto_Getter";


  /** @domName DOMWindow.defaultStatus */
  String get defaultStatus native "DOMWindow_defaultStatus_Getter";


  /** @domName DOMWindow.defaultStatus */
  void set defaultStatus(String value) native "DOMWindow_defaultStatus_Setter";


  /** @domName DOMWindow.defaultstatus */
  String get defaultstatus native "DOMWindow_defaultstatus_Getter";


  /** @domName DOMWindow.defaultstatus */
  void set defaultstatus(String value) native "DOMWindow_defaultstatus_Setter";


  /** @domName DOMWindow.devicePixelRatio */
  num get devicePixelRatio native "DOMWindow_devicePixelRatio_Getter";


  /** @domName DOMWindow.document */
  Document get document native "DOMWindow_document_Getter";


  /** @domName DOMWindow.event */
  Event get event native "DOMWindow_event_Getter";


  /** @domName DOMWindow.history */
  LocalHistory get history native "DOMWindow_history_Getter";


  /** @domName DOMWindow.indexedDB */
  IdbFactory get indexedDB native "DOMWindow_indexedDB_Getter";


  /** @domName DOMWindow.innerHeight */
  int get innerHeight native "DOMWindow_innerHeight_Getter";


  /** @domName DOMWindow.innerWidth */
  int get innerWidth native "DOMWindow_innerWidth_Getter";


  /** @domName DOMWindow.localStorage */
  Storage get localStorage native "DOMWindow_localStorage_Getter";


  /** @domName DOMWindow.location */
  LocalLocation get location native "DOMWindow_location_Getter";


  /** @domName DOMWindow.location */
  void set location(LocalLocation value) native "DOMWindow_location_Setter";


  /** @domName DOMWindow.locationbar */
  BarInfo get locationbar native "DOMWindow_locationbar_Getter";


  /** @domName DOMWindow.menubar */
  BarInfo get menubar native "DOMWindow_menubar_Getter";


  /** @domName DOMWindow.name */
  String get name native "DOMWindow_name_Getter";


  /** @domName DOMWindow.name */
  void set name(String value) native "DOMWindow_name_Setter";


  /** @domName DOMWindow.navigator */
  Navigator get navigator native "DOMWindow_navigator_Getter";


  /** @domName DOMWindow.offscreenBuffering */
  bool get offscreenBuffering native "DOMWindow_offscreenBuffering_Getter";


  /** @domName DOMWindow.opener */
  Window get opener native "DOMWindow_opener_Getter";


  /** @domName DOMWindow.outerHeight */
  int get outerHeight native "DOMWindow_outerHeight_Getter";


  /** @domName DOMWindow.outerWidth */
  int get outerWidth native "DOMWindow_outerWidth_Getter";


  /** @domName DOMWindow.pagePopupController */
  PagePopupController get pagePopupController native "DOMWindow_pagePopupController_Getter";


  /** @domName DOMWindow.pageXOffset */
  int get pageXOffset native "DOMWindow_pageXOffset_Getter";


  /** @domName DOMWindow.pageYOffset */
  int get pageYOffset native "DOMWindow_pageYOffset_Getter";


  /** @domName DOMWindow.parent */
  Window get parent native "DOMWindow_parent_Getter";


  /** @domName DOMWindow.performance */
  Performance get performance native "DOMWindow_performance_Getter";


  /** @domName DOMWindow.personalbar */
  BarInfo get personalbar native "DOMWindow_personalbar_Getter";


  /** @domName DOMWindow.screen */
  Screen get screen native "DOMWindow_screen_Getter";


  /** @domName DOMWindow.screenLeft */
  int get screenLeft native "DOMWindow_screenLeft_Getter";


  /** @domName DOMWindow.screenTop */
  int get screenTop native "DOMWindow_screenTop_Getter";


  /** @domName DOMWindow.screenX */
  int get screenX native "DOMWindow_screenX_Getter";


  /** @domName DOMWindow.screenY */
  int get screenY native "DOMWindow_screenY_Getter";


  /** @domName DOMWindow.scrollX */
  int get scrollX native "DOMWindow_scrollX_Getter";


  /** @domName DOMWindow.scrollY */
  int get scrollY native "DOMWindow_scrollY_Getter";


  /** @domName DOMWindow.scrollbars */
  BarInfo get scrollbars native "DOMWindow_scrollbars_Getter";


  /** @domName DOMWindow.self */
  Window get self native "DOMWindow_self_Getter";


  /** @domName DOMWindow.sessionStorage */
  Storage get sessionStorage native "DOMWindow_sessionStorage_Getter";


  /** @domName DOMWindow.status */
  String get status native "DOMWindow_status_Getter";


  /** @domName DOMWindow.status */
  void set status(String value) native "DOMWindow_status_Setter";


  /** @domName DOMWindow.statusbar */
  BarInfo get statusbar native "DOMWindow_statusbar_Getter";


  /** @domName DOMWindow.styleMedia */
  StyleMedia get styleMedia native "DOMWindow_styleMedia_Getter";


  /** @domName DOMWindow.toolbar */
  BarInfo get toolbar native "DOMWindow_toolbar_Getter";


  /** @domName DOMWindow.top */
  Window get top native "DOMWindow_top_Getter";


  /** @domName DOMWindow.webkitNotifications */
  NotificationCenter get webkitNotifications native "DOMWindow_webkitNotifications_Getter";


  /** @domName DOMWindow.webkitStorageInfo */
  StorageInfo get webkitStorageInfo native "DOMWindow_webkitStorageInfo_Getter";


  /** @domName DOMWindow.window */
  Window get window native "DOMWindow_window_Getter";


  /** @domName DOMWindow.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_addEventListener_Callback";


  /** @domName DOMWindow.alert */
  void alert(String message) native "DOMWindow_alert_Callback";


  /** @domName DOMWindow.atob */
  String atob(String string) native "DOMWindow_atob_Callback";


  /** @domName DOMWindow.btoa */
  String btoa(String string) native "DOMWindow_btoa_Callback";


  /** @domName DOMWindow.cancelAnimationFrame */
  void cancelAnimationFrame(int id) native "DOMWindow_cancelAnimationFrame_Callback";


  /** @domName DOMWindow.captureEvents */
  void captureEvents() native "DOMWindow_captureEvents_Callback";


  /** @domName DOMWindow.clearInterval */
  void clearInterval(int handle) native "DOMWindow_clearInterval_Callback";


  /** @domName DOMWindow.clearTimeout */
  void clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";


  /** @domName DOMWindow.close */
  void close() native "DOMWindow_close_Callback";


  /** @domName DOMWindow.confirm */
  bool confirm(String message) native "DOMWindow_confirm_Callback";


  /** @domName DOMWindow.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "DOMWindow_dispatchEvent_Callback";


  /** @domName DOMWindow.find */
  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) native "DOMWindow_find_Callback";


  /** @domName DOMWindow.getComputedStyle */
  CssStyleDeclaration $dom_getComputedStyle(Element element, String pseudoElement) native "DOMWindow_getComputedStyle_Callback";


  /** @domName DOMWindow.getMatchedCSSRules */
  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) native "DOMWindow_getMatchedCSSRules_Callback";


  /** @domName DOMWindow.getSelection */
  DomSelection getSelection() native "DOMWindow_getSelection_Callback";


  /** @domName DOMWindow.matchMedia */
  MediaQueryList matchMedia(String query) native "DOMWindow_matchMedia_Callback";


  /** @domName DOMWindow.moveBy */
  void moveBy(num x, num y) native "DOMWindow_moveBy_Callback";


  /** @domName DOMWindow.moveTo */
  void moveTo(num x, num y) native "DOMWindow_moveTo_Callback";


  /** @domName DOMWindow.open */
  Window open(String url, String name, [String options]) native "DOMWindow_open_Callback";


  /** @domName DOMWindow.openDatabase */
  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "DOMWindow_openDatabase_Callback";


  /** @domName DOMWindow.postMessage */
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";


  /** @domName DOMWindow.print */
  void print() native "DOMWindow_print_Callback";


  /** @domName DOMWindow.releaseEvents */
  void releaseEvents() native "DOMWindow_releaseEvents_Callback";


  /** @domName DOMWindow.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "DOMWindow_removeEventListener_Callback";


  /** @domName DOMWindow.requestAnimationFrame */
  int requestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_requestAnimationFrame_Callback";


  /** @domName DOMWindow.resizeBy */
  void resizeBy(num x, num y) native "DOMWindow_resizeBy_Callback";


  /** @domName DOMWindow.resizeTo */
  void resizeTo(num width, num height) native "DOMWindow_resizeTo_Callback";


  /** @domName DOMWindow.scroll */
  void scroll(int x, int y) native "DOMWindow_scroll_Callback";


  /** @domName DOMWindow.scrollBy */
  void scrollBy(int x, int y) native "DOMWindow_scrollBy_Callback";


  /** @domName DOMWindow.scrollTo */
  void scrollTo(int x, int y) native "DOMWindow_scrollTo_Callback";


  /** @domName DOMWindow.setInterval */
  int setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";


  /** @domName DOMWindow.setTimeout */
  int setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";


  /** @domName DOMWindow.showModalDialog */
  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) native "DOMWindow_showModalDialog_Callback";


  /** @domName DOMWindow.stop */
  void stop() native "DOMWindow_stop_Callback";


  /** @domName DOMWindow.webkitCancelAnimationFrame */
  void webkitCancelAnimationFrame(int id) native "DOMWindow_webkitCancelAnimationFrame_Callback";


  /** @domName DOMWindow.webkitConvertPointFromNodeToPage */
  Point webkitConvertPointFromNodeToPage(Node node, Point p) native "DOMWindow_webkitConvertPointFromNodeToPage_Callback";


  /** @domName DOMWindow.webkitConvertPointFromPageToNode */
  Point webkitConvertPointFromPageToNode(Node node, Point p) native "DOMWindow_webkitConvertPointFromPageToNode_Callback";


  /** @domName DOMWindow.webkitRequestAnimationFrame */
  int webkitRequestAnimationFrame(RequestAnimationFrameCallback callback) native "DOMWindow_webkitRequestAnimationFrame_Callback";


  /** @domName DOMWindow.webkitRequestFileSystem */
  void webkitRequestFileSystem(int type, int size, FileSystemCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitRequestFileSystem_Callback";


  /** @domName DOMWindow.webkitResolveLocalFileSystemURL */
  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "DOMWindow_webkitResolveLocalFileSystemURL_Callback";

}

/// @docsEditable true
class LocalWindowEvents extends Events {
  /// @docsEditable true
  LocalWindowEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get abort => this['abort'];

  /// @docsEditable true
  EventListenerList get beforeUnload => this['beforeunload'];

  /// @docsEditable true
  EventListenerList get blur => this['blur'];

  /// @docsEditable true
  EventListenerList get canPlay => this['canplay'];

  /// @docsEditable true
  EventListenerList get canPlayThrough => this['canplaythrough'];

  /// @docsEditable true
  EventListenerList get change => this['change'];

  /// @docsEditable true
  EventListenerList get click => this['click'];

  /// @docsEditable true
  EventListenerList get contextMenu => this['contextmenu'];

  /// @docsEditable true
  EventListenerList get doubleClick => this['dblclick'];

  /// @docsEditable true
  EventListenerList get deviceMotion => this['devicemotion'];

  /// @docsEditable true
  EventListenerList get deviceOrientation => this['deviceorientation'];

  /// @docsEditable true
  EventListenerList get drag => this['drag'];

  /// @docsEditable true
  EventListenerList get dragEnd => this['dragend'];

  /// @docsEditable true
  EventListenerList get dragEnter => this['dragenter'];

  /// @docsEditable true
  EventListenerList get dragLeave => this['dragleave'];

  /// @docsEditable true
  EventListenerList get dragOver => this['dragover'];

  /// @docsEditable true
  EventListenerList get dragStart => this['dragstart'];

  /// @docsEditable true
  EventListenerList get drop => this['drop'];

  /// @docsEditable true
  EventListenerList get durationChange => this['durationchange'];

  /// @docsEditable true
  EventListenerList get emptied => this['emptied'];

  /// @docsEditable true
  EventListenerList get ended => this['ended'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get focus => this['focus'];

  /// @docsEditable true
  EventListenerList get hashChange => this['hashchange'];

  /// @docsEditable true
  EventListenerList get input => this['input'];

  /// @docsEditable true
  EventListenerList get invalid => this['invalid'];

  /// @docsEditable true
  EventListenerList get keyDown => this['keydown'];

  /// @docsEditable true
  EventListenerList get keyPress => this['keypress'];

  /// @docsEditable true
  EventListenerList get keyUp => this['keyup'];

  /// @docsEditable true
  EventListenerList get load => this['load'];

  /// @docsEditable true
  EventListenerList get loadedData => this['loadeddata'];

  /// @docsEditable true
  EventListenerList get loadedMetadata => this['loadedmetadata'];

  /// @docsEditable true
  EventListenerList get loadStart => this['loadstart'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get mouseDown => this['mousedown'];

  /// @docsEditable true
  EventListenerList get mouseMove => this['mousemove'];

  /// @docsEditable true
  EventListenerList get mouseOut => this['mouseout'];

  /// @docsEditable true
  EventListenerList get mouseOver => this['mouseover'];

  /// @docsEditable true
  EventListenerList get mouseUp => this['mouseup'];

  /// @docsEditable true
  EventListenerList get mouseWheel => this['mousewheel'];

  /// @docsEditable true
  EventListenerList get offline => this['offline'];

  /// @docsEditable true
  EventListenerList get online => this['online'];

  /// @docsEditable true
  EventListenerList get pageHide => this['pagehide'];

  /// @docsEditable true
  EventListenerList get pageShow => this['pageshow'];

  /// @docsEditable true
  EventListenerList get pause => this['pause'];

  /// @docsEditable true
  EventListenerList get play => this['play'];

  /// @docsEditable true
  EventListenerList get playing => this['playing'];

  /// @docsEditable true
  EventListenerList get popState => this['popstate'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];

  /// @docsEditable true
  EventListenerList get rateChange => this['ratechange'];

  /// @docsEditable true
  EventListenerList get reset => this['reset'];

  /// @docsEditable true
  EventListenerList get resize => this['resize'];

  /// @docsEditable true
  EventListenerList get scroll => this['scroll'];

  /// @docsEditable true
  EventListenerList get search => this['search'];

  /// @docsEditable true
  EventListenerList get seeked => this['seeked'];

  /// @docsEditable true
  EventListenerList get seeking => this['seeking'];

  /// @docsEditable true
  EventListenerList get select => this['select'];

  /// @docsEditable true
  EventListenerList get stalled => this['stalled'];

  /// @docsEditable true
  EventListenerList get storage => this['storage'];

  /// @docsEditable true
  EventListenerList get submit => this['submit'];

  /// @docsEditable true
  EventListenerList get suspend => this['suspend'];

  /// @docsEditable true
  EventListenerList get timeUpdate => this['timeupdate'];

  /// @docsEditable true
  EventListenerList get touchCancel => this['touchcancel'];

  /// @docsEditable true
  EventListenerList get touchEnd => this['touchend'];

  /// @docsEditable true
  EventListenerList get touchMove => this['touchmove'];

  /// @docsEditable true
  EventListenerList get touchStart => this['touchstart'];

  /// @docsEditable true
  EventListenerList get unload => this['unload'];

  /// @docsEditable true
  EventListenerList get volumeChange => this['volumechange'];

  /// @docsEditable true
  EventListenerList get waiting => this['waiting'];

  /// @docsEditable true
  EventListenerList get animationEnd => this['webkitAnimationEnd'];

  /// @docsEditable true
  EventListenerList get animationIteration => this['webkitAnimationIteration'];

  /// @docsEditable true
  EventListenerList get animationStart => this['webkitAnimationStart'];

  /// @docsEditable true
  EventListenerList get transitionEnd => this['webkitTransitionEnd'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMapElement
class MapElement extends _Element_Merged {

  ///@docsEditable true
  factory MapElement() => document.$dom_createElement("map");
  MapElement.internal(): super.internal();


  /** @domName HTMLMapElement.areas */
  HtmlCollection get areas native "HTMLMapElement_areas_Getter";


  /** @domName HTMLMapElement.name */
  String get name native "HTMLMapElement_name_Getter";


  /** @domName HTMLMapElement.name */
  void set name(String value) native "HTMLMapElement_name_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMarqueeElement
class MarqueeElement extends _Element_Merged {
  MarqueeElement.internal(): super.internal();


  /** @domName HTMLMarqueeElement.behavior */
  String get behavior native "HTMLMarqueeElement_behavior_Getter";


  /** @domName HTMLMarqueeElement.behavior */
  void set behavior(String value) native "HTMLMarqueeElement_behavior_Setter";


  /** @domName HTMLMarqueeElement.bgColor */
  String get bgColor native "HTMLMarqueeElement_bgColor_Getter";


  /** @domName HTMLMarqueeElement.bgColor */
  void set bgColor(String value) native "HTMLMarqueeElement_bgColor_Setter";


  /** @domName HTMLMarqueeElement.direction */
  String get direction native "HTMLMarqueeElement_direction_Getter";


  /** @domName HTMLMarqueeElement.direction */
  void set direction(String value) native "HTMLMarqueeElement_direction_Setter";


  /** @domName HTMLMarqueeElement.height */
  String get height native "HTMLMarqueeElement_height_Getter";


  /** @domName HTMLMarqueeElement.height */
  void set height(String value) native "HTMLMarqueeElement_height_Setter";


  /** @domName HTMLMarqueeElement.hspace */
  int get hspace native "HTMLMarqueeElement_hspace_Getter";


  /** @domName HTMLMarqueeElement.hspace */
  void set hspace(int value) native "HTMLMarqueeElement_hspace_Setter";


  /** @domName HTMLMarqueeElement.loop */
  int get loop native "HTMLMarqueeElement_loop_Getter";


  /** @domName HTMLMarqueeElement.loop */
  void set loop(int value) native "HTMLMarqueeElement_loop_Setter";


  /** @domName HTMLMarqueeElement.scrollAmount */
  int get scrollAmount native "HTMLMarqueeElement_scrollAmount_Getter";


  /** @domName HTMLMarqueeElement.scrollAmount */
  void set scrollAmount(int value) native "HTMLMarqueeElement_scrollAmount_Setter";


  /** @domName HTMLMarqueeElement.scrollDelay */
  int get scrollDelay native "HTMLMarqueeElement_scrollDelay_Getter";


  /** @domName HTMLMarqueeElement.scrollDelay */
  void set scrollDelay(int value) native "HTMLMarqueeElement_scrollDelay_Setter";


  /** @domName HTMLMarqueeElement.trueSpeed */
  bool get trueSpeed native "HTMLMarqueeElement_trueSpeed_Getter";


  /** @domName HTMLMarqueeElement.trueSpeed */
  void set trueSpeed(bool value) native "HTMLMarqueeElement_trueSpeed_Setter";


  /** @domName HTMLMarqueeElement.vspace */
  int get vspace native "HTMLMarqueeElement_vspace_Getter";


  /** @domName HTMLMarqueeElement.vspace */
  void set vspace(int value) native "HTMLMarqueeElement_vspace_Setter";


  /** @domName HTMLMarqueeElement.width */
  String get width native "HTMLMarqueeElement_width_Getter";


  /** @domName HTMLMarqueeElement.width */
  void set width(String value) native "HTMLMarqueeElement_width_Setter";


  /** @domName HTMLMarqueeElement.start */
  void start() native "HTMLMarqueeElement_start_Callback";


  /** @domName HTMLMarqueeElement.stop */
  void stop() native "HTMLMarqueeElement_stop_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaController
class MediaController extends EventTarget {

  ///@docsEditable true
  factory MediaController() => _MediaControllerFactoryProvider.createMediaController();
  MediaController.internal(): super.internal();


  /** @domName MediaController.buffered */
  TimeRanges get buffered native "MediaController_buffered_Getter";


  /** @domName MediaController.currentTime */
  num get currentTime native "MediaController_currentTime_Getter";


  /** @domName MediaController.currentTime */
  void set currentTime(num value) native "MediaController_currentTime_Setter";


  /** @domName MediaController.defaultPlaybackRate */
  num get defaultPlaybackRate native "MediaController_defaultPlaybackRate_Getter";


  /** @domName MediaController.defaultPlaybackRate */
  void set defaultPlaybackRate(num value) native "MediaController_defaultPlaybackRate_Setter";


  /** @domName MediaController.duration */
  num get duration native "MediaController_duration_Getter";


  /** @domName MediaController.muted */
  bool get muted native "MediaController_muted_Getter";


  /** @domName MediaController.muted */
  void set muted(bool value) native "MediaController_muted_Setter";


  /** @domName MediaController.paused */
  bool get paused native "MediaController_paused_Getter";


  /** @domName MediaController.playbackRate */
  num get playbackRate native "MediaController_playbackRate_Getter";


  /** @domName MediaController.playbackRate */
  void set playbackRate(num value) native "MediaController_playbackRate_Setter";


  /** @domName MediaController.played */
  TimeRanges get played native "MediaController_played_Getter";


  /** @domName MediaController.seekable */
  TimeRanges get seekable native "MediaController_seekable_Getter";


  /** @domName MediaController.volume */
  num get volume native "MediaController_volume_Getter";


  /** @domName MediaController.volume */
  void set volume(num value) native "MediaController_volume_Setter";


  /** @domName MediaController.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_addEventListener_Callback";


  /** @domName MediaController.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "MediaController_dispatchEvent_Callback";


  /** @domName MediaController.pause */
  void pause() native "MediaController_pause_Callback";


  /** @domName MediaController.play */
  void play() native "MediaController_play_Callback";


  /** @domName MediaController.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaController_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMediaElement
class MediaElement extends _Element_Merged {
  MediaElement.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  MediaElementEvents get on =>
    new MediaElementEvents(this);

  static const int HAVE_CURRENT_DATA = 2;

  static const int HAVE_ENOUGH_DATA = 4;

  static const int HAVE_FUTURE_DATA = 3;

  static const int HAVE_METADATA = 1;

  static const int HAVE_NOTHING = 0;

  static const int NETWORK_EMPTY = 0;

  static const int NETWORK_IDLE = 1;

  static const int NETWORK_LOADING = 2;

  static const int NETWORK_NO_SOURCE = 3;


  /** @domName HTMLMediaElement.autoplay */
  bool get autoplay native "HTMLMediaElement_autoplay_Getter";


  /** @domName HTMLMediaElement.autoplay */
  void set autoplay(bool value) native "HTMLMediaElement_autoplay_Setter";


  /** @domName HTMLMediaElement.buffered */
  TimeRanges get buffered native "HTMLMediaElement_buffered_Getter";


  /** @domName HTMLMediaElement.controller */
  MediaController get controller native "HTMLMediaElement_controller_Getter";


  /** @domName HTMLMediaElement.controller */
  void set controller(MediaController value) native "HTMLMediaElement_controller_Setter";


  /** @domName HTMLMediaElement.controls */
  bool get controls native "HTMLMediaElement_controls_Getter";


  /** @domName HTMLMediaElement.controls */
  void set controls(bool value) native "HTMLMediaElement_controls_Setter";


  /** @domName HTMLMediaElement.currentSrc */
  String get currentSrc native "HTMLMediaElement_currentSrc_Getter";


  /** @domName HTMLMediaElement.currentTime */
  num get currentTime native "HTMLMediaElement_currentTime_Getter";


  /** @domName HTMLMediaElement.currentTime */
  void set currentTime(num value) native "HTMLMediaElement_currentTime_Setter";


  /** @domName HTMLMediaElement.defaultMuted */
  bool get defaultMuted native "HTMLMediaElement_defaultMuted_Getter";


  /** @domName HTMLMediaElement.defaultMuted */
  void set defaultMuted(bool value) native "HTMLMediaElement_defaultMuted_Setter";


  /** @domName HTMLMediaElement.defaultPlaybackRate */
  num get defaultPlaybackRate native "HTMLMediaElement_defaultPlaybackRate_Getter";


  /** @domName HTMLMediaElement.defaultPlaybackRate */
  void set defaultPlaybackRate(num value) native "HTMLMediaElement_defaultPlaybackRate_Setter";


  /** @domName HTMLMediaElement.duration */
  num get duration native "HTMLMediaElement_duration_Getter";


  /** @domName HTMLMediaElement.ended */
  bool get ended native "HTMLMediaElement_ended_Getter";


  /** @domName HTMLMediaElement.error */
  MediaError get error native "HTMLMediaElement_error_Getter";


  /** @domName HTMLMediaElement.initialTime */
  num get initialTime native "HTMLMediaElement_initialTime_Getter";


  /** @domName HTMLMediaElement.loop */
  bool get loop native "HTMLMediaElement_loop_Getter";


  /** @domName HTMLMediaElement.loop */
  void set loop(bool value) native "HTMLMediaElement_loop_Setter";


  /** @domName HTMLMediaElement.mediaGroup */
  String get mediaGroup native "HTMLMediaElement_mediaGroup_Getter";


  /** @domName HTMLMediaElement.mediaGroup */
  void set mediaGroup(String value) native "HTMLMediaElement_mediaGroup_Setter";


  /** @domName HTMLMediaElement.muted */
  bool get muted native "HTMLMediaElement_muted_Getter";


  /** @domName HTMLMediaElement.muted */
  void set muted(bool value) native "HTMLMediaElement_muted_Setter";


  /** @domName HTMLMediaElement.networkState */
  int get networkState native "HTMLMediaElement_networkState_Getter";


  /** @domName HTMLMediaElement.paused */
  bool get paused native "HTMLMediaElement_paused_Getter";


  /** @domName HTMLMediaElement.playbackRate */
  num get playbackRate native "HTMLMediaElement_playbackRate_Getter";


  /** @domName HTMLMediaElement.playbackRate */
  void set playbackRate(num value) native "HTMLMediaElement_playbackRate_Setter";


  /** @domName HTMLMediaElement.played */
  TimeRanges get played native "HTMLMediaElement_played_Getter";


  /** @domName HTMLMediaElement.preload */
  String get preload native "HTMLMediaElement_preload_Getter";


  /** @domName HTMLMediaElement.preload */
  void set preload(String value) native "HTMLMediaElement_preload_Setter";


  /** @domName HTMLMediaElement.readyState */
  int get readyState native "HTMLMediaElement_readyState_Getter";


  /** @domName HTMLMediaElement.seekable */
  TimeRanges get seekable native "HTMLMediaElement_seekable_Getter";


  /** @domName HTMLMediaElement.seeking */
  bool get seeking native "HTMLMediaElement_seeking_Getter";


  /** @domName HTMLMediaElement.src */
  String get src native "HTMLMediaElement_src_Getter";


  /** @domName HTMLMediaElement.src */
  void set src(String value) native "HTMLMediaElement_src_Setter";


  /** @domName HTMLMediaElement.startTime */
  num get startTime native "HTMLMediaElement_startTime_Getter";


  /** @domName HTMLMediaElement.textTracks */
  TextTrackList get textTracks native "HTMLMediaElement_textTracks_Getter";


  /** @domName HTMLMediaElement.volume */
  num get volume native "HTMLMediaElement_volume_Getter";


  /** @domName HTMLMediaElement.volume */
  void set volume(num value) native "HTMLMediaElement_volume_Setter";


  /** @domName HTMLMediaElement.webkitAudioDecodedByteCount */
  int get webkitAudioDecodedByteCount native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";


  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
  bool get webkitClosedCaptionsVisible native "HTMLMediaElement_webkitClosedCaptionsVisible_Getter";


  /** @domName HTMLMediaElement.webkitClosedCaptionsVisible */
  void set webkitClosedCaptionsVisible(bool value) native "HTMLMediaElement_webkitClosedCaptionsVisible_Setter";


  /** @domName HTMLMediaElement.webkitHasClosedCaptions */
  bool get webkitHasClosedCaptions native "HTMLMediaElement_webkitHasClosedCaptions_Getter";


  /** @domName HTMLMediaElement.webkitPreservesPitch */
  bool get webkitPreservesPitch native "HTMLMediaElement_webkitPreservesPitch_Getter";


  /** @domName HTMLMediaElement.webkitPreservesPitch */
  void set webkitPreservesPitch(bool value) native "HTMLMediaElement_webkitPreservesPitch_Setter";


  /** @domName HTMLMediaElement.webkitVideoDecodedByteCount */
  int get webkitVideoDecodedByteCount native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";

  TextTrack addTextTrack(/*DOMString*/ kind, [/*DOMString*/ label, /*DOMString*/ language]) {
    if (?language) {
      return _addTextTrack_1(kind, label, language);
    }
    if (?label) {
      return _addTextTrack_2(kind, label);
    }
    return _addTextTrack_3(kind);
  }


  /** @domName HTMLMediaElement.addTextTrack_1 */
  TextTrack _addTextTrack_1(kind, label, language) native "HTMLMediaElement_addTextTrack_1_Callback";


  /** @domName HTMLMediaElement.addTextTrack_2 */
  TextTrack _addTextTrack_2(kind, label) native "HTMLMediaElement_addTextTrack_2_Callback";


  /** @domName HTMLMediaElement.addTextTrack_3 */
  TextTrack _addTextTrack_3(kind) native "HTMLMediaElement_addTextTrack_3_Callback";


  /** @domName HTMLMediaElement.canPlayType */
  String canPlayType(String type, String keySystem) native "HTMLMediaElement_canPlayType_Callback";


  /** @domName HTMLMediaElement.load */
  void load() native "HTMLMediaElement_load_Callback";


  /** @domName HTMLMediaElement.pause */
  void pause() native "HTMLMediaElement_pause_Callback";


  /** @domName HTMLMediaElement.play */
  void play() native "HTMLMediaElement_play_Callback";

  void webkitAddKey(/*DOMString*/ keySystem, /*Uint8Array*/ key, [/*Uint8Array*/ initData, /*DOMString*/ sessionId]) {
    if (?initData) {
      _webkitAddKey_1(keySystem, key, initData, sessionId);
      return;
    }
    _webkitAddKey_2(keySystem, key);
  }


  /** @domName HTMLMediaElement.webkitAddKey_1 */
  void _webkitAddKey_1(keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_1_Callback";


  /** @domName HTMLMediaElement.webkitAddKey_2 */
  void _webkitAddKey_2(keySystem, key) native "HTMLMediaElement_webkitAddKey_2_Callback";


  /** @domName HTMLMediaElement.webkitCancelKeyRequest */
  void webkitCancelKeyRequest(String keySystem, String sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";

  void webkitGenerateKeyRequest(/*DOMString*/ keySystem, [/*Uint8Array*/ initData]) {
    if (?initData) {
      _webkitGenerateKeyRequest_1(keySystem, initData);
      return;
    }
    _webkitGenerateKeyRequest_2(keySystem);
  }


  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_1 */
  void _webkitGenerateKeyRequest_1(keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_1_Callback";


  /** @domName HTMLMediaElement.webkitGenerateKeyRequest_2 */
  void _webkitGenerateKeyRequest_2(keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_2_Callback";

}

/// @docsEditable true
class MediaElementEvents extends ElementEvents {
  /// @docsEditable true
  MediaElementEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get canPlay => this['canplay'];

  /// @docsEditable true
  EventListenerList get canPlayThrough => this['canplaythrough'];

  /// @docsEditable true
  EventListenerList get durationChange => this['durationchange'];

  /// @docsEditable true
  EventListenerList get emptied => this['emptied'];

  /// @docsEditable true
  EventListenerList get ended => this['ended'];

  /// @docsEditable true
  EventListenerList get loadedData => this['loadeddata'];

  /// @docsEditable true
  EventListenerList get loadedMetadata => this['loadedmetadata'];

  /// @docsEditable true
  EventListenerList get loadStart => this['loadstart'];

  /// @docsEditable true
  EventListenerList get pause => this['pause'];

  /// @docsEditable true
  EventListenerList get play => this['play'];

  /// @docsEditable true
  EventListenerList get playing => this['playing'];

  /// @docsEditable true
  EventListenerList get progress => this['progress'];

  /// @docsEditable true
  EventListenerList get rateChange => this['ratechange'];

  /// @docsEditable true
  EventListenerList get seeked => this['seeked'];

  /// @docsEditable true
  EventListenerList get seeking => this['seeking'];

  /// @docsEditable true
  EventListenerList get show => this['show'];

  /// @docsEditable true
  EventListenerList get stalled => this['stalled'];

  /// @docsEditable true
  EventListenerList get suspend => this['suspend'];

  /// @docsEditable true
  EventListenerList get timeUpdate => this['timeupdate'];

  /// @docsEditable true
  EventListenerList get volumeChange => this['volumechange'];

  /// @docsEditable true
  EventListenerList get waiting => this['waiting'];

  /// @docsEditable true
  EventListenerList get keyAdded => this['webkitkeyadded'];

  /// @docsEditable true
  EventListenerList get keyError => this['webkitkeyerror'];

  /// @docsEditable true
  EventListenerList get keyMessage => this['webkitkeymessage'];

  /// @docsEditable true
  EventListenerList get needKey => this['webkitneedkey'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaError
class MediaError extends NativeFieldWrapperClass1 {
  MediaError.internal();

  static const int MEDIA_ERR_ABORTED = 1;

  static const int MEDIA_ERR_DECODE = 3;

  static const int MEDIA_ERR_ENCRYPTED = 5;

  static const int MEDIA_ERR_NETWORK = 2;

  static const int MEDIA_ERR_SRC_NOT_SUPPORTED = 4;


  /** @domName MediaError.code */
  int get code native "MediaError_code_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaKeyError
class MediaKeyError extends NativeFieldWrapperClass1 {
  MediaKeyError.internal();

  static const int MEDIA_KEYERR_CLIENT = 2;

  static const int MEDIA_KEYERR_DOMAIN = 6;

  static const int MEDIA_KEYERR_HARDWARECHANGE = 5;

  static const int MEDIA_KEYERR_OUTPUT = 4;

  static const int MEDIA_KEYERR_SERVICE = 3;

  static const int MEDIA_KEYERR_UNKNOWN = 1;


  /** @domName MediaKeyError.code */
  int get code native "MediaKeyError_code_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaKeyEvent
class MediaKeyEvent extends Event {
  MediaKeyEvent.internal(): super.internal();


  /** @domName MediaKeyEvent.defaultURL */
  String get defaultUrl native "MediaKeyEvent_defaultURL_Getter";


  /** @domName MediaKeyEvent.errorCode */
  MediaKeyError get errorCode native "MediaKeyEvent_errorCode_Getter";


  /** @domName MediaKeyEvent.initData */
  Uint8Array get initData native "MediaKeyEvent_initData_Getter";


  /** @domName MediaKeyEvent.keySystem */
  String get keySystem native "MediaKeyEvent_keySystem_Getter";


  /** @domName MediaKeyEvent.message */
  Uint8Array get message native "MediaKeyEvent_message_Getter";


  /** @domName MediaKeyEvent.sessionId */
  String get sessionId native "MediaKeyEvent_sessionId_Getter";


  /** @domName MediaKeyEvent.systemCode */
  int get systemCode native "MediaKeyEvent_systemCode_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaList
class MediaList extends NativeFieldWrapperClass1 {
  MediaList.internal();


  /** @domName MediaList.length */
  int get length native "MediaList_length_Getter";


  /** @domName MediaList.mediaText */
  String get mediaText native "MediaList_mediaText_Getter";


  /** @domName MediaList.mediaText */
  void set mediaText(String value) native "MediaList_mediaText_Setter";


  /** @domName MediaList.appendMedium */
  void appendMedium(String newMedium) native "MediaList_appendMedium_Callback";


  /** @domName MediaList.deleteMedium */
  void deleteMedium(String oldMedium) native "MediaList_deleteMedium_Callback";


  /** @domName MediaList.item */
  String item(int index) native "MediaList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaQueryList
class MediaQueryList extends NativeFieldWrapperClass1 {
  MediaQueryList.internal();


  /** @domName MediaQueryList.matches */
  bool get matches native "MediaQueryList_matches_Getter";


  /** @domName MediaQueryList.media */
  String get media native "MediaQueryList_media_Getter";


  /** @domName MediaQueryList.addListener */
  void addListener(MediaQueryListListener listener) native "MediaQueryList_addListener_Callback";


  /** @domName MediaQueryList.removeListener */
  void removeListener(MediaQueryListListener listener) native "MediaQueryList_removeListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaQueryListListener
class MediaQueryListListener extends NativeFieldWrapperClass1 {
  MediaQueryListListener.internal();


  /** @domName MediaQueryListListener.queryChanged */
  void queryChanged(MediaQueryList list) native "MediaQueryListListener_queryChanged_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaSource
class MediaSource extends EventTarget {

  ///@docsEditable true
  factory MediaSource() => _MediaSourceFactoryProvider.createMediaSource();
  MediaSource.internal(): super.internal();


  /** @domName MediaSource.activeSourceBuffers */
  SourceBufferList get activeSourceBuffers native "MediaSource_activeSourceBuffers_Getter";


  /** @domName MediaSource.duration */
  num get duration native "MediaSource_duration_Getter";


  /** @domName MediaSource.duration */
  void set duration(num value) native "MediaSource_duration_Setter";


  /** @domName MediaSource.readyState */
  String get readyState native "MediaSource_readyState_Getter";


  /** @domName MediaSource.sourceBuffers */
  SourceBufferList get sourceBuffers native "MediaSource_sourceBuffers_Getter";


  /** @domName MediaSource.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_addEventListener_Callback";


  /** @domName MediaSource.addSourceBuffer */
  SourceBuffer addSourceBuffer(String type) native "MediaSource_addSourceBuffer_Callback";


  /** @domName MediaSource.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaSource_dispatchEvent_Callback";


  /** @domName MediaSource.endOfStream */
  void endOfStream(String error) native "MediaSource_endOfStream_Callback";


  /** @domName MediaSource.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaSource_removeEventListener_Callback";


  /** @domName MediaSource.removeSourceBuffer */
  void removeSourceBuffer(SourceBuffer buffer) native "MediaSource_removeSourceBuffer_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStream
class MediaStream extends EventTarget {

  ///@docsEditable true
  factory MediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) => _MediaStreamFactoryProvider.createMediaStream(audioTracks, videoTracks);
  MediaStream.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  MediaStreamEvents get on =>
    new MediaStreamEvents(this);

  static const int ENDED = 2;

  static const int LIVE = 1;


  /** @domName MediaStream.audioTracks */
  MediaStreamTrackList get audioTracks native "MediaStream_audioTracks_Getter";


  /** @domName MediaStream.label */
  String get label native "MediaStream_label_Getter";


  /** @domName MediaStream.readyState */
  int get readyState native "MediaStream_readyState_Getter";


  /** @domName MediaStream.videoTracks */
  MediaStreamTrackList get videoTracks native "MediaStream_videoTracks_Getter";


  /** @domName MediaStream.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_addEventListener_Callback";


  /** @domName MediaStream.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStream_dispatchEvent_Callback";


  /** @domName MediaStream.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStream_removeEventListener_Callback";

}

/// @docsEditable true
class MediaStreamEvents extends Events {
  /// @docsEditable true
  MediaStreamEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get ended => this['ended'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStreamEvent
class MediaStreamEvent extends Event {
  MediaStreamEvent.internal(): super.internal();


  /** @domName MediaStreamEvent.stream */
  MediaStream get stream native "MediaStreamEvent_stream_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStreamTrack
class MediaStreamTrack extends EventTarget {
  MediaStreamTrack.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  MediaStreamTrackEvents get on =>
    new MediaStreamTrackEvents(this);

  static const int ENDED = 2;

  static const int LIVE = 0;

  static const int MUTED = 1;


  /** @domName MediaStreamTrack.enabled */
  bool get enabled native "MediaStreamTrack_enabled_Getter";


  /** @domName MediaStreamTrack.enabled */
  void set enabled(bool value) native "MediaStreamTrack_enabled_Setter";


  /** @domName MediaStreamTrack.kind */
  String get kind native "MediaStreamTrack_kind_Getter";


  /** @domName MediaStreamTrack.label */
  String get label native "MediaStreamTrack_label_Getter";


  /** @domName MediaStreamTrack.readyState */
  int get readyState native "MediaStreamTrack_readyState_Getter";


  /** @domName MediaStreamTrack.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_addEventListener_Callback";


  /** @domName MediaStreamTrack.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStreamTrack_dispatchEvent_Callback";


  /** @domName MediaStreamTrack.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrack_removeEventListener_Callback";

}

/// @docsEditable true
class MediaStreamTrackEvents extends Events {
  /// @docsEditable true
  MediaStreamTrackEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get ended => this['ended'];

  /// @docsEditable true
  EventListenerList get mute => this['mute'];

  /// @docsEditable true
  EventListenerList get unmute => this['unmute'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStreamTrackEvent
class MediaStreamTrackEvent extends Event {
  MediaStreamTrackEvent.internal(): super.internal();


  /** @domName MediaStreamTrackEvent.track */
  MediaStreamTrack get track native "MediaStreamTrackEvent_track_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStreamTrackList
class MediaStreamTrackList extends EventTarget {
  MediaStreamTrackList.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  MediaStreamTrackListEvents get on =>
    new MediaStreamTrackListEvents(this);


  /** @domName MediaStreamTrackList.length */
  int get length native "MediaStreamTrackList_length_Getter";


  /** @domName MediaStreamTrackList.add */
  void add(MediaStreamTrack track) native "MediaStreamTrackList_add_Callback";


  /** @domName MediaStreamTrackList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_addEventListener_Callback";


  /** @domName MediaStreamTrackList.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "MediaStreamTrackList_dispatchEvent_Callback";


  /** @domName MediaStreamTrackList.item */
  MediaStreamTrack item(int index) native "MediaStreamTrackList_item_Callback";


  /** @domName MediaStreamTrackList.remove */
  void remove(MediaStreamTrack track) native "MediaStreamTrackList_remove_Callback";


  /** @domName MediaStreamTrackList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MediaStreamTrackList_removeEventListener_Callback";

}

/// @docsEditable true
class MediaStreamTrackListEvents extends Events {
  /// @docsEditable true
  MediaStreamTrackListEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get addTrack => this['addtrack'];

  /// @docsEditable true
  EventListenerList get removeTrack => this['removetrack'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MemoryInfo
class MemoryInfo extends NativeFieldWrapperClass1 {
  MemoryInfo.internal();


  /** @domName MemoryInfo.jsHeapSizeLimit */
  int get jsHeapSizeLimit native "MemoryInfo_jsHeapSizeLimit_Getter";


  /** @domName MemoryInfo.totalJSHeapSize */
  int get totalJSHeapSize native "MemoryInfo_totalJSHeapSize_Getter";


  /** @domName MemoryInfo.usedJSHeapSize */
  int get usedJSHeapSize native "MemoryInfo_usedJSHeapSize_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMenuElement
class MenuElement extends _Element_Merged {

  ///@docsEditable true
  factory MenuElement() => document.$dom_createElement("menu");
  MenuElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MessageChannel
class MessageChannel extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory MessageChannel() => _MessageChannelFactoryProvider.createMessageChannel();
  MessageChannel.internal();


  /** @domName MessageChannel.port1 */
  MessagePort get port1 native "MessageChannel_port1_Getter";


  /** @domName MessageChannel.port2 */
  MessagePort get port2 native "MessageChannel_port2_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MessageEvent
class MessageEvent extends Event {
  MessageEvent.internal(): super.internal();


  /** @domName MessageEvent.data */
  Object get data native "MessageEvent_data_Getter";


  /** @domName MessageEvent.lastEventId */
  String get lastEventId native "MessageEvent_lastEventId_Getter";


  /** @domName MessageEvent.origin */
  String get origin native "MessageEvent_origin_Getter";


  /** @domName MessageEvent.ports */
  List get ports native "MessageEvent_ports_Getter";


  /** @domName MessageEvent.source */
  Window get source native "MessageEvent_source_Getter";


  /** @domName MessageEvent.initMessageEvent */
  void initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List messagePorts) native "MessageEvent_initMessageEvent_Callback";


  /** @domName MessageEvent.webkitInitMessageEvent */
  void webkitInitMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, LocalWindow sourceArg, List transferables) native "MessageEvent_webkitInitMessageEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MessagePort
class MessagePort extends EventTarget {
  MessagePort.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  MessagePortEvents get on =>
    new MessagePortEvents(this);


  /** @domName MessagePort.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_addEventListener_Callback";


  /** @domName MessagePort.close */
  void close() native "MessagePort_close_Callback";


  /** @domName MessagePort.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "MessagePort_dispatchEvent_Callback";


  /** @domName MessagePort.postMessage */
  void postMessage(Object message, [List messagePorts]) native "MessagePort_postMessage_Callback";


  /** @domName MessagePort.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "MessagePort_removeEventListener_Callback";


  /** @domName MessagePort.start */
  void start() native "MessagePort_start_Callback";

}

/// @docsEditable true
class MessagePortEvents extends Events {
  /// @docsEditable true
  MessagePortEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMetaElement
class MetaElement extends _Element_Merged {
  MetaElement.internal(): super.internal();


  /** @domName HTMLMetaElement.content */
  String get content native "HTMLMetaElement_content_Getter";


  /** @domName HTMLMetaElement.content */
  void set content(String value) native "HTMLMetaElement_content_Setter";


  /** @domName HTMLMetaElement.httpEquiv */
  String get httpEquiv native "HTMLMetaElement_httpEquiv_Getter";


  /** @domName HTMLMetaElement.httpEquiv */
  void set httpEquiv(String value) native "HTMLMetaElement_httpEquiv_Setter";


  /** @domName HTMLMetaElement.name */
  String get name native "HTMLMetaElement_name_Getter";


  /** @domName HTMLMetaElement.name */
  void set name(String value) native "HTMLMetaElement_name_Setter";


  /** @domName HTMLMetaElement.scheme */
  String get scheme native "HTMLMetaElement_scheme_Getter";


  /** @domName HTMLMetaElement.scheme */
  void set scheme(String value) native "HTMLMetaElement_scheme_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Metadata
class Metadata extends NativeFieldWrapperClass1 {
  Metadata.internal();


  /** @domName Metadata.modificationTime */
  Date get modificationTime native "Metadata_modificationTime_Getter";


  /** @domName Metadata.size */
  int get size native "Metadata_size_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void MetadataCallback(Metadata metadata);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLMeterElement
class MeterElement extends _Element_Merged {

  ///@docsEditable true
  factory MeterElement() => document.$dom_createElement("meter");
  MeterElement.internal(): super.internal();


  /** @domName HTMLMeterElement.high */
  num get high native "HTMLMeterElement_high_Getter";


  /** @domName HTMLMeterElement.high */
  void set high(num value) native "HTMLMeterElement_high_Setter";


  /** @domName HTMLMeterElement.labels */
  List<Node> get labels native "HTMLMeterElement_labels_Getter";


  /** @domName HTMLMeterElement.low */
  num get low native "HTMLMeterElement_low_Getter";


  /** @domName HTMLMeterElement.low */
  void set low(num value) native "HTMLMeterElement_low_Setter";


  /** @domName HTMLMeterElement.max */
  num get max native "HTMLMeterElement_max_Getter";


  /** @domName HTMLMeterElement.max */
  void set max(num value) native "HTMLMeterElement_max_Setter";


  /** @domName HTMLMeterElement.min */
  num get min native "HTMLMeterElement_min_Getter";


  /** @domName HTMLMeterElement.min */
  void set min(num value) native "HTMLMeterElement_min_Setter";


  /** @domName HTMLMeterElement.optimum */
  num get optimum native "HTMLMeterElement_optimum_Getter";


  /** @domName HTMLMeterElement.optimum */
  void set optimum(num value) native "HTMLMeterElement_optimum_Setter";


  /** @domName HTMLMeterElement.value */
  num get value native "HTMLMeterElement_value_Getter";


  /** @domName HTMLMeterElement.value */
  void set value(num value) native "HTMLMeterElement_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLModElement
class ModElement extends _Element_Merged {
  ModElement.internal(): super.internal();


  /** @domName HTMLModElement.cite */
  String get cite native "HTMLModElement_cite_Getter";


  /** @domName HTMLModElement.cite */
  void set cite(String value) native "HTMLModElement_cite_Setter";


  /** @domName HTMLModElement.dateTime */
  String get dateTime native "HTMLModElement_dateTime_Getter";


  /** @domName HTMLModElement.dateTime */
  void set dateTime(String value) native "HTMLModElement_dateTime_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MouseEvent
class MouseEvent extends UIEvent {
  factory MouseEvent(String type, Window view, int detail, int screenX,
      int screenY, int clientX, int clientY, int button, [bool canBubble = true,
      bool cancelable = true, bool ctrlKey = false, bool altKey = false,
      bool shiftKey = false, bool metaKey = false,
      EventTarget relatedTarget = null]) =>
      _MouseEventFactoryProvider.createMouseEvent(
          type, view, detail, screenX, screenY,
          clientX, clientY, button, canBubble, cancelable,
          ctrlKey, altKey, shiftKey, metaKey,
          relatedTarget);
  MouseEvent.internal(): super.internal();


  /** @domName MouseEvent.altKey */
  bool get altKey native "MouseEvent_altKey_Getter";


  /** @domName MouseEvent.button */
  int get button native "MouseEvent_button_Getter";


  /** @domName MouseEvent.clientX */
  int get clientX native "MouseEvent_clientX_Getter";


  /** @domName MouseEvent.clientY */
  int get clientY native "MouseEvent_clientY_Getter";


  /** @domName MouseEvent.ctrlKey */
  bool get ctrlKey native "MouseEvent_ctrlKey_Getter";


  /** @domName MouseEvent.dataTransfer */
  Clipboard get dataTransfer native "MouseEvent_dataTransfer_Getter";


  /** @domName MouseEvent.fromElement */
  Node get fromElement native "MouseEvent_fromElement_Getter";


  /** @domName MouseEvent.metaKey */
  bool get metaKey native "MouseEvent_metaKey_Getter";


  /** @domName MouseEvent.offsetX */
  int get offsetX native "MouseEvent_offsetX_Getter";


  /** @domName MouseEvent.offsetY */
  int get offsetY native "MouseEvent_offsetY_Getter";


  /** @domName MouseEvent.relatedTarget */
  EventTarget get relatedTarget native "MouseEvent_relatedTarget_Getter";


  /** @domName MouseEvent.screenX */
  int get screenX native "MouseEvent_screenX_Getter";


  /** @domName MouseEvent.screenY */
  int get screenY native "MouseEvent_screenY_Getter";


  /** @domName MouseEvent.shiftKey */
  bool get shiftKey native "MouseEvent_shiftKey_Getter";


  /** @domName MouseEvent.toElement */
  Node get toElement native "MouseEvent_toElement_Getter";


  /** @domName MouseEvent.webkitMovementX */
  int get webkitMovementX native "MouseEvent_webkitMovementX_Getter";


  /** @domName MouseEvent.webkitMovementY */
  int get webkitMovementY native "MouseEvent_webkitMovementY_Getter";


  /** @domName MouseEvent.x */
  int get x native "MouseEvent_x_Getter";


  /** @domName MouseEvent.y */
  int get y native "MouseEvent_y_Getter";


  /** @domName MouseEvent.initMouseEvent */
  void $dom_initMouseEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) native "MouseEvent_initMouseEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void MutationCallback(List<MutationRecord> mutations, MutationObserver observer);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MutationEvent
class MutationEvent extends Event {
  MutationEvent.internal(): super.internal();

  static const int ADDITION = 2;

  static const int MODIFICATION = 1;

  static const int REMOVAL = 3;


  /** @domName MutationEvent.attrChange */
  int get attrChange native "MutationEvent_attrChange_Getter";


  /** @domName MutationEvent.attrName */
  String get attrName native "MutationEvent_attrName_Getter";


  /** @domName MutationEvent.newValue */
  String get newValue native "MutationEvent_newValue_Getter";


  /** @domName MutationEvent.prevValue */
  String get prevValue native "MutationEvent_prevValue_Getter";


  /** @domName MutationEvent.relatedNode */
  Node get relatedNode native "MutationEvent_relatedNode_Getter";


  /** @domName MutationEvent.initMutationEvent */
  void initMutationEvent(String type, bool canBubble, bool cancelable, Node relatedNode, String prevValue, String newValue, String attrName, int attrChange) native "MutationEvent_initMutationEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName MutationObserver
class MutationObserver extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory MutationObserver(MutationCallback callback) => _MutationObserverFactoryProvider.createMutationObserver(callback);
  MutationObserver.internal();


  /** @domName MutationObserver.disconnect */
  void disconnect() native "MutationObserver_disconnect_Callback";


  /** @domName MutationObserver._observe */
  void _observe(Node target, Map options) native "MutationObserver__observe_Callback";


  /** @domName MutationObserver.takeRecords */
  List<MutationRecord> takeRecords() native "MutationObserver_takeRecords_Callback";

  void observe(Node target,
               {Map options,
                bool childList,
                bool attributes,
                bool characterData,
                bool subtree,
                bool attributeOldValue,
                bool characterDataOldValue,
                List<String> attributeFilter}) {

    // Parse options into map of known type.
    var parsedOptions = _createDict();

    if (options != null) {
      options.forEach((k, v) {
          if (_boolKeys.containsKey(k)) {
            _add(parsedOptions, k, true == v);
          } else if (k == 'attributeFilter') {
            _add(parsedOptions, k, _fixupList(v));
          } else {
            throw new ArgumentError(
                "Illegal MutationObserver.observe option '$k'");
          }
        });
    }

    // Override options passed in the map with named optional arguments.
    override(key, value) {
      if (value != null) _add(parsedOptions, key, value);
    }

    override('childList', childList);
    override('attributes', attributes);
    override('characterData', characterData);
    override('subtree', subtree);
    override('attributeOldValue', attributeOldValue);
    override('characterDataOldValue', characterDataOldValue);
    if (attributeFilter != null) {
      override('attributeFilter', _fixupList(attributeFilter));
    }

    _call(target, parsedOptions);
  }

   // TODO: Change to a set when const Sets are available.
  static final _boolKeys =
    const {'childList': true,
           'attributes': true,
           'characterData': true,
           'subtree': true,
           'attributeOldValue': true,
           'characterDataOldValue': true };

  static _createDict() => {};
  static _add(m, String key, value) { m[key] = value; }
  static _fixupList(list) => list;

  void _call(Node target, options) {
    _observe(target, options);
  }

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MutationRecord
class MutationRecord extends NativeFieldWrapperClass1 {
  MutationRecord.internal();


  /** @domName MutationRecord.addedNodes */
  List<Node> get addedNodes native "MutationRecord_addedNodes_Getter";


  /** @domName MutationRecord.attributeName */
  String get attributeName native "MutationRecord_attributeName_Getter";


  /** @domName MutationRecord.attributeNamespace */
  String get attributeNamespace native "MutationRecord_attributeNamespace_Getter";


  /** @domName MutationRecord.nextSibling */
  Node get nextSibling native "MutationRecord_nextSibling_Getter";


  /** @domName MutationRecord.oldValue */
  String get oldValue native "MutationRecord_oldValue_Getter";


  /** @domName MutationRecord.previousSibling */
  Node get previousSibling native "MutationRecord_previousSibling_Getter";


  /** @domName MutationRecord.removedNodes */
  List<Node> get removedNodes native "MutationRecord_removedNodes_Getter";


  /** @domName MutationRecord.target */
  Node get target native "MutationRecord_target_Getter";


  /** @domName MutationRecord.type */
  String get type native "MutationRecord_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NamedNodeMap
class NamedNodeMap extends NativeFieldWrapperClass1 implements List<Node> {
  NamedNodeMap.internal();


  /** @domName NamedNodeMap.length */
  int get length native "NamedNodeMap_length_Getter";

  Node operator[](int index) native "NamedNodeMap_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => Collections.contains(this, element);

  void forEach(void f(Node element)) => Collections.forEach(this, f);

  Collection map(f(Node element)) => Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => Collections.every(this, f);

  bool some(bool f(Node element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first => this[0];

  Node get last => this[length - 1];

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName NamedNodeMap.getNamedItem */
  Node getNamedItem(String name) native "NamedNodeMap_getNamedItem_Callback";


  /** @domName NamedNodeMap.getNamedItemNS */
  Node getNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_getNamedItemNS_Callback";


  /** @domName NamedNodeMap.item */
  Node item(int index) native "NamedNodeMap_item_Callback";


  /** @domName NamedNodeMap.removeNamedItem */
  Node removeNamedItem(String name) native "NamedNodeMap_removeNamedItem_Callback";


  /** @domName NamedNodeMap.removeNamedItemNS */
  Node removeNamedItemNS(String namespaceURI, String localName) native "NamedNodeMap_removeNamedItemNS_Callback";


  /** @domName NamedNodeMap.setNamedItem */
  Node setNamedItem(Node node) native "NamedNodeMap_setNamedItem_Callback";


  /** @domName NamedNodeMap.setNamedItemNS */
  Node setNamedItemNS(Node node) native "NamedNodeMap_setNamedItemNS_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Navigator
class Navigator extends NativeFieldWrapperClass1 {
  Navigator.internal();


  /** @domName Navigator.appCodeName */
  String get appCodeName native "Navigator_appCodeName_Getter";


  /** @domName Navigator.appName */
  String get appName native "Navigator_appName_Getter";


  /** @domName Navigator.appVersion */
  String get appVersion native "Navigator_appVersion_Getter";


  /** @domName Navigator.cookieEnabled */
  bool get cookieEnabled native "Navigator_cookieEnabled_Getter";


  /** @domName Navigator.geolocation */
  Geolocation get geolocation native "Navigator_geolocation_Getter";


  /** @domName Navigator.language */
  String get language native "Navigator_language_Getter";


  /** @domName Navigator.mimeTypes */
  DomMimeTypeArray get mimeTypes native "Navigator_mimeTypes_Getter";


  /** @domName Navigator.onLine */
  bool get onLine native "Navigator_onLine_Getter";


  /** @domName Navigator.platform */
  String get platform native "Navigator_platform_Getter";


  /** @domName Navigator.plugins */
  DomPluginArray get plugins native "Navigator_plugins_Getter";


  /** @domName Navigator.product */
  String get product native "Navigator_product_Getter";


  /** @domName Navigator.productSub */
  String get productSub native "Navigator_productSub_Getter";


  /** @domName Navigator.userAgent */
  String get userAgent native "Navigator_userAgent_Getter";


  /** @domName Navigator.vendor */
  String get vendor native "Navigator_vendor_Getter";


  /** @domName Navigator.vendorSub */
  String get vendorSub native "Navigator_vendorSub_Getter";


  /** @domName Navigator.webkitBattery */
  BatteryManager get webkitBattery native "Navigator_webkitBattery_Getter";


  /** @domName Navigator.getStorageUpdates */
  void getStorageUpdates() native "Navigator_getStorageUpdates_Callback";


  /** @domName Navigator.javaEnabled */
  bool javaEnabled() native "Navigator_javaEnabled_Callback";


  /** @domName Navigator.webkitGetGamepads */
  List<Gamepad> webkitGetGamepads() native "Navigator_webkitGetGamepads_Callback";


  /** @domName Navigator.webkitGetUserMedia */
  void webkitGetUserMedia(Map options, NavigatorUserMediaSuccessCallback successCallback, [NavigatorUserMediaErrorCallback errorCallback]) native "Navigator_webkitGetUserMedia_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NavigatorUserMediaError
class NavigatorUserMediaError extends NativeFieldWrapperClass1 {
  NavigatorUserMediaError.internal();

  static const int PERMISSION_DENIED = 1;


  /** @domName NavigatorUserMediaError.code */
  int get code native "NavigatorUserMediaError_code_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void NavigatorUserMediaErrorCallback(NavigatorUserMediaError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void NavigatorUserMediaSuccessCallback(LocalMediaStream stream);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Lazy implementation of the child nodes of an element that does not request
 * the actual child nodes of an element until strictly necessary greatly
 * improving performance for the typical cases where it is not required.
 */
class _ChildNodeListLazy implements List {
  final Node _this;

  _ChildNodeListLazy(this._this);


  Node get first => _this.$dom_firstChild;
  Node get last => _this.$dom_lastChild;

  void add(Node value) {
    _this.$dom_appendChild(value);
  }

  void addLast(Node value) {
    _this.$dom_appendChild(value);
  }


  void addAll(Collection<Node> collection) {
    for (Node node in collection) {
      _this.$dom_appendChild(node);
    }
  }

  Node removeLast() {
    final result = last;
    if (result != null) {
      _this.$dom_removeChild(result);
    }
    return result;
  }

  Node removeAt(int index) {
    var result = this[index];
    if (result != null) {
      _this.$dom_removeChild(result);
    }
    return result;
  }

  void clear() {
    _this.text = '';
  }

  void operator []=(int index, Node value) {
    _this.$dom_replaceChild(value, this[index]);
  }

  Iterator<Node> iterator() => _this.$dom_childNodes.iterator();

  // TODO(jacobr): We can implement these methods much more efficiently by
  // looking up the nodeList only once instead of once per iteration.
  bool contains(Node element) => Collections.contains(this, element);

  void forEach(void f(Node element)) => Collections.forEach(this, f);

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, Node element)) {
    return Collections.reduce(this, initialValue, combine);
  }

  Collection map(f(Node element)) => Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => Collections.every(this, f);

  bool some(bool f(Node element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:

  // TODO(jacobr): this could be implemented for child node lists.
  // The exception we throw here is misleading.
  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start = 0]) =>
      Lists.lastIndexOf(this, element, start);

  // FIXME: implement these.
  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError(
        "Cannot setRange on immutable List.");
  }
  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError(
        "Cannot removeRange on immutable List.");
  }
  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError(
        "Cannot insertRange on immutable List.");
  }
  List<Node> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.

  // TODO(jacobr): benchmark whether this is more efficient or whether caching
  // a local copy of $dom_childNodes is more efficient.
  int get length => _this.$dom_childNodes.length;

  void set length(int value) {
    throw new UnsupportedError(
        "Cannot set length on immutable List.");
  }

  Node operator[](int index) => _this.$dom_childNodes[index];
}

/// @domName Node
class Node extends EventTarget {
  List<Node> get nodes {
    return new _ChildNodeListLazy(this);
  }

  void set nodes(Collection<Node> value) {
    // Copy list first since we don't want liveness during iteration.
    // TODO(jacobr): there is a better way to do this.
    List copy = new List.from(value);
    text = '';
    for (Node node in copy) {
      $dom_appendChild(node);
    }
  }

  /**
   * Removes this node from the DOM.
   * @domName Node.removeChild
   */
  void remove() {
    // TODO(jacobr): should we throw an exception if parent is already null?
    // TODO(vsm): Use the native remove when available.
    if (this.parentNode != null) {
      final Node parent = this.parentNode;
      parentNode.$dom_removeChild(this);
    }
  }

  /**
   * Replaces this node with another node.
   * @domName Node.replaceChild
   */
  Node replaceWith(Node otherNode) {
    try {
      final Node parent = this.parentNode;
      parent.$dom_replaceChild(otherNode, this);
    } catch (e) {

    };
    return this;
  }

  Node.internal(): super.internal();

  static const int ATTRIBUTE_NODE = 2;

  static const int CDATA_SECTION_NODE = 4;

  static const int COMMENT_NODE = 8;

  static const int DOCUMENT_FRAGMENT_NODE = 11;

  static const int DOCUMENT_NODE = 9;

  static const int DOCUMENT_POSITION_CONTAINED_BY = 0x10;

  static const int DOCUMENT_POSITION_CONTAINS = 0x08;

  static const int DOCUMENT_POSITION_DISCONNECTED = 0x01;

  static const int DOCUMENT_POSITION_FOLLOWING = 0x04;

  static const int DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;

  static const int DOCUMENT_POSITION_PRECEDING = 0x02;

  static const int DOCUMENT_TYPE_NODE = 10;

  static const int ELEMENT_NODE = 1;

  static const int ENTITY_NODE = 6;

  static const int ENTITY_REFERENCE_NODE = 5;

  static const int NOTATION_NODE = 12;

  static const int PROCESSING_INSTRUCTION_NODE = 7;

  static const int TEXT_NODE = 3;


  /** @domName Node.attributes */
  NamedNodeMap get $dom_attributes native "Node_attributes_Getter";


  /** @domName Node.childNodes */
  List<Node> get $dom_childNodes native "Node_childNodes_Getter";


  /** @domName Node.firstChild */
  Node get $dom_firstChild native "Node_firstChild_Getter";


  /** @domName Node.lastChild */
  Node get $dom_lastChild native "Node_lastChild_Getter";


  /** @domName Node.localName */
  String get $dom_localName native "Node_localName_Getter";


  /** @domName Node.namespaceURI */
  String get $dom_namespaceUri native "Node_namespaceURI_Getter";


  /** @domName Node.nextSibling */
  Node get nextNode native "Node_nextSibling_Getter";


  /** @domName Node.nodeType */
  int get nodeType native "Node_nodeType_Getter";


  /** @domName Node.ownerDocument */
  Document get document native "Node_ownerDocument_Getter";


  /** @domName Node.parentElement */
  Element get parent native "Node_parentElement_Getter";


  /** @domName Node.parentNode */
  Node get parentNode native "Node_parentNode_Getter";


  /** @domName Node.previousSibling */
  Node get previousNode native "Node_previousSibling_Getter";


  /** @domName Node.textContent */
  String get text native "Node_textContent_Getter";


  /** @domName Node.textContent */
  void set text(String value) native "Node_textContent_Setter";


  /** @domName Node.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Node_addEventListener_Callback";


  /** @domName Node.appendChild */
  Node $dom_appendChild(Node newChild) native "Node_appendChild_Callback";


  /** @domName Node.cloneNode */
  Node clone(bool deep) native "Node_cloneNode_Callback";


  /** @domName Node.contains */
  bool contains(Node other) native "Node_contains_Callback";


  /** @domName Node.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "Node_dispatchEvent_Callback";


  /** @domName Node.hasChildNodes */
  bool hasChildNodes() native "Node_hasChildNodes_Callback";


  /** @domName Node.insertBefore */
  Node insertBefore(Node newChild, Node refChild) native "Node_insertBefore_Callback";


  /** @domName Node.removeChild */
  Node $dom_removeChild(Node oldChild) native "Node_removeChild_Callback";


  /** @domName Node.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Node_removeEventListener_Callback";


  /** @domName Node.replaceChild */
  Node $dom_replaceChild(Node newChild, Node oldChild) native "Node_replaceChild_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NodeFilter
class NodeFilter extends NativeFieldWrapperClass1 {
  NodeFilter.internal();

  static const int FILTER_ACCEPT = 1;

  static const int FILTER_REJECT = 2;

  static const int FILTER_SKIP = 3;

  static const int SHOW_ALL = 0xFFFFFFFF;

  static const int SHOW_ATTRIBUTE = 0x00000002;

  static const int SHOW_CDATA_SECTION = 0x00000008;

  static const int SHOW_COMMENT = 0x00000080;

  static const int SHOW_DOCUMENT = 0x00000100;

  static const int SHOW_DOCUMENT_FRAGMENT = 0x00000400;

  static const int SHOW_DOCUMENT_TYPE = 0x00000200;

  static const int SHOW_ELEMENT = 0x00000001;

  static const int SHOW_ENTITY = 0x00000020;

  static const int SHOW_ENTITY_REFERENCE = 0x00000010;

  static const int SHOW_NOTATION = 0x00000800;

  static const int SHOW_PROCESSING_INSTRUCTION = 0x00000040;

  static const int SHOW_TEXT = 0x00000004;


  /** @domName NodeFilter.acceptNode */
  int acceptNode(Node n) native "NodeFilter_acceptNode_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NodeIterator
class NodeIterator extends NativeFieldWrapperClass1 {
  NodeIterator.internal();


  /** @domName NodeIterator.expandEntityReferences */
  bool get expandEntityReferences native "NodeIterator_expandEntityReferences_Getter";


  /** @domName NodeIterator.filter */
  NodeFilter get filter native "NodeIterator_filter_Getter";


  /** @domName NodeIterator.pointerBeforeReferenceNode */
  bool get pointerBeforeReferenceNode native "NodeIterator_pointerBeforeReferenceNode_Getter";


  /** @domName NodeIterator.referenceNode */
  Node get referenceNode native "NodeIterator_referenceNode_Getter";


  /** @domName NodeIterator.root */
  Node get root native "NodeIterator_root_Getter";


  /** @domName NodeIterator.whatToShow */
  int get whatToShow native "NodeIterator_whatToShow_Getter";


  /** @domName NodeIterator.detach */
  void detach() native "NodeIterator_detach_Callback";


  /** @domName NodeIterator.nextNode */
  Node nextNode() native "NodeIterator_nextNode_Callback";


  /** @domName NodeIterator.previousNode */
  Node previousNode() native "NodeIterator_previousNode_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NodeList
class NodeList extends NativeFieldWrapperClass1 implements List<Node> {
  NodeList.internal();


  /** @domName NodeList.length */
  int get length native "NodeList_length_Getter";

  Node operator[](int index) native "NodeList_item_Callback";

  void operator[]=(int index, Node value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Node> mixins.
  // Node is the element type.

  // From Iterable<Node>:

  Iterator<Node> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Node>(this);
  }

  // From Collection<Node>:

  void add(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Node value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Node> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Node)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Node element) => Collections.contains(this, element);

  void forEach(void f(Node element)) => Collections.forEach(this, f);

  Collection map(f(Node element)) => Collections.map(this, [], f);

  Collection<Node> filter(bool f(Node element)) =>
     Collections.filter(this, <Node>[], f);

  bool every(bool f(Node element)) => Collections.every(this, f);

  bool some(bool f(Node element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Node>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Node a, Node b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Node element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Node element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Node get first => this[0];

  Node get last => this[length - 1];

  Node removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Node removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Node> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Node initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Node> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Node>[]);

  // -- end List<Node> mixins.


  /** @domName NodeList.item */
  Node _item(int index) native "NodeList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Notation
class Notation extends Node {
  Notation.internal(): super.internal();


  /** @domName Notation.publicId */
  String get publicId native "Notation_publicId_Getter";


  /** @domName Notation.systemId */
  String get systemId native "Notation_systemId_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Notification
class Notification extends EventTarget {

  ///@docsEditable true
  factory Notification(String title, [Map options]) {
    if (!?options) {
      return _NotificationFactoryProvider.createNotification(title);
    }
    return _NotificationFactoryProvider.createNotification(title, options);
  }
  Notification.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  NotificationEvents get on =>
    new NotificationEvents(this);


  /** @domName Notification.dir */
  String get dir native "Notification_dir_Getter";


  /** @domName Notification.dir */
  void set dir(String value) native "Notification_dir_Setter";


  /** @domName Notification.permission */
  String get permission native "Notification_permission_Getter";


  /** @domName Notification.replaceId */
  String get replaceId native "Notification_replaceId_Getter";


  /** @domName Notification.replaceId */
  void set replaceId(String value) native "Notification_replaceId_Setter";


  /** @domName Notification.tag */
  String get tag native "Notification_tag_Getter";


  /** @domName Notification.tag */
  void set tag(String value) native "Notification_tag_Setter";


  /** @domName Notification.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_addEventListener_Callback";


  /** @domName Notification.cancel */
  void cancel() native "Notification_cancel_Callback";


  /** @domName Notification.close */
  void close() native "Notification_close_Callback";


  /** @domName Notification.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "Notification_dispatchEvent_Callback";


  /** @domName Notification.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "Notification_removeEventListener_Callback";


  /** @domName Notification.requestPermission */
  static void requestPermission(NotificationPermissionCallback callback) native "Notification_requestPermission_Callback";


  /** @domName Notification.show */
  void show() native "Notification_show_Callback";

}

/// @docsEditable true
class NotificationEvents extends Events {
  /// @docsEditable true
  NotificationEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get click => this['click'];

  /// @docsEditable true
  EventListenerList get close => this['close'];

  /// @docsEditable true
  EventListenerList get display => this['display'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get show => this['show'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName NotificationCenter
class NotificationCenter extends NativeFieldWrapperClass1 {
  NotificationCenter.internal();


  /** @domName NotificationCenter.checkPermission */
  int checkPermission() native "NotificationCenter_checkPermission_Callback";


  /** @domName NotificationCenter.createHTMLNotification */
  Notification createHtmlNotification(String url) native "NotificationCenter_createHTMLNotification_Callback";


  /** @domName NotificationCenter.createNotification */
  Notification createNotification(String iconUrl, String title, String body) native "NotificationCenter_createNotification_Callback";


  /** @domName NotificationCenter.requestPermission */
  void requestPermission(VoidCallback callback) native "NotificationCenter_requestPermission_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void NotificationPermissionCallback(String permission);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLOListElement
class OListElement extends _Element_Merged {

  ///@docsEditable true
  factory OListElement() => document.$dom_createElement("ol");
  OListElement.internal(): super.internal();


  /** @domName HTMLOListElement.compact */
  bool get compact native "HTMLOListElement_compact_Getter";


  /** @domName HTMLOListElement.compact */
  void set compact(bool value) native "HTMLOListElement_compact_Setter";


  /** @domName HTMLOListElement.reversed */
  bool get reversed native "HTMLOListElement_reversed_Getter";


  /** @domName HTMLOListElement.reversed */
  void set reversed(bool value) native "HTMLOListElement_reversed_Setter";


  /** @domName HTMLOListElement.start */
  int get start native "HTMLOListElement_start_Getter";


  /** @domName HTMLOListElement.start */
  void set start(int value) native "HTMLOListElement_start_Setter";


  /** @domName HTMLOListElement.type */
  String get type native "HTMLOListElement_type_Getter";


  /** @domName HTMLOListElement.type */
  void set type(String value) native "HTMLOListElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLObjectElement
class ObjectElement extends _Element_Merged {

  ///@docsEditable true
  factory ObjectElement() => document.$dom_createElement("object");
  ObjectElement.internal(): super.internal();


  /** @domName HTMLObjectElement.align */
  String get align native "HTMLObjectElement_align_Getter";


  /** @domName HTMLObjectElement.align */
  void set align(String value) native "HTMLObjectElement_align_Setter";


  /** @domName HTMLObjectElement.archive */
  String get archive native "HTMLObjectElement_archive_Getter";


  /** @domName HTMLObjectElement.archive */
  void set archive(String value) native "HTMLObjectElement_archive_Setter";


  /** @domName HTMLObjectElement.border */
  String get border native "HTMLObjectElement_border_Getter";


  /** @domName HTMLObjectElement.border */
  void set border(String value) native "HTMLObjectElement_border_Setter";


  /** @domName HTMLObjectElement.code */
  String get code native "HTMLObjectElement_code_Getter";


  /** @domName HTMLObjectElement.code */
  void set code(String value) native "HTMLObjectElement_code_Setter";


  /** @domName HTMLObjectElement.codeBase */
  String get codeBase native "HTMLObjectElement_codeBase_Getter";


  /** @domName HTMLObjectElement.codeBase */
  void set codeBase(String value) native "HTMLObjectElement_codeBase_Setter";


  /** @domName HTMLObjectElement.codeType */
  String get codeType native "HTMLObjectElement_codeType_Getter";


  /** @domName HTMLObjectElement.codeType */
  void set codeType(String value) native "HTMLObjectElement_codeType_Setter";


  /** @domName HTMLObjectElement.data */
  String get data native "HTMLObjectElement_data_Getter";


  /** @domName HTMLObjectElement.data */
  void set data(String value) native "HTMLObjectElement_data_Setter";


  /** @domName HTMLObjectElement.declare */
  bool get declare native "HTMLObjectElement_declare_Getter";


  /** @domName HTMLObjectElement.declare */
  void set declare(bool value) native "HTMLObjectElement_declare_Setter";


  /** @domName HTMLObjectElement.form */
  FormElement get form native "HTMLObjectElement_form_Getter";


  /** @domName HTMLObjectElement.height */
  String get height native "HTMLObjectElement_height_Getter";


  /** @domName HTMLObjectElement.height */
  void set height(String value) native "HTMLObjectElement_height_Setter";


  /** @domName HTMLObjectElement.hspace */
  int get hspace native "HTMLObjectElement_hspace_Getter";


  /** @domName HTMLObjectElement.hspace */
  void set hspace(int value) native "HTMLObjectElement_hspace_Setter";


  /** @domName HTMLObjectElement.name */
  String get name native "HTMLObjectElement_name_Getter";


  /** @domName HTMLObjectElement.name */
  void set name(String value) native "HTMLObjectElement_name_Setter";


  /** @domName HTMLObjectElement.standby */
  String get standby native "HTMLObjectElement_standby_Getter";


  /** @domName HTMLObjectElement.standby */
  void set standby(String value) native "HTMLObjectElement_standby_Setter";


  /** @domName HTMLObjectElement.type */
  String get type native "HTMLObjectElement_type_Getter";


  /** @domName HTMLObjectElement.type */
  void set type(String value) native "HTMLObjectElement_type_Setter";


  /** @domName HTMLObjectElement.useMap */
  String get useMap native "HTMLObjectElement_useMap_Getter";


  /** @domName HTMLObjectElement.useMap */
  void set useMap(String value) native "HTMLObjectElement_useMap_Setter";


  /** @domName HTMLObjectElement.validationMessage */
  String get validationMessage native "HTMLObjectElement_validationMessage_Getter";


  /** @domName HTMLObjectElement.validity */
  ValidityState get validity native "HTMLObjectElement_validity_Getter";


  /** @domName HTMLObjectElement.vspace */
  int get vspace native "HTMLObjectElement_vspace_Getter";


  /** @domName HTMLObjectElement.vspace */
  void set vspace(int value) native "HTMLObjectElement_vspace_Setter";


  /** @domName HTMLObjectElement.width */
  String get width native "HTMLObjectElement_width_Getter";


  /** @domName HTMLObjectElement.width */
  void set width(String value) native "HTMLObjectElement_width_Setter";


  /** @domName HTMLObjectElement.willValidate */
  bool get willValidate native "HTMLObjectElement_willValidate_Getter";


  /** @domName HTMLObjectElement.checkValidity */
  bool checkValidity() native "HTMLObjectElement_checkValidity_Callback";


  /** @domName HTMLObjectElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLObjectElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName OESElementIndexUint
class OesElementIndexUint extends NativeFieldWrapperClass1 {
  OesElementIndexUint.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName OESStandardDerivatives
class OesStandardDerivatives extends NativeFieldWrapperClass1 {
  OesStandardDerivatives.internal();

  static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName OESTextureFloat
class OesTextureFloat extends NativeFieldWrapperClass1 {
  OesTextureFloat.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName OESVertexArrayObject
class OesVertexArrayObject extends NativeFieldWrapperClass1 {
  OesVertexArrayObject.internal();

  static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;


  /** @domName OESVertexArrayObject.bindVertexArrayOES */
  void bindVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.createVertexArrayOES */
  WebGLVertexArrayObject createVertexArray() native "OESVertexArrayObject_createVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.deleteVertexArrayOES */
  void deleteVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback";


  /** @domName OESVertexArrayObject.isVertexArrayOES */
  bool isVertexArray(WebGLVertexArrayObject arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLOptGroupElement
class OptGroupElement extends _Element_Merged {

  ///@docsEditable true
  factory OptGroupElement() => document.$dom_createElement("optgroup");
  OptGroupElement.internal(): super.internal();


  /** @domName HTMLOptGroupElement.disabled */
  bool get disabled native "HTMLOptGroupElement_disabled_Getter";


  /** @domName HTMLOptGroupElement.disabled */
  void set disabled(bool value) native "HTMLOptGroupElement_disabled_Setter";


  /** @domName HTMLOptGroupElement.label */
  String get label native "HTMLOptGroupElement_label_Getter";


  /** @domName HTMLOptGroupElement.label */
  void set label(String value) native "HTMLOptGroupElement_label_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLOptionElement
class OptionElement extends _Element_Merged {

  ///@docsEditable true
  factory OptionElement([String data, String value, bool defaultSelected, bool selected]) {
    if (!?data) {
      return _OptionElementFactoryProvider.createOptionElement();
    }
    if (!?value) {
      return _OptionElementFactoryProvider.createOptionElement(data);
    }
    if (!?defaultSelected) {
      return _OptionElementFactoryProvider.createOptionElement(data, value);
    }
    if (!?selected) {
      return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected);
    }
    return _OptionElementFactoryProvider.createOptionElement(data, value, defaultSelected, selected);
  }
  OptionElement.internal(): super.internal();


  /** @domName HTMLOptionElement.defaultSelected */
  bool get defaultSelected native "HTMLOptionElement_defaultSelected_Getter";


  /** @domName HTMLOptionElement.defaultSelected */
  void set defaultSelected(bool value) native "HTMLOptionElement_defaultSelected_Setter";


  /** @domName HTMLOptionElement.disabled */
  bool get disabled native "HTMLOptionElement_disabled_Getter";


  /** @domName HTMLOptionElement.disabled */
  void set disabled(bool value) native "HTMLOptionElement_disabled_Setter";


  /** @domName HTMLOptionElement.form */
  FormElement get form native "HTMLOptionElement_form_Getter";


  /** @domName HTMLOptionElement.index */
  int get index native "HTMLOptionElement_index_Getter";


  /** @domName HTMLOptionElement.label */
  String get label native "HTMLOptionElement_label_Getter";


  /** @domName HTMLOptionElement.label */
  void set label(String value) native "HTMLOptionElement_label_Setter";


  /** @domName HTMLOptionElement.selected */
  bool get selected native "HTMLOptionElement_selected_Getter";


  /** @domName HTMLOptionElement.selected */
  void set selected(bool value) native "HTMLOptionElement_selected_Setter";


  /** @domName HTMLOptionElement.value */
  String get value native "HTMLOptionElement_value_Getter";


  /** @domName HTMLOptionElement.value */
  void set value(String value) native "HTMLOptionElement_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLOutputElement
class OutputElement extends _Element_Merged {

  ///@docsEditable true
  factory OutputElement() => document.$dom_createElement("output");
  OutputElement.internal(): super.internal();


  /** @domName HTMLOutputElement.defaultValue */
  String get defaultValue native "HTMLOutputElement_defaultValue_Getter";


  /** @domName HTMLOutputElement.defaultValue */
  void set defaultValue(String value) native "HTMLOutputElement_defaultValue_Setter";


  /** @domName HTMLOutputElement.form */
  FormElement get form native "HTMLOutputElement_form_Getter";


  /** @domName HTMLOutputElement.htmlFor */
  DomSettableTokenList get htmlFor native "HTMLOutputElement_htmlFor_Getter";


  /** @domName HTMLOutputElement.htmlFor */
  void set htmlFor(DomSettableTokenList value) native "HTMLOutputElement_htmlFor_Setter";


  /** @domName HTMLOutputElement.labels */
  List<Node> get labels native "HTMLOutputElement_labels_Getter";


  /** @domName HTMLOutputElement.name */
  String get name native "HTMLOutputElement_name_Getter";


  /** @domName HTMLOutputElement.name */
  void set name(String value) native "HTMLOutputElement_name_Setter";


  /** @domName HTMLOutputElement.type */
  String get type native "HTMLOutputElement_type_Getter";


  /** @domName HTMLOutputElement.validationMessage */
  String get validationMessage native "HTMLOutputElement_validationMessage_Getter";


  /** @domName HTMLOutputElement.validity */
  ValidityState get validity native "HTMLOutputElement_validity_Getter";


  /** @domName HTMLOutputElement.value */
  String get value native "HTMLOutputElement_value_Getter";


  /** @domName HTMLOutputElement.value */
  void set value(String value) native "HTMLOutputElement_value_Setter";


  /** @domName HTMLOutputElement.willValidate */
  bool get willValidate native "HTMLOutputElement_willValidate_Getter";


  /** @domName HTMLOutputElement.checkValidity */
  bool checkValidity() native "HTMLOutputElement_checkValidity_Callback";


  /** @domName HTMLOutputElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLOutputElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName OverflowEvent
class OverflowEvent extends Event {
  OverflowEvent.internal(): super.internal();

  static const int BOTH = 2;

  static const int HORIZONTAL = 0;

  static const int VERTICAL = 1;


  /** @domName OverflowEvent.horizontalOverflow */
  bool get horizontalOverflow native "OverflowEvent_horizontalOverflow_Getter";


  /** @domName OverflowEvent.orient */
  int get orient native "OverflowEvent_orient_Getter";


  /** @domName OverflowEvent.verticalOverflow */
  bool get verticalOverflow native "OverflowEvent_verticalOverflow_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PagePopupController
class PagePopupController extends NativeFieldWrapperClass1 {
  PagePopupController.internal();


  /** @domName PagePopupController.localizeNumberString */
  String localizeNumberString(String numberString) native "PagePopupController_localizeNumberString_Callback";


  /** @domName PagePopupController.setValueAndClosePopup */
  void setValueAndClosePopup(int numberValue, String stringValue) native "PagePopupController_setValueAndClosePopup_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PageTransitionEvent
class PageTransitionEvent extends Event {
  PageTransitionEvent.internal(): super.internal();


  /** @domName PageTransitionEvent.persisted */
  bool get persisted native "PageTransitionEvent_persisted_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLParagraphElement
class ParagraphElement extends _Element_Merged {

  ///@docsEditable true
  factory ParagraphElement() => document.$dom_createElement("p");
  ParagraphElement.internal(): super.internal();


  /** @domName HTMLParagraphElement.align */
  String get align native "HTMLParagraphElement_align_Getter";


  /** @domName HTMLParagraphElement.align */
  void set align(String value) native "HTMLParagraphElement_align_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLParamElement
class ParamElement extends _Element_Merged {

  ///@docsEditable true
  factory ParamElement() => document.$dom_createElement("param");
  ParamElement.internal(): super.internal();


  /** @domName HTMLParamElement.name */
  String get name native "HTMLParamElement_name_Getter";


  /** @domName HTMLParamElement.name */
  void set name(String value) native "HTMLParamElement_name_Setter";


  /** @domName HTMLParamElement.type */
  String get type native "HTMLParamElement_type_Getter";


  /** @domName HTMLParamElement.type */
  void set type(String value) native "HTMLParamElement_type_Setter";


  /** @domName HTMLParamElement.value */
  String get value native "HTMLParamElement_value_Getter";


  /** @domName HTMLParamElement.value */
  void set value(String value) native "HTMLParamElement_value_Setter";


  /** @domName HTMLParamElement.valueType */
  String get valueType native "HTMLParamElement_valueType_Getter";


  /** @domName HTMLParamElement.valueType */
  void set valueType(String value) native "HTMLParamElement_valueType_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PeerConnection00
class PeerConnection00 extends EventTarget {

  ///@docsEditable true
  factory PeerConnection00(String serverConfiguration, IceCallback iceCallback) => _PeerConnection00FactoryProvider.createPeerConnection00(serverConfiguration, iceCallback);
  PeerConnection00.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  PeerConnection00Events get on =>
    new PeerConnection00Events(this);

  static const int ACTIVE = 2;

  static const int CLOSED = 3;

  static const int ICE_CHECKING = 0x300;

  static const int ICE_CLOSED = 0x700;

  static const int ICE_COMPLETED = 0x500;

  static const int ICE_CONNECTED = 0x400;

  static const int ICE_FAILED = 0x600;

  static const int ICE_GATHERING = 0x100;

  static const int ICE_WAITING = 0x200;

  static const int NEW = 0;

  static const int OPENING = 1;

  static const int SDP_ANSWER = 0x300;

  static const int SDP_OFFER = 0x100;

  static const int SDP_PRANSWER = 0x200;


  /** @domName PeerConnection00.iceState */
  int get iceState native "PeerConnection00_iceState_Getter";


  /** @domName PeerConnection00.localDescription */
  SessionDescription get localDescription native "PeerConnection00_localDescription_Getter";


  /** @domName PeerConnection00.localStreams */
  List<MediaStream> get localStreams native "PeerConnection00_localStreams_Getter";


  /** @domName PeerConnection00.readyState */
  int get readyState native "PeerConnection00_readyState_Getter";


  /** @domName PeerConnection00.remoteDescription */
  SessionDescription get remoteDescription native "PeerConnection00_remoteDescription_Getter";


  /** @domName PeerConnection00.remoteStreams */
  List<MediaStream> get remoteStreams native "PeerConnection00_remoteStreams_Getter";


  /** @domName PeerConnection00.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_addEventListener_Callback";


  /** @domName PeerConnection00.addStream */
  void addStream(MediaStream stream, [Map mediaStreamHints]) native "PeerConnection00_addStream_Callback";


  /** @domName PeerConnection00.close */
  void close() native "PeerConnection00_close_Callback";


  /** @domName PeerConnection00.createAnswer */
  SessionDescription createAnswer(String offer, [Map mediaHints]) native "PeerConnection00_createAnswer_Callback";


  /** @domName PeerConnection00.createOffer */
  SessionDescription createOffer([Map mediaHints]) native "PeerConnection00_createOffer_Callback";


  /** @domName PeerConnection00.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "PeerConnection00_dispatchEvent_Callback";


  /** @domName PeerConnection00.processIceMessage */
  void processIceMessage(IceCandidate candidate) native "PeerConnection00_processIceMessage_Callback";


  /** @domName PeerConnection00.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "PeerConnection00_removeEventListener_Callback";


  /** @domName PeerConnection00.removeStream */
  void removeStream(MediaStream stream) native "PeerConnection00_removeStream_Callback";


  /** @domName PeerConnection00.setLocalDescription */
  void setLocalDescription(int action, SessionDescription desc) native "PeerConnection00_setLocalDescription_Callback";


  /** @domName PeerConnection00.setRemoteDescription */
  void setRemoteDescription(int action, SessionDescription desc) native "PeerConnection00_setRemoteDescription_Callback";


  /** @domName PeerConnection00.startIce */
  void startIce([Map iceOptions]) native "PeerConnection00_startIce_Callback";

}

/// @docsEditable true
class PeerConnection00Events extends Events {
  /// @docsEditable true
  PeerConnection00Events(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get addStream => this['addstream'];

  /// @docsEditable true
  EventListenerList get connecting => this['connecting'];

  /// @docsEditable true
  EventListenerList get open => this['open'];

  /// @docsEditable true
  EventListenerList get removeStream => this['removestream'];

  /// @docsEditable true
  EventListenerList get stateChange => this['statechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Performance
class Performance extends EventTarget {
  Performance.internal(): super.internal();


  /** @domName Performance.memory */
  MemoryInfo get memory native "Performance_memory_Getter";


  /** @domName Performance.navigation */
  PerformanceNavigation get navigation native "Performance_navigation_Getter";


  /** @domName Performance.timing */
  PerformanceTiming get timing native "Performance_timing_Getter";


  /** @domName Performance.now */
  num now() native "Performance_now_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PerformanceNavigation
class PerformanceNavigation extends NativeFieldWrapperClass1 {
  PerformanceNavigation.internal();

  static const int TYPE_BACK_FORWARD = 2;

  static const int TYPE_NAVIGATE = 0;

  static const int TYPE_RELOAD = 1;

  static const int TYPE_RESERVED = 255;


  /** @domName PerformanceNavigation.redirectCount */
  int get redirectCount native "PerformanceNavigation_redirectCount_Getter";


  /** @domName PerformanceNavigation.type */
  int get type native "PerformanceNavigation_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PerformanceTiming
class PerformanceTiming extends NativeFieldWrapperClass1 {
  PerformanceTiming.internal();


  /** @domName PerformanceTiming.connectEnd */
  int get connectEnd native "PerformanceTiming_connectEnd_Getter";


  /** @domName PerformanceTiming.connectStart */
  int get connectStart native "PerformanceTiming_connectStart_Getter";


  /** @domName PerformanceTiming.domComplete */
  int get domComplete native "PerformanceTiming_domComplete_Getter";


  /** @domName PerformanceTiming.domContentLoadedEventEnd */
  int get domContentLoadedEventEnd native "PerformanceTiming_domContentLoadedEventEnd_Getter";


  /** @domName PerformanceTiming.domContentLoadedEventStart */
  int get domContentLoadedEventStart native "PerformanceTiming_domContentLoadedEventStart_Getter";


  /** @domName PerformanceTiming.domInteractive */
  int get domInteractive native "PerformanceTiming_domInteractive_Getter";


  /** @domName PerformanceTiming.domLoading */
  int get domLoading native "PerformanceTiming_domLoading_Getter";


  /** @domName PerformanceTiming.domainLookupEnd */
  int get domainLookupEnd native "PerformanceTiming_domainLookupEnd_Getter";


  /** @domName PerformanceTiming.domainLookupStart */
  int get domainLookupStart native "PerformanceTiming_domainLookupStart_Getter";


  /** @domName PerformanceTiming.fetchStart */
  int get fetchStart native "PerformanceTiming_fetchStart_Getter";


  /** @domName PerformanceTiming.loadEventEnd */
  int get loadEventEnd native "PerformanceTiming_loadEventEnd_Getter";


  /** @domName PerformanceTiming.loadEventStart */
  int get loadEventStart native "PerformanceTiming_loadEventStart_Getter";


  /** @domName PerformanceTiming.navigationStart */
  int get navigationStart native "PerformanceTiming_navigationStart_Getter";


  /** @domName PerformanceTiming.redirectEnd */
  int get redirectEnd native "PerformanceTiming_redirectEnd_Getter";


  /** @domName PerformanceTiming.redirectStart */
  int get redirectStart native "PerformanceTiming_redirectStart_Getter";


  /** @domName PerformanceTiming.requestStart */
  int get requestStart native "PerformanceTiming_requestStart_Getter";


  /** @domName PerformanceTiming.responseEnd */
  int get responseEnd native "PerformanceTiming_responseEnd_Getter";


  /** @domName PerformanceTiming.responseStart */
  int get responseStart native "PerformanceTiming_responseStart_Getter";


  /** @domName PerformanceTiming.secureConnectionStart */
  int get secureConnectionStart native "PerformanceTiming_secureConnectionStart_Getter";


  /** @domName PerformanceTiming.unloadEventEnd */
  int get unloadEventEnd native "PerformanceTiming_unloadEventEnd_Getter";


  /** @domName PerformanceTiming.unloadEventStart */
  int get unloadEventStart native "PerformanceTiming_unloadEventStart_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitPoint
class Point extends NativeFieldWrapperClass1 {
  factory Point(num x, num y) => _PointFactoryProvider.createPoint(x, y);
  Point.internal();


  /** @domName WebKitPoint.x */
  num get x native "WebKitPoint_x_Getter";


  /** @domName WebKitPoint.x */
  void set x(num value) native "WebKitPoint_x_Setter";


  /** @domName WebKitPoint.y */
  num get y native "WebKitPoint_y_Getter";


  /** @domName WebKitPoint.y */
  void set y(num value) native "WebKitPoint_y_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PopStateEvent
class PopStateEvent extends Event {
  PopStateEvent.internal(): super.internal();


  /** @domName PopStateEvent.state */
  Object get state native "PopStateEvent_state_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void PositionCallback(Geoposition position);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName PositionError
class PositionError extends NativeFieldWrapperClass1 {
  PositionError.internal();

  static const int PERMISSION_DENIED = 1;

  static const int POSITION_UNAVAILABLE = 2;

  static const int TIMEOUT = 3;


  /** @domName PositionError.code */
  int get code native "PositionError_code_Getter";


  /** @domName PositionError.message */
  String get message native "PositionError_message_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void PositionErrorCallback(PositionError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLPreElement
class PreElement extends _Element_Merged {

  ///@docsEditable true
  factory PreElement() => document.$dom_createElement("pre");
  PreElement.internal(): super.internal();


  /** @domName HTMLPreElement.width */
  int get width native "HTMLPreElement_width_Getter";


  /** @domName HTMLPreElement.width */
  void set width(int value) native "HTMLPreElement_width_Setter";


  /** @domName HTMLPreElement.wrap */
  bool get wrap native "HTMLPreElement_wrap_Getter";


  /** @domName HTMLPreElement.wrap */
  void set wrap(bool value) native "HTMLPreElement_wrap_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ProcessingInstruction
class ProcessingInstruction extends Node {
  ProcessingInstruction.internal(): super.internal();


  /** @domName ProcessingInstruction.data */
  String get data native "ProcessingInstruction_data_Getter";


  /** @domName ProcessingInstruction.data */
  void set data(String value) native "ProcessingInstruction_data_Setter";


  /** @domName ProcessingInstruction.sheet */
  StyleSheet get sheet native "ProcessingInstruction_sheet_Getter";


  /** @domName ProcessingInstruction.target */
  String get target native "ProcessingInstruction_target_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLProgressElement
class ProgressElement extends _Element_Merged {

  ///@docsEditable true
  factory ProgressElement() => document.$dom_createElement("progress");
  ProgressElement.internal(): super.internal();


  /** @domName HTMLProgressElement.labels */
  List<Node> get labels native "HTMLProgressElement_labels_Getter";


  /** @domName HTMLProgressElement.max */
  num get max native "HTMLProgressElement_max_Getter";


  /** @domName HTMLProgressElement.max */
  void set max(num value) native "HTMLProgressElement_max_Setter";


  /** @domName HTMLProgressElement.position */
  num get position native "HTMLProgressElement_position_Getter";


  /** @domName HTMLProgressElement.value */
  num get value native "HTMLProgressElement_value_Getter";


  /** @domName HTMLProgressElement.value */
  void set value(num value) native "HTMLProgressElement_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ProgressEvent
class ProgressEvent extends Event {
  ProgressEvent.internal(): super.internal();


  /** @domName ProgressEvent.lengthComputable */
  bool get lengthComputable native "ProgressEvent_lengthComputable_Getter";


  /** @domName ProgressEvent.loaded */
  int get loaded native "ProgressEvent_loaded_Getter";


  /** @domName ProgressEvent.total */
  int get total native "ProgressEvent_total_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLQuoteElement
class QuoteElement extends _Element_Merged {
  QuoteElement.internal(): super.internal();


  /** @domName HTMLQuoteElement.cite */
  String get cite native "HTMLQuoteElement_cite_Getter";


  /** @domName HTMLQuoteElement.cite */
  void set cite(String value) native "HTMLQuoteElement_cite_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void RtcErrorCallback(String errorInformation);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void RtcSessionDescriptionCallback(RtcSessionDescription sdp);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void RtcStatsCallback(RtcStatsResponse response);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RadioNodeList
class RadioNodeList extends NodeList {
  RadioNodeList.internal(): super.internal();


  /** @domName RadioNodeList.value */
  String get value native "RadioNodeList_value_Getter";


  /** @domName RadioNodeList.value */
  void set value(String value) native "RadioNodeList_value_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Range
class Range extends NativeFieldWrapperClass1 {
  factory Range() => document.$dom_createRange();

  Range.internal();

  static const int END_TO_END = 2;

  static const int END_TO_START = 3;

  static const int NODE_AFTER = 1;

  static const int NODE_BEFORE = 0;

  static const int NODE_BEFORE_AND_AFTER = 2;

  static const int NODE_INSIDE = 3;

  static const int START_TO_END = 1;

  static const int START_TO_START = 0;


  /** @domName Range.collapsed */
  bool get collapsed native "Range_collapsed_Getter";


  /** @domName Range.commonAncestorContainer */
  Node get commonAncestorContainer native "Range_commonAncestorContainer_Getter";


  /** @domName Range.endContainer */
  Node get endContainer native "Range_endContainer_Getter";


  /** @domName Range.endOffset */
  int get endOffset native "Range_endOffset_Getter";


  /** @domName Range.startContainer */
  Node get startContainer native "Range_startContainer_Getter";


  /** @domName Range.startOffset */
  int get startOffset native "Range_startOffset_Getter";


  /** @domName Range.cloneContents */
  DocumentFragment cloneContents() native "Range_cloneContents_Callback";


  /** @domName Range.cloneRange */
  Range cloneRange() native "Range_cloneRange_Callback";


  /** @domName Range.collapse */
  void collapse(bool toStart) native "Range_collapse_Callback";


  /** @domName Range.compareNode */
  int compareNode(Node refNode) native "Range_compareNode_Callback";


  /** @domName Range.comparePoint */
  int comparePoint(Node refNode, int offset) native "Range_comparePoint_Callback";


  /** @domName Range.createContextualFragment */
  DocumentFragment createContextualFragment(String html) native "Range_createContextualFragment_Callback";


  /** @domName Range.deleteContents */
  void deleteContents() native "Range_deleteContents_Callback";


  /** @domName Range.detach */
  void detach() native "Range_detach_Callback";


  /** @domName Range.expand */
  void expand(String unit) native "Range_expand_Callback";


  /** @domName Range.extractContents */
  DocumentFragment extractContents() native "Range_extractContents_Callback";


  /** @domName Range.getBoundingClientRect */
  ClientRect getBoundingClientRect() native "Range_getBoundingClientRect_Callback";


  /** @domName Range.getClientRects */
  List<ClientRect> getClientRects() native "Range_getClientRects_Callback";


  /** @domName Range.insertNode */
  void insertNode(Node newNode) native "Range_insertNode_Callback";


  /** @domName Range.intersectsNode */
  bool intersectsNode(Node refNode) native "Range_intersectsNode_Callback";


  /** @domName Range.isPointInRange */
  bool isPointInRange(Node refNode, int offset) native "Range_isPointInRange_Callback";


  /** @domName Range.selectNode */
  void selectNode(Node refNode) native "Range_selectNode_Callback";


  /** @domName Range.selectNodeContents */
  void selectNodeContents(Node refNode) native "Range_selectNodeContents_Callback";


  /** @domName Range.setEnd */
  void setEnd(Node refNode, int offset) native "Range_setEnd_Callback";


  /** @domName Range.setEndAfter */
  void setEndAfter(Node refNode) native "Range_setEndAfter_Callback";


  /** @domName Range.setEndBefore */
  void setEndBefore(Node refNode) native "Range_setEndBefore_Callback";


  /** @domName Range.setStart */
  void setStart(Node refNode, int offset) native "Range_setStart_Callback";


  /** @domName Range.setStartAfter */
  void setStartAfter(Node refNode) native "Range_setStartAfter_Callback";


  /** @domName Range.setStartBefore */
  void setStartBefore(Node refNode) native "Range_setStartBefore_Callback";


  /** @domName Range.surroundContents */
  void surroundContents(Node newParent) native "Range_surroundContents_Callback";


  /** @domName Range.toString */
  String toString() native "Range_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RangeException
class RangeException extends NativeFieldWrapperClass1 {
  RangeException.internal();

  static const int BAD_BOUNDARYPOINTS_ERR = 1;

  static const int INVALID_NODE_TYPE_ERR = 2;


  /** @domName RangeException.code */
  int get code native "RangeException_code_Getter";


  /** @domName RangeException.message */
  String get message native "RangeException_message_Getter";


  /** @domName RangeException.name */
  String get name native "RangeException_name_Getter";


  /** @domName RangeException.toString */
  String toString() native "RangeException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Rect
class Rect extends NativeFieldWrapperClass1 {
  Rect.internal();


  /** @domName Rect.bottom */
  CssPrimitiveValue get bottom native "Rect_bottom_Getter";


  /** @domName Rect.left */
  CssPrimitiveValue get left native "Rect_left_Getter";


  /** @domName Rect.right */
  CssPrimitiveValue get right native "Rect_right_Getter";


  /** @domName Rect.top */
  CssPrimitiveValue get top native "Rect_top_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void RequestAnimationFrameCallback(num highResTime);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RGBColor
class RgbColor extends NativeFieldWrapperClass1 {
  RgbColor.internal();


  /** @domName RGBColor.blue */
  CssPrimitiveValue get blue native "RGBColor_blue_Getter";


  /** @domName RGBColor.green */
  CssPrimitiveValue get green native "RGBColor_green_Getter";


  /** @domName RGBColor.red */
  CssPrimitiveValue get red native "RGBColor_red_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCDataChannel
class RtcDataChannel extends EventTarget {
  RtcDataChannel.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  RtcDataChannelEvents get on =>
    new RtcDataChannelEvents(this);


  /** @domName RTCDataChannel.binaryType */
  String get binaryType native "RTCDataChannel_binaryType_Getter";


  /** @domName RTCDataChannel.binaryType */
  void set binaryType(String value) native "RTCDataChannel_binaryType_Setter";


  /** @domName RTCDataChannel.bufferedAmount */
  int get bufferedAmount native "RTCDataChannel_bufferedAmount_Getter";


  /** @domName RTCDataChannel.label */
  String get label native "RTCDataChannel_label_Getter";


  /** @domName RTCDataChannel.readyState */
  String get readyState native "RTCDataChannel_readyState_Getter";


  /** @domName RTCDataChannel.reliable */
  bool get reliable native "RTCDataChannel_reliable_Getter";


  /** @domName RTCDataChannel.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_addEventListener_Callback";


  /** @domName RTCDataChannel.close */
  void close() native "RTCDataChannel_close_Callback";


  /** @domName RTCDataChannel.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "RTCDataChannel_dispatchEvent_Callback";


  /** @domName RTCDataChannel.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCDataChannel_removeEventListener_Callback";

  void send(data) {
    if ((data is ArrayBuffer || data == null)) {
      _send_1(data);
      return;
    }
    if ((data is ArrayBufferView || data == null)) {
      _send_2(data);
      return;
    }
    if ((data is Blob || data == null)) {
      _send_3(data);
      return;
    }
    if ((data is String || data == null)) {
      _send_4(data);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName RTCDataChannel.send_1 */
  void _send_1(data) native "RTCDataChannel_send_1_Callback";


  /** @domName RTCDataChannel.send_2 */
  void _send_2(data) native "RTCDataChannel_send_2_Callback";


  /** @domName RTCDataChannel.send_3 */
  void _send_3(data) native "RTCDataChannel_send_3_Callback";


  /** @domName RTCDataChannel.send_4 */
  void _send_4(data) native "RTCDataChannel_send_4_Callback";

}

/// @docsEditable true
class RtcDataChannelEvents extends Events {
  /// @docsEditable true
  RtcDataChannelEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get close => this['close'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCDataChannelEvent
class RtcDataChannelEvent extends Event {
  RtcDataChannelEvent.internal(): super.internal();


  /** @domName RTCDataChannelEvent.channel */
  RtcDataChannel get channel native "RTCDataChannelEvent_channel_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCIceCandidate
class RtcIceCandidate extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory RtcIceCandidate(Map dictionary) => _RtcIceCandidateFactoryProvider.createRtcIceCandidate(dictionary);
  RtcIceCandidate.internal();


  /** @domName RTCIceCandidate.candidate */
  String get candidate native "RTCIceCandidate_candidate_Getter";


  /** @domName RTCIceCandidate.sdpMLineIndex */
  int get sdpMLineIndex native "RTCIceCandidate_sdpMLineIndex_Getter";


  /** @domName RTCIceCandidate.sdpMid */
  String get sdpMid native "RTCIceCandidate_sdpMid_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCIceCandidateEvent
class RtcIceCandidateEvent extends Event {
  RtcIceCandidateEvent.internal(): super.internal();


  /** @domName RTCIceCandidateEvent.candidate */
  RtcIceCandidate get candidate native "RTCIceCandidateEvent_candidate_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCPeerConnection
class RtcPeerConnection extends EventTarget {

  ///@docsEditable true
  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) {
    if (!?mediaConstraints) {
      return _RtcPeerConnectionFactoryProvider.createRtcPeerConnection(rtcIceServers);
    }
    return _RtcPeerConnectionFactoryProvider.createRtcPeerConnection(rtcIceServers, mediaConstraints);
  }
  RtcPeerConnection.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  RtcPeerConnectionEvents get on =>
    new RtcPeerConnectionEvents(this);


  /** @domName RTCPeerConnection.iceState */
  String get iceState native "RTCPeerConnection_iceState_Getter";


  /** @domName RTCPeerConnection.localDescription */
  RtcSessionDescription get localDescription native "RTCPeerConnection_localDescription_Getter";


  /** @domName RTCPeerConnection.localStreams */
  List<MediaStream> get localStreams native "RTCPeerConnection_localStreams_Getter";


  /** @domName RTCPeerConnection.readyState */
  String get readyState native "RTCPeerConnection_readyState_Getter";


  /** @domName RTCPeerConnection.remoteDescription */
  RtcSessionDescription get remoteDescription native "RTCPeerConnection_remoteDescription_Getter";


  /** @domName RTCPeerConnection.remoteStreams */
  List<MediaStream> get remoteStreams native "RTCPeerConnection_remoteStreams_Getter";


  /** @domName RTCPeerConnection.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_addEventListener_Callback";


  /** @domName RTCPeerConnection.addIceCandidate */
  void addIceCandidate(RtcIceCandidate candidate) native "RTCPeerConnection_addIceCandidate_Callback";


  /** @domName RTCPeerConnection.addStream */
  void addStream(MediaStream stream, [Map mediaConstraints]) native "RTCPeerConnection_addStream_Callback";


  /** @domName RTCPeerConnection.close */
  void close() native "RTCPeerConnection_close_Callback";


  /** @domName RTCPeerConnection.createAnswer */
  void createAnswer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createAnswer_Callback";


  /** @domName RTCPeerConnection.createDataChannel */
  RtcDataChannel createDataChannel(String label, [Map options]) native "RTCPeerConnection_createDataChannel_Callback";


  /** @domName RTCPeerConnection.createOffer */
  void createOffer(RtcSessionDescriptionCallback successCallback, [RtcErrorCallback failureCallback, Map mediaConstraints]) native "RTCPeerConnection_createOffer_Callback";


  /** @domName RTCPeerConnection.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "RTCPeerConnection_dispatchEvent_Callback";


  /** @domName RTCPeerConnection.getStats */
  void getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) native "RTCPeerConnection_getStats_Callback";


  /** @domName RTCPeerConnection.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "RTCPeerConnection_removeEventListener_Callback";


  /** @domName RTCPeerConnection.removeStream */
  void removeStream(MediaStream stream) native "RTCPeerConnection_removeStream_Callback";


  /** @domName RTCPeerConnection.setLocalDescription */
  void setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native "RTCPeerConnection_setLocalDescription_Callback";


  /** @domName RTCPeerConnection.setRemoteDescription */
  void setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, RtcErrorCallback failureCallback]) native "RTCPeerConnection_setRemoteDescription_Callback";


  /** @domName RTCPeerConnection.updateIce */
  void updateIce([Map configuration, Map mediaConstraints]) native "RTCPeerConnection_updateIce_Callback";

}

/// @docsEditable true
class RtcPeerConnectionEvents extends Events {
  /// @docsEditable true
  RtcPeerConnectionEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get addStream => this['addstream'];

  /// @docsEditable true
  EventListenerList get iceCandidate => this['icecandidate'];

  /// @docsEditable true
  EventListenerList get iceChange => this['icechange'];

  /// @docsEditable true
  EventListenerList get negotiationNeeded => this['negotiationneeded'];

  /// @docsEditable true
  EventListenerList get open => this['open'];

  /// @docsEditable true
  EventListenerList get removeStream => this['removestream'];

  /// @docsEditable true
  EventListenerList get stateChange => this['statechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCSessionDescription
class RtcSessionDescription extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory RtcSessionDescription(Map dictionary) => _RtcSessionDescriptionFactoryProvider.createRtcSessionDescription(dictionary);
  RtcSessionDescription.internal();


  /** @domName RTCSessionDescription.sdp */
  String get sdp native "RTCSessionDescription_sdp_Getter";


  /** @domName RTCSessionDescription.sdp */
  void set sdp(String value) native "RTCSessionDescription_sdp_Setter";


  /** @domName RTCSessionDescription.type */
  String get type native "RTCSessionDescription_type_Getter";


  /** @domName RTCSessionDescription.type */
  void set type(String value) native "RTCSessionDescription_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCStatsElement
class RtcStatsElement extends NativeFieldWrapperClass1 {
  RtcStatsElement.internal();


  /** @domName RTCStatsElement.timestamp */
  Date get timestamp native "RTCStatsElement_timestamp_Getter";


  /** @domName RTCStatsElement.stat */
  String stat(String name) native "RTCStatsElement_stat_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCStatsReport
class RtcStatsReport extends NativeFieldWrapperClass1 {
  RtcStatsReport.internal();


  /** @domName RTCStatsReport.local */
  RtcStatsElement get local native "RTCStatsReport_local_Getter";


  /** @domName RTCStatsReport.remote */
  RtcStatsElement get remote native "RTCStatsReport_remote_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName RTCStatsResponse
class RtcStatsResponse extends NativeFieldWrapperClass1 {
  RtcStatsResponse.internal();


  /** @domName RTCStatsResponse.result */
  List<RtcStatsReport> result() native "RTCStatsResponse_result_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SqlStatementCallback(SqlTransaction transaction, SqlResultSet resultSet);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SqlStatementErrorCallback(SqlTransaction transaction, SqlError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SqlTransactionCallback(SqlTransaction transaction);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SqlTransactionErrorCallback(SqlError error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void SqlTransactionSyncCallback(SqlTransactionSync transaction);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Screen
class Screen extends NativeFieldWrapperClass1 {
  Screen.internal();


  /** @domName Screen.availHeight */
  int get availHeight native "Screen_availHeight_Getter";


  /** @domName Screen.availLeft */
  int get availLeft native "Screen_availLeft_Getter";


  /** @domName Screen.availTop */
  int get availTop native "Screen_availTop_Getter";


  /** @domName Screen.availWidth */
  int get availWidth native "Screen_availWidth_Getter";


  /** @domName Screen.colorDepth */
  int get colorDepth native "Screen_colorDepth_Getter";


  /** @domName Screen.height */
  int get height native "Screen_height_Getter";


  /** @domName Screen.pixelDepth */
  int get pixelDepth native "Screen_pixelDepth_Getter";


  /** @domName Screen.width */
  int get width native "Screen_width_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLScriptElement
class ScriptElement extends _Element_Merged {

  ///@docsEditable true
  factory ScriptElement() => document.$dom_createElement("script");
  ScriptElement.internal(): super.internal();


  /** @domName HTMLScriptElement.async */
  bool get async native "HTMLScriptElement_async_Getter";


  /** @domName HTMLScriptElement.async */
  void set async(bool value) native "HTMLScriptElement_async_Setter";


  /** @domName HTMLScriptElement.charset */
  String get charset native "HTMLScriptElement_charset_Getter";


  /** @domName HTMLScriptElement.charset */
  void set charset(String value) native "HTMLScriptElement_charset_Setter";


  /** @domName HTMLScriptElement.crossOrigin */
  String get crossOrigin native "HTMLScriptElement_crossOrigin_Getter";


  /** @domName HTMLScriptElement.crossOrigin */
  void set crossOrigin(String value) native "HTMLScriptElement_crossOrigin_Setter";


  /** @domName HTMLScriptElement.defer */
  bool get defer native "HTMLScriptElement_defer_Getter";


  /** @domName HTMLScriptElement.defer */
  void set defer(bool value) native "HTMLScriptElement_defer_Setter";


  /** @domName HTMLScriptElement.event */
  String get event native "HTMLScriptElement_event_Getter";


  /** @domName HTMLScriptElement.event */
  void set event(String value) native "HTMLScriptElement_event_Setter";


  /** @domName HTMLScriptElement.htmlFor */
  String get htmlFor native "HTMLScriptElement_htmlFor_Getter";


  /** @domName HTMLScriptElement.htmlFor */
  void set htmlFor(String value) native "HTMLScriptElement_htmlFor_Setter";


  /** @domName HTMLScriptElement.src */
  String get src native "HTMLScriptElement_src_Getter";


  /** @domName HTMLScriptElement.src */
  void set src(String value) native "HTMLScriptElement_src_Setter";


  /** @domName HTMLScriptElement.type */
  String get type native "HTMLScriptElement_type_Getter";


  /** @domName HTMLScriptElement.type */
  void set type(String value) native "HTMLScriptElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ScriptProfile
class ScriptProfile extends NativeFieldWrapperClass1 {
  ScriptProfile.internal();


  /** @domName ScriptProfile.head */
  ScriptProfileNode get head native "ScriptProfile_head_Getter";


  /** @domName ScriptProfile.title */
  String get title native "ScriptProfile_title_Getter";


  /** @domName ScriptProfile.uid */
  int get uid native "ScriptProfile_uid_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ScriptProfileNode
class ScriptProfileNode extends NativeFieldWrapperClass1 {
  ScriptProfileNode.internal();


  /** @domName ScriptProfileNode.callUID */
  int get callUid native "ScriptProfileNode_callUID_Getter";


  /** @domName ScriptProfileNode.functionName */
  String get functionName native "ScriptProfileNode_functionName_Getter";


  /** @domName ScriptProfileNode.lineNumber */
  int get lineNumber native "ScriptProfileNode_lineNumber_Getter";


  /** @domName ScriptProfileNode.numberOfCalls */
  int get numberOfCalls native "ScriptProfileNode_numberOfCalls_Getter";


  /** @domName ScriptProfileNode.selfTime */
  num get selfTime native "ScriptProfileNode_selfTime_Getter";


  /** @domName ScriptProfileNode.totalTime */
  num get totalTime native "ScriptProfileNode_totalTime_Getter";


  /** @domName ScriptProfileNode.url */
  String get url native "ScriptProfileNode_url_Getter";


  /** @domName ScriptProfileNode.visible */
  bool get visible native "ScriptProfileNode_visible_Getter";


  /** @domName ScriptProfileNode.children */
  List<ScriptProfileNode> children() native "ScriptProfileNode_children_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLSelectElement
class SelectElement extends _Element_Merged {

  ///@docsEditable true
  factory SelectElement() => document.$dom_createElement("select");
  SelectElement.internal(): super.internal();


  /** @domName HTMLSelectElement.autofocus */
  bool get autofocus native "HTMLSelectElement_autofocus_Getter";


  /** @domName HTMLSelectElement.autofocus */
  void set autofocus(bool value) native "HTMLSelectElement_autofocus_Setter";


  /** @domName HTMLSelectElement.disabled */
  bool get disabled native "HTMLSelectElement_disabled_Getter";


  /** @domName HTMLSelectElement.disabled */
  void set disabled(bool value) native "HTMLSelectElement_disabled_Setter";


  /** @domName HTMLSelectElement.form */
  FormElement get form native "HTMLSelectElement_form_Getter";


  /** @domName HTMLSelectElement.labels */
  List<Node> get labels native "HTMLSelectElement_labels_Getter";


  /** @domName HTMLSelectElement.length */
  int get length native "HTMLSelectElement_length_Getter";


  /** @domName HTMLSelectElement.length */
  void set length(int value) native "HTMLSelectElement_length_Setter";


  /** @domName HTMLSelectElement.multiple */
  bool get multiple native "HTMLSelectElement_multiple_Getter";


  /** @domName HTMLSelectElement.multiple */
  void set multiple(bool value) native "HTMLSelectElement_multiple_Setter";


  /** @domName HTMLSelectElement.name */
  String get name native "HTMLSelectElement_name_Getter";


  /** @domName HTMLSelectElement.name */
  void set name(String value) native "HTMLSelectElement_name_Setter";


  /** @domName HTMLSelectElement.options */
  HtmlOptionsCollection get options native "HTMLSelectElement_options_Getter";


  /** @domName HTMLSelectElement.required */
  bool get required native "HTMLSelectElement_required_Getter";


  /** @domName HTMLSelectElement.required */
  void set required(bool value) native "HTMLSelectElement_required_Setter";


  /** @domName HTMLSelectElement.selectedIndex */
  int get selectedIndex native "HTMLSelectElement_selectedIndex_Getter";


  /** @domName HTMLSelectElement.selectedIndex */
  void set selectedIndex(int value) native "HTMLSelectElement_selectedIndex_Setter";


  /** @domName HTMLSelectElement.selectedOptions */
  HtmlCollection get selectedOptions native "HTMLSelectElement_selectedOptions_Getter";


  /** @domName HTMLSelectElement.size */
  int get size native "HTMLSelectElement_size_Getter";


  /** @domName HTMLSelectElement.size */
  void set size(int value) native "HTMLSelectElement_size_Setter";


  /** @domName HTMLSelectElement.type */
  String get type native "HTMLSelectElement_type_Getter";


  /** @domName HTMLSelectElement.validationMessage */
  String get validationMessage native "HTMLSelectElement_validationMessage_Getter";


  /** @domName HTMLSelectElement.validity */
  ValidityState get validity native "HTMLSelectElement_validity_Getter";


  /** @domName HTMLSelectElement.value */
  String get value native "HTMLSelectElement_value_Getter";


  /** @domName HTMLSelectElement.value */
  void set value(String value) native "HTMLSelectElement_value_Setter";


  /** @domName HTMLSelectElement.willValidate */
  bool get willValidate native "HTMLSelectElement_willValidate_Getter";


  /** @domName HTMLSelectElement.checkValidity */
  bool checkValidity() native "HTMLSelectElement_checkValidity_Callback";


  /** @domName HTMLSelectElement.item */
  Node item(int index) native "HTMLSelectElement_item_Callback";


  /** @domName HTMLSelectElement.namedItem */
  Node namedItem(String name) native "HTMLSelectElement_namedItem_Callback";


  /** @domName HTMLSelectElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLSelectElement_setCustomValidity_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SessionDescription
class SessionDescription extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory SessionDescription(String sdp) => _SessionDescriptionFactoryProvider.createSessionDescription(sdp);
  SessionDescription.internal();


  /** @domName SessionDescription.addCandidate */
  void addCandidate(IceCandidate candidate) native "SessionDescription_addCandidate_Callback";


  /** @domName SessionDescription.toSdp */
  String toSdp() native "SessionDescription_toSdp_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLShadowElement
class ShadowElement extends _Element_Merged {
  ShadowElement.internal(): super.internal();


  /** @domName HTMLShadowElement.resetStyleInheritance */
  bool get resetStyleInheritance native "HTMLShadowElement_resetStyleInheritance_Getter";


  /** @domName HTMLShadowElement.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "HTMLShadowElement_resetStyleInheritance_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ShadowRoot
class ShadowRoot extends DocumentFragment {

  ///@docsEditable true
  factory ShadowRoot(Element host) => _ShadowRootFactoryProvider.createShadowRoot(host);
  ShadowRoot.internal(): super.internal();


  /** @domName ShadowRoot.activeElement */
  Element get activeElement native "ShadowRoot_activeElement_Getter";


  /** @domName ShadowRoot.applyAuthorStyles */
  bool get applyAuthorStyles native "ShadowRoot_applyAuthorStyles_Getter";


  /** @domName ShadowRoot.applyAuthorStyles */
  void set applyAuthorStyles(bool value) native "ShadowRoot_applyAuthorStyles_Setter";


  /** @domName ShadowRoot.innerHTML */
  String get innerHtml native "ShadowRoot_innerHTML_Getter";


  /** @domName ShadowRoot.innerHTML */
  void set innerHtml(String value) native "ShadowRoot_innerHTML_Setter";


  /** @domName ShadowRoot.resetStyleInheritance */
  bool get resetStyleInheritance native "ShadowRoot_resetStyleInheritance_Getter";


  /** @domName ShadowRoot.resetStyleInheritance */
  void set resetStyleInheritance(bool value) native "ShadowRoot_resetStyleInheritance_Setter";


  /** @domName ShadowRoot.cloneNode */
  Node clone(bool deep) native "ShadowRoot_cloneNode_Callback";


  /** @domName ShadowRoot.getElementById */
  Element $dom_getElementById(String elementId) native "ShadowRoot_getElementById_Callback";


  /** @domName ShadowRoot.getElementsByClassName */
  List<Node> $dom_getElementsByClassName(String className) native "ShadowRoot_getElementsByClassName_Callback";


  /** @domName ShadowRoot.getElementsByTagName */
  List<Node> $dom_getElementsByTagName(String tagName) native "ShadowRoot_getElementsByTagName_Callback";


  /** @domName ShadowRoot.getSelection */
  DomSelection getSelection() native "ShadowRoot_getSelection_Callback";

  static bool get supported => _Utils.shadowRootSupported(window.document);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SharedWorker
class SharedWorker extends AbstractWorker {

  ///@docsEditable true
  factory SharedWorker(String scriptURL, [String name]) {
    if (!?name) {
      return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL);
    }
    return _SharedWorkerFactoryProvider.createSharedWorker(scriptURL, name);
  }
  SharedWorker.internal(): super.internal();


  /** @domName SharedWorker.port */
  MessagePort get port native "SharedWorker_port_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SharedWorkerContext
class SharedWorkerContext extends WorkerContext {
  SharedWorkerContext.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  SharedWorkerContextEvents get on =>
    new SharedWorkerContextEvents(this);


  /** @domName SharedWorkerContext.name */
  String get name native "SharedWorkerContext_name_Getter";

}

/// @docsEditable true
class SharedWorkerContextEvents extends WorkerContextEvents {
  /// @docsEditable true
  SharedWorkerContextEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get connect => this['connect'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SourceBuffer
class SourceBuffer extends NativeFieldWrapperClass1 {
  SourceBuffer.internal();


  /** @domName SourceBuffer.buffered */
  TimeRanges get buffered native "SourceBuffer_buffered_Getter";


  /** @domName SourceBuffer.timestampOffset */
  num get timestampOffset native "SourceBuffer_timestampOffset_Getter";


  /** @domName SourceBuffer.timestampOffset */
  void set timestampOffset(num value) native "SourceBuffer_timestampOffset_Setter";


  /** @domName SourceBuffer.abort */
  void abort() native "SourceBuffer_abort_Callback";


  /** @domName SourceBuffer.append */
  void append(Uint8Array data) native "SourceBuffer_append_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SourceBufferList
class SourceBufferList extends EventTarget implements List<SourceBuffer> {
  SourceBufferList.internal(): super.internal();


  /** @domName SourceBufferList.length */
  int get length native "SourceBufferList_length_Getter";

  SourceBuffer operator[](int index) native "SourceBufferList_item_Callback";

  void operator[]=(int index, SourceBuffer value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SourceBuffer> mixins.
  // SourceBuffer is the element type.

  // From Iterable<SourceBuffer>:

  Iterator<SourceBuffer> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<SourceBuffer>(this);
  }

  // From Collection<SourceBuffer>:

  void add(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SourceBuffer value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SourceBuffer> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SourceBuffer)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(SourceBuffer element) => Collections.contains(this, element);

  void forEach(void f(SourceBuffer element)) => Collections.forEach(this, f);

  Collection map(f(SourceBuffer element)) => Collections.map(this, [], f);

  Collection<SourceBuffer> filter(bool f(SourceBuffer element)) =>
     Collections.filter(this, <SourceBuffer>[], f);

  bool every(bool f(SourceBuffer element)) => Collections.every(this, f);

  bool some(bool f(SourceBuffer element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SourceBuffer>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(SourceBuffer a, SourceBuffer b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SourceBuffer element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SourceBuffer element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SourceBuffer get first => this[0];

  SourceBuffer get last => this[length - 1];

  SourceBuffer removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  SourceBuffer removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SourceBuffer> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SourceBuffer initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SourceBuffer> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <SourceBuffer>[]);

  // -- end List<SourceBuffer> mixins.


  /** @domName SourceBufferList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_addEventListener_Callback";


  /** @domName SourceBufferList.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "SourceBufferList_dispatchEvent_Callback";


  /** @domName SourceBufferList.item */
  SourceBuffer item(int index) native "SourceBufferList_item_Callback";


  /** @domName SourceBufferList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SourceBufferList_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLSourceElement
class SourceElement extends _Element_Merged {

  ///@docsEditable true
  factory SourceElement() => document.$dom_createElement("source");
  SourceElement.internal(): super.internal();


  /** @domName HTMLSourceElement.media */
  String get media native "HTMLSourceElement_media_Getter";


  /** @domName HTMLSourceElement.media */
  void set media(String value) native "HTMLSourceElement_media_Setter";


  /** @domName HTMLSourceElement.src */
  String get src native "HTMLSourceElement_src_Getter";


  /** @domName HTMLSourceElement.src */
  void set src(String value) native "HTMLSourceElement_src_Setter";


  /** @domName HTMLSourceElement.type */
  String get type native "HTMLSourceElement_type_Getter";


  /** @domName HTMLSourceElement.type */
  void set type(String value) native "HTMLSourceElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLSpanElement
class SpanElement extends _Element_Merged {

  ///@docsEditable true
  factory SpanElement() => document.$dom_createElement("span");
  SpanElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechGrammar
class SpeechGrammar extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory SpeechGrammar() => _SpeechGrammarFactoryProvider.createSpeechGrammar();
  SpeechGrammar.internal();


  /** @domName SpeechGrammar.src */
  String get src native "SpeechGrammar_src_Getter";


  /** @domName SpeechGrammar.src */
  void set src(String value) native "SpeechGrammar_src_Setter";


  /** @domName SpeechGrammar.weight */
  num get weight native "SpeechGrammar_weight_Getter";


  /** @domName SpeechGrammar.weight */
  void set weight(num value) native "SpeechGrammar_weight_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechGrammarList
class SpeechGrammarList extends NativeFieldWrapperClass1 implements List<SpeechGrammar> {

  ///@docsEditable true
  factory SpeechGrammarList() => _SpeechGrammarListFactoryProvider.createSpeechGrammarList();
  SpeechGrammarList.internal();


  /** @domName SpeechGrammarList.length */
  int get length native "SpeechGrammarList_length_Getter";

  SpeechGrammar operator[](int index) native "SpeechGrammarList_item_Callback";

  void operator[]=(int index, SpeechGrammar value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechGrammar> mixins.
  // SpeechGrammar is the element type.

  // From Iterable<SpeechGrammar>:

  Iterator<SpeechGrammar> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<SpeechGrammar>(this);
  }

  // From Collection<SpeechGrammar>:

  void add(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechGrammar value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechGrammar> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechGrammar)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(SpeechGrammar element) => Collections.contains(this, element);

  void forEach(void f(SpeechGrammar element)) => Collections.forEach(this, f);

  Collection map(f(SpeechGrammar element)) => Collections.map(this, [], f);

  Collection<SpeechGrammar> filter(bool f(SpeechGrammar element)) =>
     Collections.filter(this, <SpeechGrammar>[], f);

  bool every(bool f(SpeechGrammar element)) => Collections.every(this, f);

  bool some(bool f(SpeechGrammar element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechGrammar>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(SpeechGrammar a, SpeechGrammar b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechGrammar element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechGrammar element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechGrammar get first => this[0];

  SpeechGrammar get last => this[length - 1];

  SpeechGrammar removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  SpeechGrammar removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechGrammar> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechGrammar initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechGrammar> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <SpeechGrammar>[]);

  // -- end List<SpeechGrammar> mixins.

  void addFromString(/*DOMString*/ string, [/*float*/ weight]) {
    if (?weight) {
      _addFromString_1(string, weight);
      return;
    }
    _addFromString_2(string);
  }


  /** @domName SpeechGrammarList.addFromString_1 */
  void _addFromString_1(string, weight) native "SpeechGrammarList_addFromString_1_Callback";


  /** @domName SpeechGrammarList.addFromString_2 */
  void _addFromString_2(string) native "SpeechGrammarList_addFromString_2_Callback";

  void addFromUri(/*DOMString*/ src, [/*float*/ weight]) {
    if (?weight) {
      _addFromUri_1(src, weight);
      return;
    }
    _addFromUri_2(src);
  }


  /** @domName SpeechGrammarList.addFromUri_1 */
  void _addFromUri_1(src, weight) native "SpeechGrammarList_addFromUri_1_Callback";


  /** @domName SpeechGrammarList.addFromUri_2 */
  void _addFromUri_2(src) native "SpeechGrammarList_addFromUri_2_Callback";


  /** @domName SpeechGrammarList.item */
  SpeechGrammar item(int index) native "SpeechGrammarList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechInputEvent
class SpeechInputEvent extends Event {
  SpeechInputEvent.internal(): super.internal();


  /** @domName SpeechInputEvent.results */
  List<SpeechInputResult> get results native "SpeechInputEvent_results_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechInputResult
class SpeechInputResult extends NativeFieldWrapperClass1 {
  SpeechInputResult.internal();


  /** @domName SpeechInputResult.confidence */
  num get confidence native "SpeechInputResult_confidence_Getter";


  /** @domName SpeechInputResult.utterance */
  String get utterance native "SpeechInputResult_utterance_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognition
class SpeechRecognition extends EventTarget {

  ///@docsEditable true
  factory SpeechRecognition() => _SpeechRecognitionFactoryProvider.createSpeechRecognition();
  SpeechRecognition.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  SpeechRecognitionEvents get on =>
    new SpeechRecognitionEvents(this);


  /** @domName SpeechRecognition.continuous */
  bool get continuous native "SpeechRecognition_continuous_Getter";


  /** @domName SpeechRecognition.continuous */
  void set continuous(bool value) native "SpeechRecognition_continuous_Setter";


  /** @domName SpeechRecognition.grammars */
  SpeechGrammarList get grammars native "SpeechRecognition_grammars_Getter";


  /** @domName SpeechRecognition.grammars */
  void set grammars(SpeechGrammarList value) native "SpeechRecognition_grammars_Setter";


  /** @domName SpeechRecognition.interimResults */
  bool get interimResults native "SpeechRecognition_interimResults_Getter";


  /** @domName SpeechRecognition.interimResults */
  void set interimResults(bool value) native "SpeechRecognition_interimResults_Setter";


  /** @domName SpeechRecognition.lang */
  String get lang native "SpeechRecognition_lang_Getter";


  /** @domName SpeechRecognition.lang */
  void set lang(String value) native "SpeechRecognition_lang_Setter";


  /** @domName SpeechRecognition.maxAlternatives */
  int get maxAlternatives native "SpeechRecognition_maxAlternatives_Getter";


  /** @domName SpeechRecognition.maxAlternatives */
  void set maxAlternatives(int value) native "SpeechRecognition_maxAlternatives_Setter";


  /** @domName SpeechRecognition.abort */
  void abort() native "SpeechRecognition_abort_Callback";


  /** @domName SpeechRecognition.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_addEventListener_Callback";


  /** @domName SpeechRecognition.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "SpeechRecognition_dispatchEvent_Callback";


  /** @domName SpeechRecognition.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "SpeechRecognition_removeEventListener_Callback";


  /** @domName SpeechRecognition.start */
  void start() native "SpeechRecognition_start_Callback";


  /** @domName SpeechRecognition.stop */
  void stop() native "SpeechRecognition_stop_Callback";

}

/// @docsEditable true
class SpeechRecognitionEvents extends Events {
  /// @docsEditable true
  SpeechRecognitionEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get audioEnd => this['audioend'];

  /// @docsEditable true
  EventListenerList get audioStart => this['audiostart'];

  /// @docsEditable true
  EventListenerList get end => this['end'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get noMatch => this['nomatch'];

  /// @docsEditable true
  EventListenerList get result => this['result'];

  /// @docsEditable true
  EventListenerList get soundEnd => this['soundend'];

  /// @docsEditable true
  EventListenerList get soundStart => this['soundstart'];

  /// @docsEditable true
  EventListenerList get speechEnd => this['speechend'];

  /// @docsEditable true
  EventListenerList get speechStart => this['speechstart'];

  /// @docsEditable true
  EventListenerList get start => this['start'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognitionAlternative
class SpeechRecognitionAlternative extends NativeFieldWrapperClass1 {
  SpeechRecognitionAlternative.internal();


  /** @domName SpeechRecognitionAlternative.confidence */
  num get confidence native "SpeechRecognitionAlternative_confidence_Getter";


  /** @domName SpeechRecognitionAlternative.transcript */
  String get transcript native "SpeechRecognitionAlternative_transcript_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognitionError
class SpeechRecognitionError extends Event {
  SpeechRecognitionError.internal(): super.internal();

  static const int ABORTED = 2;

  static const int AUDIO_CAPTURE = 3;

  static const int BAD_GRAMMAR = 7;

  static const int LANGUAGE_NOT_SUPPORTED = 8;

  static const int NETWORK = 4;

  static const int NOT_ALLOWED = 5;

  static const int NO_SPEECH = 1;

  static const int OTHER = 0;

  static const int SERVICE_NOT_ALLOWED = 6;


  /** @domName SpeechRecognitionError.code */
  int get code native "SpeechRecognitionError_code_Getter";


  /** @domName SpeechRecognitionError.message */
  String get message native "SpeechRecognitionError_message_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognitionEvent
class SpeechRecognitionEvent extends Event {
  SpeechRecognitionEvent.internal(): super.internal();


  /** @domName SpeechRecognitionEvent.result */
  SpeechRecognitionResult get result native "SpeechRecognitionEvent_result_Getter";


  /** @domName SpeechRecognitionEvent.resultHistory */
  List<SpeechRecognitionResult> get resultHistory native "SpeechRecognitionEvent_resultHistory_Getter";


  /** @domName SpeechRecognitionEvent.resultIndex */
  int get resultIndex native "SpeechRecognitionEvent_resultIndex_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognitionResult
class SpeechRecognitionResult extends NativeFieldWrapperClass1 {
  SpeechRecognitionResult.internal();


  /** @domName SpeechRecognitionResult.emma */
  Document get emma native "SpeechRecognitionResult_emma_Getter";


  /** @domName SpeechRecognitionResult.final */
  bool get finalValue native "SpeechRecognitionResult_final_Getter";


  /** @domName SpeechRecognitionResult.length */
  int get length native "SpeechRecognitionResult_length_Getter";


  /** @domName SpeechRecognitionResult.item */
  SpeechRecognitionAlternative item(int index) native "SpeechRecognitionResult_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLError
class SqlError extends NativeFieldWrapperClass1 {
  SqlError.internal();

  static const int CONSTRAINT_ERR = 6;

  static const int DATABASE_ERR = 1;

  static const int QUOTA_ERR = 4;

  static const int SYNTAX_ERR = 5;

  static const int TIMEOUT_ERR = 7;

  static const int TOO_LARGE_ERR = 3;

  static const int UNKNOWN_ERR = 0;

  static const int VERSION_ERR = 2;


  /** @domName SQLError.code */
  int get code native "SQLError_code_Getter";


  /** @domName SQLError.message */
  String get message native "SQLError_message_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLException
class SqlException extends NativeFieldWrapperClass1 {
  SqlException.internal();

  static const int CONSTRAINT_ERR = 6;

  static const int DATABASE_ERR = 1;

  static const int QUOTA_ERR = 4;

  static const int SYNTAX_ERR = 5;

  static const int TIMEOUT_ERR = 7;

  static const int TOO_LARGE_ERR = 3;

  static const int UNKNOWN_ERR = 0;

  static const int VERSION_ERR = 2;


  /** @domName SQLException.code */
  int get code native "SQLException_code_Getter";


  /** @domName SQLException.message */
  String get message native "SQLException_message_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLResultSet
class SqlResultSet extends NativeFieldWrapperClass1 {
  SqlResultSet.internal();


  /** @domName SQLResultSet.insertId */
  int get insertId native "SQLResultSet_insertId_Getter";


  /** @domName SQLResultSet.rows */
  SqlResultSetRowList get rows native "SQLResultSet_rows_Getter";


  /** @domName SQLResultSet.rowsAffected */
  int get rowsAffected native "SQLResultSet_rowsAffected_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLResultSetRowList
class SqlResultSetRowList extends NativeFieldWrapperClass1 implements List<Map> {
  SqlResultSetRowList.internal();


  /** @domName SQLResultSetRowList.length */
  int get length native "SQLResultSetRowList_length_Getter";

  Map operator[](int index) native "SQLResultSetRowList_item_Callback";

  void operator[]=(int index, Map value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Map> mixins.
  // Map is the element type.

  // From Iterable<Map>:

  Iterator<Map> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Map>(this);
  }

  // From Collection<Map>:

  void add(Map value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Map value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Map> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Map)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Map element) => Collections.contains(this, element);

  void forEach(void f(Map element)) => Collections.forEach(this, f);

  Collection map(f(Map element)) => Collections.map(this, [], f);

  Collection<Map> filter(bool f(Map element)) =>
     Collections.filter(this, <Map>[], f);

  bool every(bool f(Map element)) => Collections.every(this, f);

  bool some(bool f(Map element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Map>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Map a, Map b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Map element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Map element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Map get first => this[0];

  Map get last => this[length - 1];

  Map removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Map removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Map> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Map initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Map> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Map>[]);

  // -- end List<Map> mixins.


  /** @domName SQLResultSetRowList.item */
  Map item(int index) native "SQLResultSetRowList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLTransaction
class SqlTransaction extends NativeFieldWrapperClass1 {
  SqlTransaction.internal();


  /** @domName SQLTransaction.executeSql */
  void executeSql(String sqlStatement, List arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) native "SQLTransaction_executeSql_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SQLTransactionSync
class SqlTransactionSync extends NativeFieldWrapperClass1 {
  SqlTransactionSync.internal();


  /** @domName SQLTransactionSync.executeSql */
  SqlResultSet executeSql(String sqlStatement, List arguments) native "SQLTransactionSync_executeSql_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName Storage
class Storage extends NativeFieldWrapperClass1 implements Map<String, String>  {

  // TODO(nweiz): update this when maps support lazy iteration
  bool containsValue(String value) => values.some((e) => e == value);

  bool containsKey(String key) => $dom_getItem(key) != null;

  String operator [](String key) => $dom_getItem(key);

  void operator []=(String key, String value) { $dom_setItem(key, value); }

  String putIfAbsent(String key, String ifAbsent()) {
    if (!containsKey(key)) this[key] = ifAbsent();
    return this[key];
  }

  String remove(String key) {
    final value = this[key];
    $dom_removeItem(key);
    return value;
  }

  void clear() => $dom_clear();

  void forEach(void f(String key, String value)) {
    for (var i = 0; true; i++) {
      final key = $dom_key(i);
      if (key == null) return;

      f(key, this[key]);
    }
  }

  Collection<String> get keys {
    final keys = [];
    forEach((k, v) => keys.add(k));
    return keys;
  }

  Collection<String> get values {
    final values = [];
    forEach((k, v) => values.add(v));
    return values;
  }

  int get length => $dom_length;

  bool get isEmpty => $dom_key(0) == null;
  Storage.internal();


  /** @domName Storage.length */
  int get $dom_length native "Storage_length_Getter";


  /** @domName Storage.clear */
  void $dom_clear() native "Storage_clear_Callback";


  /** @domName Storage.getItem */
  String $dom_getItem(String key) native "Storage_getItem_Callback";


  /** @domName Storage.key */
  String $dom_key(int index) native "Storage_key_Callback";


  /** @domName Storage.removeItem */
  void $dom_removeItem(String key) native "Storage_removeItem_Callback";


  /** @domName Storage.setItem */
  void $dom_setItem(String key, String data) native "Storage_setItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName StorageEvent
class StorageEvent extends Event {
  StorageEvent.internal(): super.internal();


  /** @domName StorageEvent.key */
  String get key native "StorageEvent_key_Getter";


  /** @domName StorageEvent.newValue */
  String get newValue native "StorageEvent_newValue_Getter";


  /** @domName StorageEvent.oldValue */
  String get oldValue native "StorageEvent_oldValue_Getter";


  /** @domName StorageEvent.storageArea */
  Storage get storageArea native "StorageEvent_storageArea_Getter";


  /** @domName StorageEvent.url */
  String get url native "StorageEvent_url_Getter";


  /** @domName StorageEvent.initStorageEvent */
  void initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) native "StorageEvent_initStorageEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName StorageInfo
class StorageInfo extends NativeFieldWrapperClass1 {
  StorageInfo.internal();

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName StorageInfo.queryUsageAndQuota */
  void queryUsageAndQuota(int storageType, [StorageInfoUsageCallback usageCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_queryUsageAndQuota_Callback";


  /** @domName StorageInfo.requestQuota */
  void requestQuota(int storageType, int newQuotaInBytes, [StorageInfoQuotaCallback quotaCallback, StorageInfoErrorCallback errorCallback]) native "StorageInfo_requestQuota_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void StorageInfoErrorCallback(DomException error);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void StorageInfoQuotaCallback(int grantedQuotaInBytes);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void StorageInfoUsageCallback(int currentUsageInBytes, int currentQuotaInBytes);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void StringCallback(String data);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLStyleElement
class StyleElement extends _Element_Merged {

  ///@docsEditable true
  factory StyleElement() => document.$dom_createElement("style");
  StyleElement.internal(): super.internal();


  /** @domName HTMLStyleElement.disabled */
  bool get disabled native "HTMLStyleElement_disabled_Getter";


  /** @domName HTMLStyleElement.disabled */
  void set disabled(bool value) native "HTMLStyleElement_disabled_Setter";


  /** @domName HTMLStyleElement.media */
  String get media native "HTMLStyleElement_media_Getter";


  /** @domName HTMLStyleElement.media */
  void set media(String value) native "HTMLStyleElement_media_Setter";


  /** @domName HTMLStyleElement.scoped */
  bool get scoped native "HTMLStyleElement_scoped_Getter";


  /** @domName HTMLStyleElement.scoped */
  void set scoped(bool value) native "HTMLStyleElement_scoped_Setter";


  /** @domName HTMLStyleElement.sheet */
  StyleSheet get sheet native "HTMLStyleElement_sheet_Getter";


  /** @domName HTMLStyleElement.type */
  String get type native "HTMLStyleElement_type_Getter";


  /** @domName HTMLStyleElement.type */
  void set type(String value) native "HTMLStyleElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName StyleMedia
class StyleMedia extends NativeFieldWrapperClass1 {
  StyleMedia.internal();


  /** @domName StyleMedia.type */
  String get type native "StyleMedia_type_Getter";


  /** @domName StyleMedia.matchMedium */
  bool matchMedium(String mediaquery) native "StyleMedia_matchMedium_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName StyleSheet
class StyleSheet extends NativeFieldWrapperClass1 {
  StyleSheet.internal();


  /** @domName StyleSheet.disabled */
  bool get disabled native "StyleSheet_disabled_Getter";


  /** @domName StyleSheet.disabled */
  void set disabled(bool value) native "StyleSheet_disabled_Setter";


  /** @domName StyleSheet.href */
  String get href native "StyleSheet_href_Getter";


  /** @domName StyleSheet.media */
  MediaList get media native "StyleSheet_media_Getter";


  /** @domName StyleSheet.ownerNode */
  Node get ownerNode native "StyleSheet_ownerNode_Getter";


  /** @domName StyleSheet.parentStyleSheet */
  StyleSheet get parentStyleSheet native "StyleSheet_parentStyleSheet_Getter";


  /** @domName StyleSheet.title */
  String get title native "StyleSheet_title_Getter";


  /** @domName StyleSheet.type */
  String get type native "StyleSheet_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableCaptionElement
class TableCaptionElement extends _Element_Merged {

  ///@docsEditable true
  factory TableCaptionElement() => document.$dom_createElement("caption");
  TableCaptionElement.internal(): super.internal();


  /** @domName HTMLTableCaptionElement.align */
  String get align native "HTMLTableCaptionElement_align_Getter";


  /** @domName HTMLTableCaptionElement.align */
  void set align(String value) native "HTMLTableCaptionElement_align_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableCellElement
class TableCellElement extends _Element_Merged {

  ///@docsEditable true
  factory TableCellElement() => document.$dom_createElement("td");
  TableCellElement.internal(): super.internal();


  /** @domName HTMLTableCellElement.abbr */
  String get abbr native "HTMLTableCellElement_abbr_Getter";


  /** @domName HTMLTableCellElement.abbr */
  void set abbr(String value) native "HTMLTableCellElement_abbr_Setter";


  /** @domName HTMLTableCellElement.align */
  String get align native "HTMLTableCellElement_align_Getter";


  /** @domName HTMLTableCellElement.align */
  void set align(String value) native "HTMLTableCellElement_align_Setter";


  /** @domName HTMLTableCellElement.axis */
  String get axis native "HTMLTableCellElement_axis_Getter";


  /** @domName HTMLTableCellElement.axis */
  void set axis(String value) native "HTMLTableCellElement_axis_Setter";


  /** @domName HTMLTableCellElement.bgColor */
  String get bgColor native "HTMLTableCellElement_bgColor_Getter";


  /** @domName HTMLTableCellElement.bgColor */
  void set bgColor(String value) native "HTMLTableCellElement_bgColor_Setter";


  /** @domName HTMLTableCellElement.cellIndex */
  int get cellIndex native "HTMLTableCellElement_cellIndex_Getter";


  /** @domName HTMLTableCellElement.ch */
  String get ch native "HTMLTableCellElement_ch_Getter";


  /** @domName HTMLTableCellElement.ch */
  void set ch(String value) native "HTMLTableCellElement_ch_Setter";


  /** @domName HTMLTableCellElement.chOff */
  String get chOff native "HTMLTableCellElement_chOff_Getter";


  /** @domName HTMLTableCellElement.chOff */
  void set chOff(String value) native "HTMLTableCellElement_chOff_Setter";


  /** @domName HTMLTableCellElement.colSpan */
  int get colSpan native "HTMLTableCellElement_colSpan_Getter";


  /** @domName HTMLTableCellElement.colSpan */
  void set colSpan(int value) native "HTMLTableCellElement_colSpan_Setter";


  /** @domName HTMLTableCellElement.headers */
  String get headers native "HTMLTableCellElement_headers_Getter";


  /** @domName HTMLTableCellElement.headers */
  void set headers(String value) native "HTMLTableCellElement_headers_Setter";


  /** @domName HTMLTableCellElement.height */
  String get height native "HTMLTableCellElement_height_Getter";


  /** @domName HTMLTableCellElement.height */
  void set height(String value) native "HTMLTableCellElement_height_Setter";


  /** @domName HTMLTableCellElement.noWrap */
  bool get noWrap native "HTMLTableCellElement_noWrap_Getter";


  /** @domName HTMLTableCellElement.noWrap */
  void set noWrap(bool value) native "HTMLTableCellElement_noWrap_Setter";


  /** @domName HTMLTableCellElement.rowSpan */
  int get rowSpan native "HTMLTableCellElement_rowSpan_Getter";


  /** @domName HTMLTableCellElement.rowSpan */
  void set rowSpan(int value) native "HTMLTableCellElement_rowSpan_Setter";


  /** @domName HTMLTableCellElement.scope */
  String get scope native "HTMLTableCellElement_scope_Getter";


  /** @domName HTMLTableCellElement.scope */
  void set scope(String value) native "HTMLTableCellElement_scope_Setter";


  /** @domName HTMLTableCellElement.vAlign */
  String get vAlign native "HTMLTableCellElement_vAlign_Getter";


  /** @domName HTMLTableCellElement.vAlign */
  void set vAlign(String value) native "HTMLTableCellElement_vAlign_Setter";


  /** @domName HTMLTableCellElement.width */
  String get width native "HTMLTableCellElement_width_Getter";


  /** @domName HTMLTableCellElement.width */
  void set width(String value) native "HTMLTableCellElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableColElement
class TableColElement extends _Element_Merged {

  ///@docsEditable true
  factory TableColElement() => document.$dom_createElement("col");
  TableColElement.internal(): super.internal();


  /** @domName HTMLTableColElement.align */
  String get align native "HTMLTableColElement_align_Getter";


  /** @domName HTMLTableColElement.align */
  void set align(String value) native "HTMLTableColElement_align_Setter";


  /** @domName HTMLTableColElement.ch */
  String get ch native "HTMLTableColElement_ch_Getter";


  /** @domName HTMLTableColElement.ch */
  void set ch(String value) native "HTMLTableColElement_ch_Setter";


  /** @domName HTMLTableColElement.chOff */
  String get chOff native "HTMLTableColElement_chOff_Getter";


  /** @domName HTMLTableColElement.chOff */
  void set chOff(String value) native "HTMLTableColElement_chOff_Setter";


  /** @domName HTMLTableColElement.span */
  int get span native "HTMLTableColElement_span_Getter";


  /** @domName HTMLTableColElement.span */
  void set span(int value) native "HTMLTableColElement_span_Setter";


  /** @domName HTMLTableColElement.vAlign */
  String get vAlign native "HTMLTableColElement_vAlign_Getter";


  /** @domName HTMLTableColElement.vAlign */
  void set vAlign(String value) native "HTMLTableColElement_vAlign_Setter";


  /** @domName HTMLTableColElement.width */
  String get width native "HTMLTableColElement_width_Getter";


  /** @domName HTMLTableColElement.width */
  void set width(String value) native "HTMLTableColElement_width_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableElement
class TableElement extends _Element_Merged {

  ///@docsEditable true
  factory TableElement() => document.$dom_createElement("table");
  TableElement.internal(): super.internal();


  /** @domName HTMLTableElement.align */
  String get align native "HTMLTableElement_align_Getter";


  /** @domName HTMLTableElement.align */
  void set align(String value) native "HTMLTableElement_align_Setter";


  /** @domName HTMLTableElement.bgColor */
  String get bgColor native "HTMLTableElement_bgColor_Getter";


  /** @domName HTMLTableElement.bgColor */
  void set bgColor(String value) native "HTMLTableElement_bgColor_Setter";


  /** @domName HTMLTableElement.border */
  String get border native "HTMLTableElement_border_Getter";


  /** @domName HTMLTableElement.border */
  void set border(String value) native "HTMLTableElement_border_Setter";


  /** @domName HTMLTableElement.caption */
  TableCaptionElement get caption native "HTMLTableElement_caption_Getter";


  /** @domName HTMLTableElement.caption */
  void set caption(TableCaptionElement value) native "HTMLTableElement_caption_Setter";


  /** @domName HTMLTableElement.cellPadding */
  String get cellPadding native "HTMLTableElement_cellPadding_Getter";


  /** @domName HTMLTableElement.cellPadding */
  void set cellPadding(String value) native "HTMLTableElement_cellPadding_Setter";


  /** @domName HTMLTableElement.cellSpacing */
  String get cellSpacing native "HTMLTableElement_cellSpacing_Getter";


  /** @domName HTMLTableElement.cellSpacing */
  void set cellSpacing(String value) native "HTMLTableElement_cellSpacing_Setter";


  /** @domName HTMLTableElement.frame */
  String get frame native "HTMLTableElement_frame_Getter";


  /** @domName HTMLTableElement.frame */
  void set frame(String value) native "HTMLTableElement_frame_Setter";


  /** @domName HTMLTableElement.rows */
  HtmlCollection get rows native "HTMLTableElement_rows_Getter";


  /** @domName HTMLTableElement.rules */
  String get rules native "HTMLTableElement_rules_Getter";


  /** @domName HTMLTableElement.rules */
  void set rules(String value) native "HTMLTableElement_rules_Setter";


  /** @domName HTMLTableElement.summary */
  String get summary native "HTMLTableElement_summary_Getter";


  /** @domName HTMLTableElement.summary */
  void set summary(String value) native "HTMLTableElement_summary_Setter";


  /** @domName HTMLTableElement.tBodies */
  HtmlCollection get tBodies native "HTMLTableElement_tBodies_Getter";


  /** @domName HTMLTableElement.tFoot */
  TableSectionElement get tFoot native "HTMLTableElement_tFoot_Getter";


  /** @domName HTMLTableElement.tFoot */
  void set tFoot(TableSectionElement value) native "HTMLTableElement_tFoot_Setter";


  /** @domName HTMLTableElement.tHead */
  TableSectionElement get tHead native "HTMLTableElement_tHead_Getter";


  /** @domName HTMLTableElement.tHead */
  void set tHead(TableSectionElement value) native "HTMLTableElement_tHead_Setter";


  /** @domName HTMLTableElement.width */
  String get width native "HTMLTableElement_width_Getter";


  /** @domName HTMLTableElement.width */
  void set width(String value) native "HTMLTableElement_width_Setter";


  /** @domName HTMLTableElement.createCaption */
  Element createCaption() native "HTMLTableElement_createCaption_Callback";


  /** @domName HTMLTableElement.createTBody */
  Element createTBody() native "HTMLTableElement_createTBody_Callback";


  /** @domName HTMLTableElement.createTFoot */
  Element createTFoot() native "HTMLTableElement_createTFoot_Callback";


  /** @domName HTMLTableElement.createTHead */
  Element createTHead() native "HTMLTableElement_createTHead_Callback";


  /** @domName HTMLTableElement.deleteCaption */
  void deleteCaption() native "HTMLTableElement_deleteCaption_Callback";


  /** @domName HTMLTableElement.deleteRow */
  void deleteRow(int index) native "HTMLTableElement_deleteRow_Callback";


  /** @domName HTMLTableElement.deleteTFoot */
  void deleteTFoot() native "HTMLTableElement_deleteTFoot_Callback";


  /** @domName HTMLTableElement.deleteTHead */
  void deleteTHead() native "HTMLTableElement_deleteTHead_Callback";


  /** @domName HTMLTableElement.insertRow */
  Element insertRow(int index) native "HTMLTableElement_insertRow_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableRowElement
class TableRowElement extends _Element_Merged {

  ///@docsEditable true
  factory TableRowElement() => document.$dom_createElement("tr");
  TableRowElement.internal(): super.internal();


  /** @domName HTMLTableRowElement.align */
  String get align native "HTMLTableRowElement_align_Getter";


  /** @domName HTMLTableRowElement.align */
  void set align(String value) native "HTMLTableRowElement_align_Setter";


  /** @domName HTMLTableRowElement.bgColor */
  String get bgColor native "HTMLTableRowElement_bgColor_Getter";


  /** @domName HTMLTableRowElement.bgColor */
  void set bgColor(String value) native "HTMLTableRowElement_bgColor_Setter";


  /** @domName HTMLTableRowElement.cells */
  HtmlCollection get cells native "HTMLTableRowElement_cells_Getter";


  /** @domName HTMLTableRowElement.ch */
  String get ch native "HTMLTableRowElement_ch_Getter";


  /** @domName HTMLTableRowElement.ch */
  void set ch(String value) native "HTMLTableRowElement_ch_Setter";


  /** @domName HTMLTableRowElement.chOff */
  String get chOff native "HTMLTableRowElement_chOff_Getter";


  /** @domName HTMLTableRowElement.chOff */
  void set chOff(String value) native "HTMLTableRowElement_chOff_Setter";


  /** @domName HTMLTableRowElement.rowIndex */
  int get rowIndex native "HTMLTableRowElement_rowIndex_Getter";


  /** @domName HTMLTableRowElement.sectionRowIndex */
  int get sectionRowIndex native "HTMLTableRowElement_sectionRowIndex_Getter";


  /** @domName HTMLTableRowElement.vAlign */
  String get vAlign native "HTMLTableRowElement_vAlign_Getter";


  /** @domName HTMLTableRowElement.vAlign */
  void set vAlign(String value) native "HTMLTableRowElement_vAlign_Setter";


  /** @domName HTMLTableRowElement.deleteCell */
  void deleteCell(int index) native "HTMLTableRowElement_deleteCell_Callback";


  /** @domName HTMLTableRowElement.insertCell */
  Element insertCell(int index) native "HTMLTableRowElement_insertCell_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTableSectionElement
class TableSectionElement extends _Element_Merged {
  TableSectionElement.internal(): super.internal();


  /** @domName HTMLTableSectionElement.align */
  String get align native "HTMLTableSectionElement_align_Getter";


  /** @domName HTMLTableSectionElement.align */
  void set align(String value) native "HTMLTableSectionElement_align_Setter";


  /** @domName HTMLTableSectionElement.ch */
  String get ch native "HTMLTableSectionElement_ch_Getter";


  /** @domName HTMLTableSectionElement.ch */
  void set ch(String value) native "HTMLTableSectionElement_ch_Setter";


  /** @domName HTMLTableSectionElement.chOff */
  String get chOff native "HTMLTableSectionElement_chOff_Getter";


  /** @domName HTMLTableSectionElement.chOff */
  void set chOff(String value) native "HTMLTableSectionElement_chOff_Setter";


  /** @domName HTMLTableSectionElement.rows */
  HtmlCollection get rows native "HTMLTableSectionElement_rows_Getter";


  /** @domName HTMLTableSectionElement.vAlign */
  String get vAlign native "HTMLTableSectionElement_vAlign_Getter";


  /** @domName HTMLTableSectionElement.vAlign */
  void set vAlign(String value) native "HTMLTableSectionElement_vAlign_Setter";


  /** @domName HTMLTableSectionElement.deleteRow */
  void deleteRow(int index) native "HTMLTableSectionElement_deleteRow_Callback";


  /** @domName HTMLTableSectionElement.insertRow */
  Element insertRow(int index) native "HTMLTableSectionElement_insertRow_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Text
class Text extends CharacterData {
  factory Text(String data) => _TextFactoryProvider.createText(data);
  Text.internal(): super.internal();


  /** @domName Text.wholeText */
  String get wholeText native "Text_wholeText_Getter";


  /** @domName Text.replaceWholeText */
  Text replaceWholeText(String content) native "Text_replaceWholeText_Callback";


  /** @domName Text.splitText */
  Text splitText(int offset) native "Text_splitText_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTextAreaElement
class TextAreaElement extends _Element_Merged {

  ///@docsEditable true
  factory TextAreaElement() => document.$dom_createElement("textarea");
  TextAreaElement.internal(): super.internal();


  /** @domName HTMLTextAreaElement.autofocus */
  bool get autofocus native "HTMLTextAreaElement_autofocus_Getter";


  /** @domName HTMLTextAreaElement.autofocus */
  void set autofocus(bool value) native "HTMLTextAreaElement_autofocus_Setter";


  /** @domName HTMLTextAreaElement.cols */
  int get cols native "HTMLTextAreaElement_cols_Getter";


  /** @domName HTMLTextAreaElement.cols */
  void set cols(int value) native "HTMLTextAreaElement_cols_Setter";


  /** @domName HTMLTextAreaElement.defaultValue */
  String get defaultValue native "HTMLTextAreaElement_defaultValue_Getter";


  /** @domName HTMLTextAreaElement.defaultValue */
  void set defaultValue(String value) native "HTMLTextAreaElement_defaultValue_Setter";


  /** @domName HTMLTextAreaElement.dirName */
  String get dirName native "HTMLTextAreaElement_dirName_Getter";


  /** @domName HTMLTextAreaElement.dirName */
  void set dirName(String value) native "HTMLTextAreaElement_dirName_Setter";


  /** @domName HTMLTextAreaElement.disabled */
  bool get disabled native "HTMLTextAreaElement_disabled_Getter";


  /** @domName HTMLTextAreaElement.disabled */
  void set disabled(bool value) native "HTMLTextAreaElement_disabled_Setter";


  /** @domName HTMLTextAreaElement.form */
  FormElement get form native "HTMLTextAreaElement_form_Getter";


  /** @domName HTMLTextAreaElement.labels */
  List<Node> get labels native "HTMLTextAreaElement_labels_Getter";


  /** @domName HTMLTextAreaElement.maxLength */
  int get maxLength native "HTMLTextAreaElement_maxLength_Getter";


  /** @domName HTMLTextAreaElement.maxLength */
  void set maxLength(int value) native "HTMLTextAreaElement_maxLength_Setter";


  /** @domName HTMLTextAreaElement.name */
  String get name native "HTMLTextAreaElement_name_Getter";


  /** @domName HTMLTextAreaElement.name */
  void set name(String value) native "HTMLTextAreaElement_name_Setter";


  /** @domName HTMLTextAreaElement.placeholder */
  String get placeholder native "HTMLTextAreaElement_placeholder_Getter";


  /** @domName HTMLTextAreaElement.placeholder */
  void set placeholder(String value) native "HTMLTextAreaElement_placeholder_Setter";


  /** @domName HTMLTextAreaElement.readOnly */
  bool get readOnly native "HTMLTextAreaElement_readOnly_Getter";


  /** @domName HTMLTextAreaElement.readOnly */
  void set readOnly(bool value) native "HTMLTextAreaElement_readOnly_Setter";


  /** @domName HTMLTextAreaElement.required */
  bool get required native "HTMLTextAreaElement_required_Getter";


  /** @domName HTMLTextAreaElement.required */
  void set required(bool value) native "HTMLTextAreaElement_required_Setter";


  /** @domName HTMLTextAreaElement.rows */
  int get rows native "HTMLTextAreaElement_rows_Getter";


  /** @domName HTMLTextAreaElement.rows */
  void set rows(int value) native "HTMLTextAreaElement_rows_Setter";


  /** @domName HTMLTextAreaElement.selectionDirection */
  String get selectionDirection native "HTMLTextAreaElement_selectionDirection_Getter";


  /** @domName HTMLTextAreaElement.selectionDirection */
  void set selectionDirection(String value) native "HTMLTextAreaElement_selectionDirection_Setter";


  /** @domName HTMLTextAreaElement.selectionEnd */
  int get selectionEnd native "HTMLTextAreaElement_selectionEnd_Getter";


  /** @domName HTMLTextAreaElement.selectionEnd */
  void set selectionEnd(int value) native "HTMLTextAreaElement_selectionEnd_Setter";


  /** @domName HTMLTextAreaElement.selectionStart */
  int get selectionStart native "HTMLTextAreaElement_selectionStart_Getter";


  /** @domName HTMLTextAreaElement.selectionStart */
  void set selectionStart(int value) native "HTMLTextAreaElement_selectionStart_Setter";


  /** @domName HTMLTextAreaElement.textLength */
  int get textLength native "HTMLTextAreaElement_textLength_Getter";


  /** @domName HTMLTextAreaElement.type */
  String get type native "HTMLTextAreaElement_type_Getter";


  /** @domName HTMLTextAreaElement.validationMessage */
  String get validationMessage native "HTMLTextAreaElement_validationMessage_Getter";


  /** @domName HTMLTextAreaElement.validity */
  ValidityState get validity native "HTMLTextAreaElement_validity_Getter";


  /** @domName HTMLTextAreaElement.value */
  String get value native "HTMLTextAreaElement_value_Getter";


  /** @domName HTMLTextAreaElement.value */
  void set value(String value) native "HTMLTextAreaElement_value_Setter";


  /** @domName HTMLTextAreaElement.willValidate */
  bool get willValidate native "HTMLTextAreaElement_willValidate_Getter";


  /** @domName HTMLTextAreaElement.wrap */
  String get wrap native "HTMLTextAreaElement_wrap_Getter";


  /** @domName HTMLTextAreaElement.wrap */
  void set wrap(String value) native "HTMLTextAreaElement_wrap_Setter";


  /** @domName HTMLTextAreaElement.checkValidity */
  bool checkValidity() native "HTMLTextAreaElement_checkValidity_Callback";


  /** @domName HTMLTextAreaElement.select */
  void select() native "HTMLTextAreaElement_select_Callback";


  /** @domName HTMLTextAreaElement.setCustomValidity */
  void setCustomValidity(String error) native "HTMLTextAreaElement_setCustomValidity_Callback";

  void setRangeText(/*DOMString*/ replacement, [/*unsigned long*/ start, /*unsigned long*/ end, /*DOMString*/ selectionMode]) {
    if ((replacement is String || replacement == null) && !?start && !?end && !?selectionMode) {
      _setRangeText_1(replacement);
      return;
    }
    if ((replacement is String || replacement == null) && (start is int || start == null) && (end is int || end == null) && (selectionMode is String || selectionMode == null)) {
      _setRangeText_2(replacement, start, end, selectionMode);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName HTMLTextAreaElement.setRangeText_1 */
  void _setRangeText_1(replacement) native "HTMLTextAreaElement_setRangeText_1_Callback";


  /** @domName HTMLTextAreaElement.setRangeText_2 */
  void _setRangeText_2(replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_2_Callback";

  void setSelectionRange(/*long*/ start, /*long*/ end, [/*DOMString*/ direction]) {
    if (?direction) {
      _setSelectionRange_1(start, end, direction);
      return;
    }
    _setSelectionRange_2(start, end);
  }


  /** @domName HTMLTextAreaElement.setSelectionRange_1 */
  void _setSelectionRange_1(start, end, direction) native "HTMLTextAreaElement_setSelectionRange_1_Callback";


  /** @domName HTMLTextAreaElement.setSelectionRange_2 */
  void _setSelectionRange_2(start, end) native "HTMLTextAreaElement_setSelectionRange_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextEvent
class TextEvent extends UIEvent {
  TextEvent.internal(): super.internal();


  /** @domName TextEvent.data */
  String get data native "TextEvent_data_Getter";


  /** @domName TextEvent.initTextEvent */
  void initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, LocalWindow viewArg, String dataArg) native "TextEvent_initTextEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextMetrics
class TextMetrics extends NativeFieldWrapperClass1 {
  TextMetrics.internal();


  /** @domName TextMetrics.width */
  num get width native "TextMetrics_width_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextTrack
class TextTrack extends EventTarget {
  TextTrack.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  TextTrackEvents get on =>
    new TextTrackEvents(this);


  /** @domName TextTrack.activeCues */
  TextTrackCueList get activeCues native "TextTrack_activeCues_Getter";


  /** @domName TextTrack.cues */
  TextTrackCueList get cues native "TextTrack_cues_Getter";


  /** @domName TextTrack.kind */
  String get kind native "TextTrack_kind_Getter";


  /** @domName TextTrack.label */
  String get label native "TextTrack_label_Getter";


  /** @domName TextTrack.language */
  String get language native "TextTrack_language_Getter";


  /** @domName TextTrack.mode */
  String get mode native "TextTrack_mode_Getter";


  /** @domName TextTrack.mode */
  void set mode(String value) native "TextTrack_mode_Setter";


  /** @domName TextTrack.addCue */
  void addCue(TextTrackCue cue) native "TextTrack_addCue_Callback";


  /** @domName TextTrack.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_addEventListener_Callback";


  /** @domName TextTrack.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrack_dispatchEvent_Callback";


  /** @domName TextTrack.removeCue */
  void removeCue(TextTrackCue cue) native "TextTrack_removeCue_Callback";


  /** @domName TextTrack.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrack_removeEventListener_Callback";

}

/// @docsEditable true
class TextTrackEvents extends Events {
  /// @docsEditable true
  TextTrackEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get cueChange => this['cuechange'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextTrackCue
class TextTrackCue extends EventTarget {

  ///@docsEditable true
  factory TextTrackCue(num startTime, num endTime, String text) => _TextTrackCueFactoryProvider.createTextTrackCue(startTime, endTime, text);
  TextTrackCue.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  TextTrackCueEvents get on =>
    new TextTrackCueEvents(this);


  /** @domName TextTrackCue.align */
  String get align native "TextTrackCue_align_Getter";


  /** @domName TextTrackCue.align */
  void set align(String value) native "TextTrackCue_align_Setter";


  /** @domName TextTrackCue.endTime */
  num get endTime native "TextTrackCue_endTime_Getter";


  /** @domName TextTrackCue.endTime */
  void set endTime(num value) native "TextTrackCue_endTime_Setter";


  /** @domName TextTrackCue.id */
  String get id native "TextTrackCue_id_Getter";


  /** @domName TextTrackCue.id */
  void set id(String value) native "TextTrackCue_id_Setter";


  /** @domName TextTrackCue.line */
  int get line native "TextTrackCue_line_Getter";


  /** @domName TextTrackCue.line */
  void set line(int value) native "TextTrackCue_line_Setter";


  /** @domName TextTrackCue.pauseOnExit */
  bool get pauseOnExit native "TextTrackCue_pauseOnExit_Getter";


  /** @domName TextTrackCue.pauseOnExit */
  void set pauseOnExit(bool value) native "TextTrackCue_pauseOnExit_Setter";


  /** @domName TextTrackCue.position */
  int get position native "TextTrackCue_position_Getter";


  /** @domName TextTrackCue.position */
  void set position(int value) native "TextTrackCue_position_Setter";


  /** @domName TextTrackCue.size */
  int get size native "TextTrackCue_size_Getter";


  /** @domName TextTrackCue.size */
  void set size(int value) native "TextTrackCue_size_Setter";


  /** @domName TextTrackCue.snapToLines */
  bool get snapToLines native "TextTrackCue_snapToLines_Getter";


  /** @domName TextTrackCue.snapToLines */
  void set snapToLines(bool value) native "TextTrackCue_snapToLines_Setter";


  /** @domName TextTrackCue.startTime */
  num get startTime native "TextTrackCue_startTime_Getter";


  /** @domName TextTrackCue.startTime */
  void set startTime(num value) native "TextTrackCue_startTime_Setter";


  /** @domName TextTrackCue.text */
  String get text native "TextTrackCue_text_Getter";


  /** @domName TextTrackCue.text */
  void set text(String value) native "TextTrackCue_text_Setter";


  /** @domName TextTrackCue.track */
  TextTrack get track native "TextTrackCue_track_Getter";


  /** @domName TextTrackCue.vertical */
  String get vertical native "TextTrackCue_vertical_Getter";


  /** @domName TextTrackCue.vertical */
  void set vertical(String value) native "TextTrackCue_vertical_Setter";


  /** @domName TextTrackCue.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_addEventListener_Callback";


  /** @domName TextTrackCue.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrackCue_dispatchEvent_Callback";


  /** @domName TextTrackCue.getCueAsHTML */
  DocumentFragment getCueAsHtml() native "TextTrackCue_getCueAsHTML_Callback";


  /** @domName TextTrackCue.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackCue_removeEventListener_Callback";

}

/// @docsEditable true
class TextTrackCueEvents extends Events {
  /// @docsEditable true
  TextTrackCueEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get enter => this['enter'];

  /// @docsEditable true
  EventListenerList get exit => this['exit'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextTrackCueList
class TextTrackCueList extends NativeFieldWrapperClass1 implements List<TextTrackCue> {
  TextTrackCueList.internal();


  /** @domName TextTrackCueList.length */
  int get length native "TextTrackCueList_length_Getter";

  TextTrackCue operator[](int index) native "TextTrackCueList_item_Callback";

  void operator[]=(int index, TextTrackCue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrackCue> mixins.
  // TextTrackCue is the element type.

  // From Iterable<TextTrackCue>:

  Iterator<TextTrackCue> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<TextTrackCue>(this);
  }

  // From Collection<TextTrackCue>:

  void add(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrackCue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<TextTrackCue> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrackCue)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(TextTrackCue element) => Collections.contains(this, element);

  void forEach(void f(TextTrackCue element)) => Collections.forEach(this, f);

  Collection map(f(TextTrackCue element)) => Collections.map(this, [], f);

  Collection<TextTrackCue> filter(bool f(TextTrackCue element)) =>
     Collections.filter(this, <TextTrackCue>[], f);

  bool every(bool f(TextTrackCue element)) => Collections.every(this, f);

  bool some(bool f(TextTrackCue element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<TextTrackCue>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(TextTrackCue a, TextTrackCue b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrackCue element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrackCue element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  TextTrackCue get first => this[0];

  TextTrackCue get last => this[length - 1];

  TextTrackCue removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  TextTrackCue removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrackCue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrackCue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrackCue> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <TextTrackCue>[]);

  // -- end List<TextTrackCue> mixins.


  /** @domName TextTrackCueList.getCueById */
  TextTrackCue getCueById(String id) native "TextTrackCueList_getCueById_Callback";


  /** @domName TextTrackCueList.item */
  TextTrackCue item(int index) native "TextTrackCueList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TextTrackList
class TextTrackList extends EventTarget implements List<TextTrack> {
  TextTrackList.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  TextTrackListEvents get on =>
    new TextTrackListEvents(this);


  /** @domName TextTrackList.length */
  int get length native "TextTrackList_length_Getter";

  TextTrack operator[](int index) native "TextTrackList_item_Callback";

  void operator[]=(int index, TextTrack value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<TextTrack> mixins.
  // TextTrack is the element type.

  // From Iterable<TextTrack>:

  Iterator<TextTrack> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<TextTrack>(this);
  }

  // From Collection<TextTrack>:

  void add(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(TextTrack value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<TextTrack> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, TextTrack)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(TextTrack element) => Collections.contains(this, element);

  void forEach(void f(TextTrack element)) => Collections.forEach(this, f);

  Collection map(f(TextTrack element)) => Collections.map(this, [], f);

  Collection<TextTrack> filter(bool f(TextTrack element)) =>
     Collections.filter(this, <TextTrack>[], f);

  bool every(bool f(TextTrack element)) => Collections.every(this, f);

  bool some(bool f(TextTrack element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<TextTrack>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(TextTrack a, TextTrack b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(TextTrack element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(TextTrack element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  TextTrack get first => this[0];

  TextTrack get last => this[length - 1];

  TextTrack removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  TextTrack removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<TextTrack> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [TextTrack initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<TextTrack> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <TextTrack>[]);

  // -- end List<TextTrack> mixins.


  /** @domName TextTrackList.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_addEventListener_Callback";


  /** @domName TextTrackList.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "TextTrackList_dispatchEvent_Callback";


  /** @domName TextTrackList.item */
  TextTrack item(int index) native "TextTrackList_item_Callback";


  /** @domName TextTrackList.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "TextTrackList_removeEventListener_Callback";

}

/// @docsEditable true
class TextTrackListEvents extends Events {
  /// @docsEditable true
  TextTrackListEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get addTrack => this['addtrack'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TimeRanges
class TimeRanges extends NativeFieldWrapperClass1 {
  TimeRanges.internal();


  /** @domName TimeRanges.length */
  int get length native "TimeRanges_length_Getter";


  /** @domName TimeRanges.end */
  num end(int index) native "TimeRanges_end_Callback";


  /** @domName TimeRanges.start */
  num start(int index) native "TimeRanges_start_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void TimeoutHandler();
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTitleElement
class TitleElement extends _Element_Merged {

  ///@docsEditable true
  factory TitleElement() => document.$dom_createElement("title");
  TitleElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Touch
class Touch extends NativeFieldWrapperClass1 {
  Touch.internal();


  /** @domName Touch.clientX */
  int get clientX native "Touch_clientX_Getter";


  /** @domName Touch.clientY */
  int get clientY native "Touch_clientY_Getter";


  /** @domName Touch.identifier */
  int get identifier native "Touch_identifier_Getter";


  /** @domName Touch.pageX */
  int get pageX native "Touch_pageX_Getter";


  /** @domName Touch.pageY */
  int get pageY native "Touch_pageY_Getter";


  /** @domName Touch.screenX */
  int get screenX native "Touch_screenX_Getter";


  /** @domName Touch.screenY */
  int get screenY native "Touch_screenY_Getter";


  /** @domName Touch.target */
  EventTarget get target native "Touch_target_Getter";


  /** @domName Touch.webkitForce */
  num get webkitForce native "Touch_webkitForce_Getter";


  /** @domName Touch.webkitRadiusX */
  int get webkitRadiusX native "Touch_webkitRadiusX_Getter";


  /** @domName Touch.webkitRadiusY */
  int get webkitRadiusY native "Touch_webkitRadiusY_Getter";


  /** @domName Touch.webkitRotationAngle */
  num get webkitRotationAngle native "Touch_webkitRotationAngle_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TouchEvent
class TouchEvent extends UIEvent {
  TouchEvent.internal(): super.internal();


  /** @domName TouchEvent.altKey */
  bool get altKey native "TouchEvent_altKey_Getter";


  /** @domName TouchEvent.changedTouches */
  TouchList get changedTouches native "TouchEvent_changedTouches_Getter";


  /** @domName TouchEvent.ctrlKey */
  bool get ctrlKey native "TouchEvent_ctrlKey_Getter";


  /** @domName TouchEvent.metaKey */
  bool get metaKey native "TouchEvent_metaKey_Getter";


  /** @domName TouchEvent.shiftKey */
  bool get shiftKey native "TouchEvent_shiftKey_Getter";


  /** @domName TouchEvent.targetTouches */
  TouchList get targetTouches native "TouchEvent_targetTouches_Getter";


  /** @domName TouchEvent.touches */
  TouchList get touches native "TouchEvent_touches_Getter";


  /** @domName TouchEvent.initTouchEvent */
  void initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "TouchEvent_initTouchEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TouchList
class TouchList extends NativeFieldWrapperClass1 implements List<Touch> {
  TouchList.internal();


  /** @domName TouchList.length */
  int get length native "TouchList_length_Getter";

  Touch operator[](int index) native "TouchList_item_Callback";

  void operator[]=(int index, Touch value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Touch> mixins.
  // Touch is the element type.

  // From Iterable<Touch>:

  Iterator<Touch> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Touch>(this);
  }

  // From Collection<Touch>:

  void add(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Touch value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Touch> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Touch)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Touch element) => Collections.contains(this, element);

  void forEach(void f(Touch element)) => Collections.forEach(this, f);

  Collection map(f(Touch element)) => Collections.map(this, [], f);

  Collection<Touch> filter(bool f(Touch element)) =>
     Collections.filter(this, <Touch>[], f);

  bool every(bool f(Touch element)) => Collections.every(this, f);

  bool some(bool f(Touch element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Touch>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Touch a, Touch b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Touch element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Touch element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Touch get first => this[0];

  Touch get last => this[length - 1];

  Touch removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Touch removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Touch> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Touch initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Touch> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Touch>[]);

  // -- end List<Touch> mixins.


  /** @domName TouchList.item */
  Touch item(int index) native "TouchList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLTrackElement
class TrackElement extends _Element_Merged {

  ///@docsEditable true
  factory TrackElement() => document.$dom_createElement("track");
  TrackElement.internal(): super.internal();

  static const int ERROR = 3;

  static const int LOADED = 2;

  static const int LOADING = 1;

  static const int NONE = 0;


  /** @domName HTMLTrackElement.default */
  bool get defaultValue native "HTMLTrackElement_default_Getter";


  /** @domName HTMLTrackElement.default */
  void set defaultValue(bool value) native "HTMLTrackElement_default_Setter";


  /** @domName HTMLTrackElement.kind */
  String get kind native "HTMLTrackElement_kind_Getter";


  /** @domName HTMLTrackElement.kind */
  void set kind(String value) native "HTMLTrackElement_kind_Setter";


  /** @domName HTMLTrackElement.label */
  String get label native "HTMLTrackElement_label_Getter";


  /** @domName HTMLTrackElement.label */
  void set label(String value) native "HTMLTrackElement_label_Setter";


  /** @domName HTMLTrackElement.readyState */
  int get readyState native "HTMLTrackElement_readyState_Getter";


  /** @domName HTMLTrackElement.src */
  String get src native "HTMLTrackElement_src_Getter";


  /** @domName HTMLTrackElement.src */
  void set src(String value) native "HTMLTrackElement_src_Setter";


  /** @domName HTMLTrackElement.srclang */
  String get srclang native "HTMLTrackElement_srclang_Getter";


  /** @domName HTMLTrackElement.srclang */
  void set srclang(String value) native "HTMLTrackElement_srclang_Setter";


  /** @domName HTMLTrackElement.track */
  TextTrack get track native "HTMLTrackElement_track_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TrackEvent
class TrackEvent extends Event {
  TrackEvent.internal(): super.internal();


  /** @domName TrackEvent.track */
  Object get track native "TrackEvent_track_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitTransitionEvent
class TransitionEvent extends Event {
  TransitionEvent.internal(): super.internal();


  /** @domName WebKitTransitionEvent.elapsedTime */
  num get elapsedTime native "WebKitTransitionEvent_elapsedTime_Getter";


  /** @domName WebKitTransitionEvent.propertyName */
  String get propertyName native "WebKitTransitionEvent_propertyName_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName TreeWalker
class TreeWalker extends NativeFieldWrapperClass1 {
  TreeWalker.internal();


  /** @domName TreeWalker.currentNode */
  Node get currentNode native "TreeWalker_currentNode_Getter";


  /** @domName TreeWalker.currentNode */
  void set currentNode(Node value) native "TreeWalker_currentNode_Setter";


  /** @domName TreeWalker.expandEntityReferences */
  bool get expandEntityReferences native "TreeWalker_expandEntityReferences_Getter";


  /** @domName TreeWalker.filter */
  NodeFilter get filter native "TreeWalker_filter_Getter";


  /** @domName TreeWalker.root */
  Node get root native "TreeWalker_root_Getter";


  /** @domName TreeWalker.whatToShow */
  int get whatToShow native "TreeWalker_whatToShow_Getter";


  /** @domName TreeWalker.firstChild */
  Node firstChild() native "TreeWalker_firstChild_Callback";


  /** @domName TreeWalker.lastChild */
  Node lastChild() native "TreeWalker_lastChild_Callback";


  /** @domName TreeWalker.nextNode */
  Node nextNode() native "TreeWalker_nextNode_Callback";


  /** @domName TreeWalker.nextSibling */
  Node nextSibling() native "TreeWalker_nextSibling_Callback";


  /** @domName TreeWalker.parentNode */
  Node parentNode() native "TreeWalker_parentNode_Callback";


  /** @domName TreeWalker.previousNode */
  Node previousNode() native "TreeWalker_previousNode_Callback";


  /** @domName TreeWalker.previousSibling */
  Node previousSibling() native "TreeWalker_previousSibling_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName UIEvent; @docsEditable true
class UIEvent extends Event {
  // In JS, canBubble and cancelable are technically required parameters to
  // init*Event. In practice, though, if they aren't provided they simply
  // default to false (since that's Boolean(undefined)).
  //
  // Contrary to JS, we default canBubble and cancelable to true, since that's
  // what people want most of the time anyway.
  factory UIEvent(String type, Window view, int detail,
      [bool canBubble = true, bool cancelable = true]) {
    final e = document.$dom_createEvent("UIEvent");
    e.$dom_initUIEvent(type, canBubble, cancelable, view, detail);
    return e;
  }
  UIEvent.internal(): super.internal();


  /** @domName UIEvent.charCode */
  int get $dom_charCode native "UIEvent_charCode_Getter";


  /** @domName UIEvent.detail */
  int get detail native "UIEvent_detail_Getter";


  /** @domName UIEvent.keyCode */
  int get $dom_keyCode native "UIEvent_keyCode_Getter";


  /** @domName UIEvent.layerX */
  int get layerX native "UIEvent_layerX_Getter";


  /** @domName UIEvent.layerY */
  int get layerY native "UIEvent_layerY_Getter";


  /** @domName UIEvent.pageX */
  int get pageX native "UIEvent_pageX_Getter";


  /** @domName UIEvent.pageY */
  int get pageY native "UIEvent_pageY_Getter";


  /** @domName UIEvent.view */
  Window get view native "UIEvent_view_Getter";


  /** @domName UIEvent.which */
  int get which native "UIEvent_which_Getter";


  /** @domName UIEvent.initUIEvent */
  void $dom_initUIEvent(String type, bool canBubble, bool cancelable, LocalWindow view, int detail) native "UIEvent_initUIEvent_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLUListElement
class UListElement extends _Element_Merged {

  ///@docsEditable true
  factory UListElement() => document.$dom_createElement("ul");
  UListElement.internal(): super.internal();


  /** @domName HTMLUListElement.compact */
  bool get compact native "HTMLUListElement_compact_Getter";


  /** @domName HTMLUListElement.compact */
  void set compact(bool value) native "HTMLUListElement_compact_Setter";


  /** @domName HTMLUListElement.type */
  String get type native "HTMLUListElement_type_Getter";


  /** @domName HTMLUListElement.type */
  void set type(String value) native "HTMLUListElement_type_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Uint16Array
class Uint16Array extends ArrayBufferView implements List<int> {

  factory Uint16Array(int length) =>
    _TypedArrayFactoryProvider.createUint16Array(length);

  factory Uint16Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint16Array_fromList(list);

  factory Uint16Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint16Array_fromBuffer(buffer, byteOffset, length);
  Uint16Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 2;


  /** @domName Uint16Array.length */
  int get length native "Uint16Array_length_Getter";


  /** @domName Uint16Array.numericIndexGetter */
  int operator[](int index) native "Uint16Array_numericIndexGetter_Callback";


  /** @domName Uint16Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint16Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint16Array.setElements */
  void setElements(Object array, [int offset]) native "Uint16Array_setElements_Callback";

  Uint16Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint16Array.subarray_1 */
  Uint16Array _subarray_1(start, end) native "Uint16Array_subarray_1_Callback";


  /** @domName Uint16Array.subarray_2 */
  Uint16Array _subarray_2(start) native "Uint16Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Uint32Array
class Uint32Array extends ArrayBufferView implements List<int> {

  factory Uint32Array(int length) =>
    _TypedArrayFactoryProvider.createUint32Array(length);

  factory Uint32Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint32Array_fromList(list);

  factory Uint32Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint32Array_fromBuffer(buffer, byteOffset, length);
  Uint32Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 4;


  /** @domName Uint32Array.length */
  int get length native "Uint32Array_length_Getter";


  /** @domName Uint32Array.numericIndexGetter */
  int operator[](int index) native "Uint32Array_numericIndexGetter_Callback";


  /** @domName Uint32Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint32Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint32Array.setElements */
  void setElements(Object array, [int offset]) native "Uint32Array_setElements_Callback";

  Uint32Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint32Array.subarray_1 */
  Uint32Array _subarray_1(start, end) native "Uint32Array_subarray_1_Callback";


  /** @domName Uint32Array.subarray_2 */
  Uint32Array _subarray_2(start) native "Uint32Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Uint8Array
class Uint8Array extends ArrayBufferView implements List<int> {

  factory Uint8Array(int length) =>
    _TypedArrayFactoryProvider.createUint8Array(length);

  factory Uint8Array.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8Array_fromList(list);

  factory Uint8Array.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8Array_fromBuffer(buffer, byteOffset, length);
  Uint8Array.internal(): super.internal();

  static const int BYTES_PER_ELEMENT = 1;


  /** @domName Uint8Array.length */
  int get length native "Uint8Array_length_Getter";


  /** @domName Uint8Array.numericIndexGetter */
  int operator[](int index) native "Uint8Array_numericIndexGetter_Callback";


  /** @domName Uint8Array.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint8Array_numericIndexSetter_Callback";
  // -- start List<int> mixins.
  // int is the element type.

  // From Iterable<int>:

  Iterator<int> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<int>(this);
  }

  // From Collection<int>:

  void add(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(int value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<int> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, int)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(int element) => Collections.contains(this, element);

  void forEach(void f(int element)) => Collections.forEach(this, f);

  Collection map(f(int element)) => Collections.map(this, [], f);

  Collection<int> filter(bool f(int element)) =>
     Collections.filter(this, <int>[], f);

  bool every(bool f(int element)) => Collections.every(this, f);

  bool some(bool f(int element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<int>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(int a, int b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(int element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(int element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  int get first => this[0];

  int get last => this[length - 1];

  int removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  int removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<int> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [int initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<int> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <int>[]);

  // -- end List<int> mixins.


  /** @domName Uint8Array.setElements */
  void setElements(Object array, [int offset]) native "Uint8Array_setElements_Callback";

  Uint8Array subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint8Array.subarray_1 */
  Uint8Array _subarray_1(start, end) native "Uint8Array_subarray_1_Callback";


  /** @domName Uint8Array.subarray_2 */
  Uint8Array _subarray_2(start) native "Uint8Array_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Uint8ClampedArray
class Uint8ClampedArray extends Uint8Array {

  factory Uint8ClampedArray(int length) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray(length);

  factory Uint8ClampedArray.fromList(List<int> list) =>
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromList(list);

  factory Uint8ClampedArray.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => 
    _TypedArrayFactoryProvider.createUint8ClampedArray_fromBuffer(buffer, byteOffset, length);
  Uint8ClampedArray.internal(): super.internal();


  /** @domName Uint8ClampedArray.length */
  int get length native "Uint8ClampedArray_length_Getter";


  /** @domName Uint8ClampedArray.numericIndexGetter */
  int operator[](int index) native "Uint8ClampedArray_numericIndexGetter_Callback";


  /** @domName Uint8ClampedArray.numericIndexSetter */
  void operator[]=(int index, int value) native "Uint8ClampedArray_numericIndexSetter_Callback";


  /** @domName Uint8ClampedArray.setElements */
  void setElements(Object array, [int offset]) native "Uint8ClampedArray_setElements_Callback";

  Uint8ClampedArray subarray(/*long*/ start, [/*long*/ end]) {
    if (?end) {
      return _subarray_1(start, end);
    }
    return _subarray_2(start);
  }


  /** @domName Uint8ClampedArray.subarray_1 */
  Uint8ClampedArray _subarray_1(start, end) native "Uint8ClampedArray_subarray_1_Callback";


  /** @domName Uint8ClampedArray.subarray_2 */
  Uint8ClampedArray _subarray_2(start) native "Uint8ClampedArray_subarray_2_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLUnknownElement
class UnknownElement extends _Element_Merged {
  UnknownElement.internal(): super.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName URL
class Url extends NativeFieldWrapperClass1 {
  Url.internal();

  static String createObjectUrl(blob_OR_source_OR_stream) {
    if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_1(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_2(blob_OR_source_OR_stream);
    }
    if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
      return _createObjectURL_3(blob_OR_source_OR_stream);
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName DOMURL.createObjectURL_1 */
  static String _createObjectURL_1(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_1_Callback";


  /** @domName DOMURL.createObjectURL_2 */
  static String _createObjectURL_2(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_2_Callback";


  /** @domName DOMURL.createObjectURL_3 */
  static String _createObjectURL_3(blob_OR_source_OR_stream) native "DOMURL_createObjectURL_3_Callback";


  /** @domName DOMURL.revokeObjectURL */
  static void revokeObjectUrl(String url) native "DOMURL_revokeObjectURL_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ValidityState
class ValidityState extends NativeFieldWrapperClass1 {
  ValidityState.internal();


  /** @domName ValidityState.customError */
  bool get customError native "ValidityState_customError_Getter";


  /** @domName ValidityState.patternMismatch */
  bool get patternMismatch native "ValidityState_patternMismatch_Getter";


  /** @domName ValidityState.rangeOverflow */
  bool get rangeOverflow native "ValidityState_rangeOverflow_Getter";


  /** @domName ValidityState.rangeUnderflow */
  bool get rangeUnderflow native "ValidityState_rangeUnderflow_Getter";


  /** @domName ValidityState.stepMismatch */
  bool get stepMismatch native "ValidityState_stepMismatch_Getter";


  /** @domName ValidityState.tooLong */
  bool get tooLong native "ValidityState_tooLong_Getter";


  /** @domName ValidityState.typeMismatch */
  bool get typeMismatch native "ValidityState_typeMismatch_Getter";


  /** @domName ValidityState.valid */
  bool get valid native "ValidityState_valid_Getter";


  /** @domName ValidityState.valueMissing */
  bool get valueMissing native "ValidityState_valueMissing_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLVideoElement
class VideoElement extends MediaElement {

  ///@docsEditable true
  factory VideoElement() => document.$dom_createElement("video");
  VideoElement.internal(): super.internal();


  /** @domName HTMLVideoElement.height */
  int get height native "HTMLVideoElement_height_Getter";


  /** @domName HTMLVideoElement.height */
  void set height(int value) native "HTMLVideoElement_height_Setter";


  /** @domName HTMLVideoElement.poster */
  String get poster native "HTMLVideoElement_poster_Getter";


  /** @domName HTMLVideoElement.poster */
  void set poster(String value) native "HTMLVideoElement_poster_Setter";


  /** @domName HTMLVideoElement.videoHeight */
  int get videoHeight native "HTMLVideoElement_videoHeight_Getter";


  /** @domName HTMLVideoElement.videoWidth */
  int get videoWidth native "HTMLVideoElement_videoWidth_Getter";


  /** @domName HTMLVideoElement.webkitDecodedFrameCount */
  int get webkitDecodedFrameCount native "HTMLVideoElement_webkitDecodedFrameCount_Getter";


  /** @domName HTMLVideoElement.webkitDisplayingFullscreen */
  bool get webkitDisplayingFullscreen native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";


  /** @domName HTMLVideoElement.webkitDroppedFrameCount */
  int get webkitDroppedFrameCount native "HTMLVideoElement_webkitDroppedFrameCount_Getter";


  /** @domName HTMLVideoElement.webkitSupportsFullscreen */
  bool get webkitSupportsFullscreen native "HTMLVideoElement_webkitSupportsFullscreen_Getter";


  /** @domName HTMLVideoElement.width */
  int get width native "HTMLVideoElement_width_Getter";


  /** @domName HTMLVideoElement.width */
  void set width(int value) native "HTMLVideoElement_width_Setter";


  /** @domName HTMLVideoElement.webkitEnterFullScreen */
  void webkitEnterFullScreen() native "HTMLVideoElement_webkitEnterFullScreen_Callback";


  /** @domName HTMLVideoElement.webkitEnterFullscreen */
  void webkitEnterFullscreen() native "HTMLVideoElement_webkitEnterFullscreen_Callback";


  /** @domName HTMLVideoElement.webkitExitFullScreen */
  void webkitExitFullScreen() native "HTMLVideoElement_webkitExitFullScreen_Callback";


  /** @domName HTMLVideoElement.webkitExitFullscreen */
  void webkitExitFullscreen() native "HTMLVideoElement_webkitExitFullscreen_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


typedef void VoidCallback();
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLActiveInfo
class WebGLActiveInfo extends NativeFieldWrapperClass1 {
  WebGLActiveInfo.internal();


  /** @domName WebGLActiveInfo.name */
  String get name native "WebGLActiveInfo_name_Getter";


  /** @domName WebGLActiveInfo.size */
  int get size native "WebGLActiveInfo_size_Getter";


  /** @domName WebGLActiveInfo.type */
  int get type native "WebGLActiveInfo_type_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLBuffer
class WebGLBuffer extends NativeFieldWrapperClass1 {
  WebGLBuffer.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLCompressedTextureS3TC
class WebGLCompressedTextureS3TC extends NativeFieldWrapperClass1 {
  WebGLCompressedTextureS3TC.internal();

  static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;

  static const int COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;

  static const int COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;

  static const int COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLContextAttributes
class WebGLContextAttributes extends NativeFieldWrapperClass1 {
  WebGLContextAttributes.internal();


  /** @domName WebGLContextAttributes.alpha */
  bool get alpha native "WebGLContextAttributes_alpha_Getter";


  /** @domName WebGLContextAttributes.alpha */
  void set alpha(bool value) native "WebGLContextAttributes_alpha_Setter";


  /** @domName WebGLContextAttributes.antialias */
  bool get antialias native "WebGLContextAttributes_antialias_Getter";


  /** @domName WebGLContextAttributes.antialias */
  void set antialias(bool value) native "WebGLContextAttributes_antialias_Setter";


  /** @domName WebGLContextAttributes.depth */
  bool get depth native "WebGLContextAttributes_depth_Getter";


  /** @domName WebGLContextAttributes.depth */
  void set depth(bool value) native "WebGLContextAttributes_depth_Setter";


  /** @domName WebGLContextAttributes.premultipliedAlpha */
  bool get premultipliedAlpha native "WebGLContextAttributes_premultipliedAlpha_Getter";


  /** @domName WebGLContextAttributes.premultipliedAlpha */
  void set premultipliedAlpha(bool value) native "WebGLContextAttributes_premultipliedAlpha_Setter";


  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
  bool get preserveDrawingBuffer native "WebGLContextAttributes_preserveDrawingBuffer_Getter";


  /** @domName WebGLContextAttributes.preserveDrawingBuffer */
  void set preserveDrawingBuffer(bool value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";


  /** @domName WebGLContextAttributes.stencil */
  bool get stencil native "WebGLContextAttributes_stencil_Getter";


  /** @domName WebGLContextAttributes.stencil */
  void set stencil(bool value) native "WebGLContextAttributes_stencil_Setter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLContextEvent
class WebGLContextEvent extends Event {
  WebGLContextEvent.internal(): super.internal();


  /** @domName WebGLContextEvent.statusMessage */
  String get statusMessage native "WebGLContextEvent_statusMessage_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLDebugRendererInfo
class WebGLDebugRendererInfo extends NativeFieldWrapperClass1 {
  WebGLDebugRendererInfo.internal();

  static const int UNMASKED_RENDERER_WEBGL = 0x9246;

  static const int UNMASKED_VENDOR_WEBGL = 0x9245;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLDebugShaders
class WebGLDebugShaders extends NativeFieldWrapperClass1 {
  WebGLDebugShaders.internal();


  /** @domName WebGLDebugShaders.getTranslatedShaderSource */
  String getTranslatedShaderSource(WebGLShader shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLDepthTexture
class WebGLDepthTexture extends NativeFieldWrapperClass1 {
  WebGLDepthTexture.internal();

  static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLFramebuffer
class WebGLFramebuffer extends NativeFieldWrapperClass1 {
  WebGLFramebuffer.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLLoseContext
class WebGLLoseContext extends NativeFieldWrapperClass1 {
  WebGLLoseContext.internal();


  /** @domName WebGLLoseContext.loseContext */
  void loseContext() native "WebGLLoseContext_loseContext_Callback";


  /** @domName WebGLLoseContext.restoreContext */
  void restoreContext() native "WebGLLoseContext_restoreContext_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLProgram
class WebGLProgram extends NativeFieldWrapperClass1 {
  WebGLProgram.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLRenderbuffer
class WebGLRenderbuffer extends NativeFieldWrapperClass1 {
  WebGLRenderbuffer.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLRenderingContext
class WebGLRenderingContext extends CanvasRenderingContext {
  WebGLRenderingContext.internal(): super.internal();

  static const int ACTIVE_ATTRIBUTES = 0x8B89;

  static const int ACTIVE_TEXTURE = 0x84E0;

  static const int ACTIVE_UNIFORMS = 0x8B86;

  static const int ALIASED_LINE_WIDTH_RANGE = 0x846E;

  static const int ALIASED_POINT_SIZE_RANGE = 0x846D;

  static const int ALPHA = 0x1906;

  static const int ALPHA_BITS = 0x0D55;

  static const int ALWAYS = 0x0207;

  static const int ARRAY_BUFFER = 0x8892;

  static const int ARRAY_BUFFER_BINDING = 0x8894;

  static const int ATTACHED_SHADERS = 0x8B85;

  static const int BACK = 0x0405;

  static const int BLEND = 0x0BE2;

  static const int BLEND_COLOR = 0x8005;

  static const int BLEND_DST_ALPHA = 0x80CA;

  static const int BLEND_DST_RGB = 0x80C8;

  static const int BLEND_EQUATION = 0x8009;

  static const int BLEND_EQUATION_ALPHA = 0x883D;

  static const int BLEND_EQUATION_RGB = 0x8009;

  static const int BLEND_SRC_ALPHA = 0x80CB;

  static const int BLEND_SRC_RGB = 0x80C9;

  static const int BLUE_BITS = 0x0D54;

  static const int BOOL = 0x8B56;

  static const int BOOL_VEC2 = 0x8B57;

  static const int BOOL_VEC3 = 0x8B58;

  static const int BOOL_VEC4 = 0x8B59;

  static const int BROWSER_DEFAULT_WEBGL = 0x9244;

  static const int BUFFER_SIZE = 0x8764;

  static const int BUFFER_USAGE = 0x8765;

  static const int BYTE = 0x1400;

  static const int CCW = 0x0901;

  static const int CLAMP_TO_EDGE = 0x812F;

  static const int COLOR_ATTACHMENT0 = 0x8CE0;

  static const int COLOR_BUFFER_BIT = 0x00004000;

  static const int COLOR_CLEAR_VALUE = 0x0C22;

  static const int COLOR_WRITEMASK = 0x0C23;

  static const int COMPILE_STATUS = 0x8B81;

  static const int COMPRESSED_TEXTURE_FORMATS = 0x86A3;

  static const int CONSTANT_ALPHA = 0x8003;

  static const int CONSTANT_COLOR = 0x8001;

  static const int CONTEXT_LOST_WEBGL = 0x9242;

  static const int CULL_FACE = 0x0B44;

  static const int CULL_FACE_MODE = 0x0B45;

  static const int CURRENT_PROGRAM = 0x8B8D;

  static const int CURRENT_VERTEX_ATTRIB = 0x8626;

  static const int CW = 0x0900;

  static const int DECR = 0x1E03;

  static const int DECR_WRAP = 0x8508;

  static const int DELETE_STATUS = 0x8B80;

  static const int DEPTH_ATTACHMENT = 0x8D00;

  static const int DEPTH_BITS = 0x0D56;

  static const int DEPTH_BUFFER_BIT = 0x00000100;

  static const int DEPTH_CLEAR_VALUE = 0x0B73;

  static const int DEPTH_COMPONENT = 0x1902;

  static const int DEPTH_COMPONENT16 = 0x81A5;

  static const int DEPTH_FUNC = 0x0B74;

  static const int DEPTH_RANGE = 0x0B70;

  static const int DEPTH_STENCIL = 0x84F9;

  static const int DEPTH_STENCIL_ATTACHMENT = 0x821A;

  static const int DEPTH_TEST = 0x0B71;

  static const int DEPTH_WRITEMASK = 0x0B72;

  static const int DITHER = 0x0BD0;

  static const int DONT_CARE = 0x1100;

  static const int DST_ALPHA = 0x0304;

  static const int DST_COLOR = 0x0306;

  static const int DYNAMIC_DRAW = 0x88E8;

  static const int ELEMENT_ARRAY_BUFFER = 0x8893;

  static const int ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;

  static const int EQUAL = 0x0202;

  static const int FASTEST = 0x1101;

  static const int FLOAT = 0x1406;

  static const int FLOAT_MAT2 = 0x8B5A;

  static const int FLOAT_MAT3 = 0x8B5B;

  static const int FLOAT_MAT4 = 0x8B5C;

  static const int FLOAT_VEC2 = 0x8B50;

  static const int FLOAT_VEC3 = 0x8B51;

  static const int FLOAT_VEC4 = 0x8B52;

  static const int FRAGMENT_SHADER = 0x8B30;

  static const int FRAMEBUFFER = 0x8D40;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;

  static const int FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;

  static const int FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;

  static const int FRAMEBUFFER_BINDING = 0x8CA6;

  static const int FRAMEBUFFER_COMPLETE = 0x8CD5;

  static const int FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;

  static const int FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;

  static const int FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;

  static const int FRAMEBUFFER_UNSUPPORTED = 0x8CDD;

  static const int FRONT = 0x0404;

  static const int FRONT_AND_BACK = 0x0408;

  static const int FRONT_FACE = 0x0B46;

  static const int FUNC_ADD = 0x8006;

  static const int FUNC_REVERSE_SUBTRACT = 0x800B;

  static const int FUNC_SUBTRACT = 0x800A;

  static const int GENERATE_MIPMAP_HINT = 0x8192;

  static const int GEQUAL = 0x0206;

  static const int GREATER = 0x0204;

  static const int GREEN_BITS = 0x0D53;

  static const int HIGH_FLOAT = 0x8DF2;

  static const int HIGH_INT = 0x8DF5;

  static const int INCR = 0x1E02;

  static const int INCR_WRAP = 0x8507;

  static const int INT = 0x1404;

  static const int INT_VEC2 = 0x8B53;

  static const int INT_VEC3 = 0x8B54;

  static const int INT_VEC4 = 0x8B55;

  static const int INVALID_ENUM = 0x0500;

  static const int INVALID_FRAMEBUFFER_OPERATION = 0x0506;

  static const int INVALID_OPERATION = 0x0502;

  static const int INVALID_VALUE = 0x0501;

  static const int INVERT = 0x150A;

  static const int KEEP = 0x1E00;

  static const int LEQUAL = 0x0203;

  static const int LESS = 0x0201;

  static const int LINEAR = 0x2601;

  static const int LINEAR_MIPMAP_LINEAR = 0x2703;

  static const int LINEAR_MIPMAP_NEAREST = 0x2701;

  static const int LINES = 0x0001;

  static const int LINE_LOOP = 0x0002;

  static const int LINE_STRIP = 0x0003;

  static const int LINE_WIDTH = 0x0B21;

  static const int LINK_STATUS = 0x8B82;

  static const int LOW_FLOAT = 0x8DF0;

  static const int LOW_INT = 0x8DF3;

  static const int LUMINANCE = 0x1909;

  static const int LUMINANCE_ALPHA = 0x190A;

  static const int MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;

  static const int MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;

  static const int MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;

  static const int MAX_RENDERBUFFER_SIZE = 0x84E8;

  static const int MAX_TEXTURE_IMAGE_UNITS = 0x8872;

  static const int MAX_TEXTURE_SIZE = 0x0D33;

  static const int MAX_VARYING_VECTORS = 0x8DFC;

  static const int MAX_VERTEX_ATTRIBS = 0x8869;

  static const int MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;

  static const int MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;

  static const int MAX_VIEWPORT_DIMS = 0x0D3A;

  static const int MEDIUM_FLOAT = 0x8DF1;

  static const int MEDIUM_INT = 0x8DF4;

  static const int MIRRORED_REPEAT = 0x8370;

  static const int NEAREST = 0x2600;

  static const int NEAREST_MIPMAP_LINEAR = 0x2702;

  static const int NEAREST_MIPMAP_NEAREST = 0x2700;

  static const int NEVER = 0x0200;

  static const int NICEST = 0x1102;

  static const int NONE = 0;

  static const int NOTEQUAL = 0x0205;

  static const int NO_ERROR = 0;

  static const int ONE = 1;

  static const int ONE_MINUS_CONSTANT_ALPHA = 0x8004;

  static const int ONE_MINUS_CONSTANT_COLOR = 0x8002;

  static const int ONE_MINUS_DST_ALPHA = 0x0305;

  static const int ONE_MINUS_DST_COLOR = 0x0307;

  static const int ONE_MINUS_SRC_ALPHA = 0x0303;

  static const int ONE_MINUS_SRC_COLOR = 0x0301;

  static const int OUT_OF_MEMORY = 0x0505;

  static const int PACK_ALIGNMENT = 0x0D05;

  static const int POINTS = 0x0000;

  static const int POLYGON_OFFSET_FACTOR = 0x8038;

  static const int POLYGON_OFFSET_FILL = 0x8037;

  static const int POLYGON_OFFSET_UNITS = 0x2A00;

  static const int RED_BITS = 0x0D52;

  static const int RENDERBUFFER = 0x8D41;

  static const int RENDERBUFFER_ALPHA_SIZE = 0x8D53;

  static const int RENDERBUFFER_BINDING = 0x8CA7;

  static const int RENDERBUFFER_BLUE_SIZE = 0x8D52;

  static const int RENDERBUFFER_DEPTH_SIZE = 0x8D54;

  static const int RENDERBUFFER_GREEN_SIZE = 0x8D51;

  static const int RENDERBUFFER_HEIGHT = 0x8D43;

  static const int RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;

  static const int RENDERBUFFER_RED_SIZE = 0x8D50;

  static const int RENDERBUFFER_STENCIL_SIZE = 0x8D55;

  static const int RENDERBUFFER_WIDTH = 0x8D42;

  static const int RENDERER = 0x1F01;

  static const int REPEAT = 0x2901;

  static const int REPLACE = 0x1E01;

  static const int RGB = 0x1907;

  static const int RGB565 = 0x8D62;

  static const int RGB5_A1 = 0x8057;

  static const int RGBA = 0x1908;

  static const int RGBA4 = 0x8056;

  static const int SAMPLER_2D = 0x8B5E;

  static const int SAMPLER_CUBE = 0x8B60;

  static const int SAMPLES = 0x80A9;

  static const int SAMPLE_ALPHA_TO_COVERAGE = 0x809E;

  static const int SAMPLE_BUFFERS = 0x80A8;

  static const int SAMPLE_COVERAGE = 0x80A0;

  static const int SAMPLE_COVERAGE_INVERT = 0x80AB;

  static const int SAMPLE_COVERAGE_VALUE = 0x80AA;

  static const int SCISSOR_BOX = 0x0C10;

  static const int SCISSOR_TEST = 0x0C11;

  static const int SHADER_TYPE = 0x8B4F;

  static const int SHADING_LANGUAGE_VERSION = 0x8B8C;

  static const int SHORT = 0x1402;

  static const int SRC_ALPHA = 0x0302;

  static const int SRC_ALPHA_SATURATE = 0x0308;

  static const int SRC_COLOR = 0x0300;

  static const int STATIC_DRAW = 0x88E4;

  static const int STENCIL_ATTACHMENT = 0x8D20;

  static const int STENCIL_BACK_FAIL = 0x8801;

  static const int STENCIL_BACK_FUNC = 0x8800;

  static const int STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;

  static const int STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;

  static const int STENCIL_BACK_REF = 0x8CA3;

  static const int STENCIL_BACK_VALUE_MASK = 0x8CA4;

  static const int STENCIL_BACK_WRITEMASK = 0x8CA5;

  static const int STENCIL_BITS = 0x0D57;

  static const int STENCIL_BUFFER_BIT = 0x00000400;

  static const int STENCIL_CLEAR_VALUE = 0x0B91;

  static const int STENCIL_FAIL = 0x0B94;

  static const int STENCIL_FUNC = 0x0B92;

  static const int STENCIL_INDEX = 0x1901;

  static const int STENCIL_INDEX8 = 0x8D48;

  static const int STENCIL_PASS_DEPTH_FAIL = 0x0B95;

  static const int STENCIL_PASS_DEPTH_PASS = 0x0B96;

  static const int STENCIL_REF = 0x0B97;

  static const int STENCIL_TEST = 0x0B90;

  static const int STENCIL_VALUE_MASK = 0x0B93;

  static const int STENCIL_WRITEMASK = 0x0B98;

  static const int STREAM_DRAW = 0x88E0;

  static const int SUBPIXEL_BITS = 0x0D50;

  static const int TEXTURE = 0x1702;

  static const int TEXTURE0 = 0x84C0;

  static const int TEXTURE1 = 0x84C1;

  static const int TEXTURE10 = 0x84CA;

  static const int TEXTURE11 = 0x84CB;

  static const int TEXTURE12 = 0x84CC;

  static const int TEXTURE13 = 0x84CD;

  static const int TEXTURE14 = 0x84CE;

  static const int TEXTURE15 = 0x84CF;

  static const int TEXTURE16 = 0x84D0;

  static const int TEXTURE17 = 0x84D1;

  static const int TEXTURE18 = 0x84D2;

  static const int TEXTURE19 = 0x84D3;

  static const int TEXTURE2 = 0x84C2;

  static const int TEXTURE20 = 0x84D4;

  static const int TEXTURE21 = 0x84D5;

  static const int TEXTURE22 = 0x84D6;

  static const int TEXTURE23 = 0x84D7;

  static const int TEXTURE24 = 0x84D8;

  static const int TEXTURE25 = 0x84D9;

  static const int TEXTURE26 = 0x84DA;

  static const int TEXTURE27 = 0x84DB;

  static const int TEXTURE28 = 0x84DC;

  static const int TEXTURE29 = 0x84DD;

  static const int TEXTURE3 = 0x84C3;

  static const int TEXTURE30 = 0x84DE;

  static const int TEXTURE31 = 0x84DF;

  static const int TEXTURE4 = 0x84C4;

  static const int TEXTURE5 = 0x84C5;

  static const int TEXTURE6 = 0x84C6;

  static const int TEXTURE7 = 0x84C7;

  static const int TEXTURE8 = 0x84C8;

  static const int TEXTURE9 = 0x84C9;

  static const int TEXTURE_2D = 0x0DE1;

  static const int TEXTURE_BINDING_2D = 0x8069;

  static const int TEXTURE_BINDING_CUBE_MAP = 0x8514;

  static const int TEXTURE_CUBE_MAP = 0x8513;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;

  static const int TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;

  static const int TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;

  static const int TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;

  static const int TEXTURE_MAG_FILTER = 0x2800;

  static const int TEXTURE_MIN_FILTER = 0x2801;

  static const int TEXTURE_WRAP_S = 0x2802;

  static const int TEXTURE_WRAP_T = 0x2803;

  static const int TRIANGLES = 0x0004;

  static const int TRIANGLE_FAN = 0x0006;

  static const int TRIANGLE_STRIP = 0x0005;

  static const int UNPACK_ALIGNMENT = 0x0CF5;

  static const int UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;

  static const int UNPACK_FLIP_Y_WEBGL = 0x9240;

  static const int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;

  static const int UNSIGNED_BYTE = 0x1401;

  static const int UNSIGNED_INT = 0x1405;

  static const int UNSIGNED_SHORT = 0x1403;

  static const int UNSIGNED_SHORT_4_4_4_4 = 0x8033;

  static const int UNSIGNED_SHORT_5_5_5_1 = 0x8034;

  static const int UNSIGNED_SHORT_5_6_5 = 0x8363;

  static const int VALIDATE_STATUS = 0x8B83;

  static const int VENDOR = 0x1F00;

  static const int VERSION = 0x1F02;

  static const int VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;

  static const int VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;

  static const int VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;

  static const int VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;

  static const int VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;

  static const int VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;

  static const int VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;

  static const int VERTEX_SHADER = 0x8B31;

  static const int VIEWPORT = 0x0BA2;

  static const int ZERO = 0;


  /** @domName WebGLRenderingContext.drawingBufferHeight */
  int get drawingBufferHeight native "WebGLRenderingContext_drawingBufferHeight_Getter";


  /** @domName WebGLRenderingContext.drawingBufferWidth */
  int get drawingBufferWidth native "WebGLRenderingContext_drawingBufferWidth_Getter";


  /** @domName WebGLRenderingContext.activeTexture */
  void activeTexture(int texture) native "WebGLRenderingContext_activeTexture_Callback";


  /** @domName WebGLRenderingContext.attachShader */
  void attachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_attachShader_Callback";


  /** @domName WebGLRenderingContext.bindAttribLocation */
  void bindAttribLocation(WebGLProgram program, int index, String name) native "WebGLRenderingContext_bindAttribLocation_Callback";


  /** @domName WebGLRenderingContext.bindBuffer */
  void bindBuffer(int target, WebGLBuffer buffer) native "WebGLRenderingContext_bindBuffer_Callback";


  /** @domName WebGLRenderingContext.bindFramebuffer */
  void bindFramebuffer(int target, WebGLFramebuffer framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback";


  /** @domName WebGLRenderingContext.bindRenderbuffer */
  void bindRenderbuffer(int target, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.bindTexture */
  void bindTexture(int target, WebGLTexture texture) native "WebGLRenderingContext_bindTexture_Callback";


  /** @domName WebGLRenderingContext.blendColor */
  void blendColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_blendColor_Callback";


  /** @domName WebGLRenderingContext.blendEquation */
  void blendEquation(int mode) native "WebGLRenderingContext_blendEquation_Callback";


  /** @domName WebGLRenderingContext.blendEquationSeparate */
  void blendEquationSeparate(int modeRGB, int modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback";


  /** @domName WebGLRenderingContext.blendFunc */
  void blendFunc(int sfactor, int dfactor) native "WebGLRenderingContext_blendFunc_Callback";


  /** @domName WebGLRenderingContext.blendFuncSeparate */
  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback";

  void bufferData(/*unsigned long*/ target, data_OR_size, /*unsigned long*/ usage) {
    if ((target is int || target == null) && (data_OR_size is ArrayBuffer || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_1(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is ArrayBufferView || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_2(target, data_OR_size, usage);
      return;
    }
    if ((target is int || target == null) && (data_OR_size is int || data_OR_size == null) && (usage is int || usage == null)) {
      _bufferData_3(target, data_OR_size, usage);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.bufferData_1 */
  void _bufferData_1(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_1_Callback";


  /** @domName WebGLRenderingContext.bufferData_2 */
  void _bufferData_2(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_2_Callback";


  /** @domName WebGLRenderingContext.bufferData_3 */
  void _bufferData_3(target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_3_Callback";

  void bufferSubData(/*unsigned long*/ target, /*long long*/ offset, data) {
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBuffer || data == null)) {
      _bufferSubData_1(target, offset, data);
      return;
    }
    if ((target is int || target == null) && (offset is int || offset == null) && (data is ArrayBufferView || data == null)) {
      _bufferSubData_2(target, offset, data);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.bufferSubData_1 */
  void _bufferSubData_1(target, offset, data) native "WebGLRenderingContext_bufferSubData_1_Callback";


  /** @domName WebGLRenderingContext.bufferSubData_2 */
  void _bufferSubData_2(target, offset, data) native "WebGLRenderingContext_bufferSubData_2_Callback";


  /** @domName WebGLRenderingContext.checkFramebufferStatus */
  int checkFramebufferStatus(int target) native "WebGLRenderingContext_checkFramebufferStatus_Callback";


  /** @domName WebGLRenderingContext.clear */
  void clear(int mask) native "WebGLRenderingContext_clear_Callback";


  /** @domName WebGLRenderingContext.clearColor */
  void clearColor(num red, num green, num blue, num alpha) native "WebGLRenderingContext_clearColor_Callback";


  /** @domName WebGLRenderingContext.clearDepth */
  void clearDepth(num depth) native "WebGLRenderingContext_clearDepth_Callback";


  /** @domName WebGLRenderingContext.clearStencil */
  void clearStencil(int s) native "WebGLRenderingContext_clearStencil_Callback";


  /** @domName WebGLRenderingContext.colorMask */
  void colorMask(bool red, bool green, bool blue, bool alpha) native "WebGLRenderingContext_colorMask_Callback";


  /** @domName WebGLRenderingContext.compileShader */
  void compileShader(WebGLShader shader) native "WebGLRenderingContext_compileShader_Callback";


  /** @domName WebGLRenderingContext.compressedTexImage2D */
  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ArrayBufferView data) native "WebGLRenderingContext_compressedTexImage2D_Callback";


  /** @domName WebGLRenderingContext.compressedTexSubImage2D */
  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ArrayBufferView data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback";


  /** @domName WebGLRenderingContext.copyTexImage2D */
  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) native "WebGLRenderingContext_copyTexImage2D_Callback";


  /** @domName WebGLRenderingContext.copyTexSubImage2D */
  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) native "WebGLRenderingContext_copyTexSubImage2D_Callback";


  /** @domName WebGLRenderingContext.createBuffer */
  WebGLBuffer createBuffer() native "WebGLRenderingContext_createBuffer_Callback";


  /** @domName WebGLRenderingContext.createFramebuffer */
  WebGLFramebuffer createFramebuffer() native "WebGLRenderingContext_createFramebuffer_Callback";


  /** @domName WebGLRenderingContext.createProgram */
  WebGLProgram createProgram() native "WebGLRenderingContext_createProgram_Callback";


  /** @domName WebGLRenderingContext.createRenderbuffer */
  WebGLRenderbuffer createRenderbuffer() native "WebGLRenderingContext_createRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.createShader */
  WebGLShader createShader(int type) native "WebGLRenderingContext_createShader_Callback";


  /** @domName WebGLRenderingContext.createTexture */
  WebGLTexture createTexture() native "WebGLRenderingContext_createTexture_Callback";


  /** @domName WebGLRenderingContext.cullFace */
  void cullFace(int mode) native "WebGLRenderingContext_cullFace_Callback";


  /** @domName WebGLRenderingContext.deleteBuffer */
  void deleteBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_deleteBuffer_Callback";


  /** @domName WebGLRenderingContext.deleteFramebuffer */
  void deleteFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback";


  /** @domName WebGLRenderingContext.deleteProgram */
  void deleteProgram(WebGLProgram program) native "WebGLRenderingContext_deleteProgram_Callback";


  /** @domName WebGLRenderingContext.deleteRenderbuffer */
  void deleteRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.deleteShader */
  void deleteShader(WebGLShader shader) native "WebGLRenderingContext_deleteShader_Callback";


  /** @domName WebGLRenderingContext.deleteTexture */
  void deleteTexture(WebGLTexture texture) native "WebGLRenderingContext_deleteTexture_Callback";


  /** @domName WebGLRenderingContext.depthFunc */
  void depthFunc(int func) native "WebGLRenderingContext_depthFunc_Callback";


  /** @domName WebGLRenderingContext.depthMask */
  void depthMask(bool flag) native "WebGLRenderingContext_depthMask_Callback";


  /** @domName WebGLRenderingContext.depthRange */
  void depthRange(num zNear, num zFar) native "WebGLRenderingContext_depthRange_Callback";


  /** @domName WebGLRenderingContext.detachShader */
  void detachShader(WebGLProgram program, WebGLShader shader) native "WebGLRenderingContext_detachShader_Callback";


  /** @domName WebGLRenderingContext.disable */
  void disable(int cap) native "WebGLRenderingContext_disable_Callback";


  /** @domName WebGLRenderingContext.disableVertexAttribArray */
  void disableVertexAttribArray(int index) native "WebGLRenderingContext_disableVertexAttribArray_Callback";


  /** @domName WebGLRenderingContext.drawArrays */
  void drawArrays(int mode, int first, int count) native "WebGLRenderingContext_drawArrays_Callback";


  /** @domName WebGLRenderingContext.drawElements */
  void drawElements(int mode, int count, int type, int offset) native "WebGLRenderingContext_drawElements_Callback";


  /** @domName WebGLRenderingContext.enable */
  void enable(int cap) native "WebGLRenderingContext_enable_Callback";


  /** @domName WebGLRenderingContext.enableVertexAttribArray */
  void enableVertexAttribArray(int index) native "WebGLRenderingContext_enableVertexAttribArray_Callback";


  /** @domName WebGLRenderingContext.finish */
  void finish() native "WebGLRenderingContext_finish_Callback";


  /** @domName WebGLRenderingContext.flush */
  void flush() native "WebGLRenderingContext_flush_Callback";


  /** @domName WebGLRenderingContext.framebufferRenderbuffer */
  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.framebufferTexture2D */
  void framebufferTexture2D(int target, int attachment, int textarget, WebGLTexture texture, int level) native "WebGLRenderingContext_framebufferTexture2D_Callback";


  /** @domName WebGLRenderingContext.frontFace */
  void frontFace(int mode) native "WebGLRenderingContext_frontFace_Callback";


  /** @domName WebGLRenderingContext.generateMipmap */
  void generateMipmap(int target) native "WebGLRenderingContext_generateMipmap_Callback";


  /** @domName WebGLRenderingContext.getActiveAttrib */
  WebGLActiveInfo getActiveAttrib(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveAttrib_Callback";


  /** @domName WebGLRenderingContext.getActiveUniform */
  WebGLActiveInfo getActiveUniform(WebGLProgram program, int index) native "WebGLRenderingContext_getActiveUniform_Callback";


  /** @domName WebGLRenderingContext.getAttachedShaders */
  void getAttachedShaders(WebGLProgram program) native "WebGLRenderingContext_getAttachedShaders_Callback";


  /** @domName WebGLRenderingContext.getAttribLocation */
  int getAttribLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getAttribLocation_Callback";


  /** @domName WebGLRenderingContext.getBufferParameter */
  Object getBufferParameter(int target, int pname) native "WebGLRenderingContext_getBufferParameter_Callback";


  /** @domName WebGLRenderingContext.getContextAttributes */
  WebGLContextAttributes getContextAttributes() native "WebGLRenderingContext_getContextAttributes_Callback";


  /** @domName WebGLRenderingContext.getError */
  int getError() native "WebGLRenderingContext_getError_Callback";


  /** @domName WebGLRenderingContext.getExtension */
  Object getExtension(String name) native "WebGLRenderingContext_getExtension_Callback";


  /** @domName WebGLRenderingContext.getFramebufferAttachmentParameter */
  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";


  /** @domName WebGLRenderingContext.getParameter */
  Object getParameter(int pname) native "WebGLRenderingContext_getParameter_Callback";


  /** @domName WebGLRenderingContext.getProgramInfoLog */
  String getProgramInfoLog(WebGLProgram program) native "WebGLRenderingContext_getProgramInfoLog_Callback";


  /** @domName WebGLRenderingContext.getProgramParameter */
  Object getProgramParameter(WebGLProgram program, int pname) native "WebGLRenderingContext_getProgramParameter_Callback";


  /** @domName WebGLRenderingContext.getRenderbufferParameter */
  Object getRenderbufferParameter(int target, int pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";


  /** @domName WebGLRenderingContext.getShaderInfoLog */
  String getShaderInfoLog(WebGLShader shader) native "WebGLRenderingContext_getShaderInfoLog_Callback";


  /** @domName WebGLRenderingContext.getShaderParameter */
  Object getShaderParameter(WebGLShader shader, int pname) native "WebGLRenderingContext_getShaderParameter_Callback";


  /** @domName WebGLRenderingContext.getShaderPrecisionFormat */
  WebGLShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";


  /** @domName WebGLRenderingContext.getShaderSource */
  String getShaderSource(WebGLShader shader) native "WebGLRenderingContext_getShaderSource_Callback";


  /** @domName WebGLRenderingContext.getSupportedExtensions */
  List<String> getSupportedExtensions() native "WebGLRenderingContext_getSupportedExtensions_Callback";


  /** @domName WebGLRenderingContext.getTexParameter */
  Object getTexParameter(int target, int pname) native "WebGLRenderingContext_getTexParameter_Callback";


  /** @domName WebGLRenderingContext.getUniform */
  Object getUniform(WebGLProgram program, WebGLUniformLocation location) native "WebGLRenderingContext_getUniform_Callback";


  /** @domName WebGLRenderingContext.getUniformLocation */
  WebGLUniformLocation getUniformLocation(WebGLProgram program, String name) native "WebGLRenderingContext_getUniformLocation_Callback";


  /** @domName WebGLRenderingContext.getVertexAttrib */
  Object getVertexAttrib(int index, int pname) native "WebGLRenderingContext_getVertexAttrib_Callback";


  /** @domName WebGLRenderingContext.getVertexAttribOffset */
  int getVertexAttribOffset(int index, int pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback";


  /** @domName WebGLRenderingContext.hint */
  void hint(int target, int mode) native "WebGLRenderingContext_hint_Callback";


  /** @domName WebGLRenderingContext.isBuffer */
  bool isBuffer(WebGLBuffer buffer) native "WebGLRenderingContext_isBuffer_Callback";


  /** @domName WebGLRenderingContext.isContextLost */
  bool isContextLost() native "WebGLRenderingContext_isContextLost_Callback";


  /** @domName WebGLRenderingContext.isEnabled */
  bool isEnabled(int cap) native "WebGLRenderingContext_isEnabled_Callback";


  /** @domName WebGLRenderingContext.isFramebuffer */
  bool isFramebuffer(WebGLFramebuffer framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback";


  /** @domName WebGLRenderingContext.isProgram */
  bool isProgram(WebGLProgram program) native "WebGLRenderingContext_isProgram_Callback";


  /** @domName WebGLRenderingContext.isRenderbuffer */
  bool isRenderbuffer(WebGLRenderbuffer renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback";


  /** @domName WebGLRenderingContext.isShader */
  bool isShader(WebGLShader shader) native "WebGLRenderingContext_isShader_Callback";


  /** @domName WebGLRenderingContext.isTexture */
  bool isTexture(WebGLTexture texture) native "WebGLRenderingContext_isTexture_Callback";


  /** @domName WebGLRenderingContext.lineWidth */
  void lineWidth(num width) native "WebGLRenderingContext_lineWidth_Callback";


  /** @domName WebGLRenderingContext.linkProgram */
  void linkProgram(WebGLProgram program) native "WebGLRenderingContext_linkProgram_Callback";


  /** @domName WebGLRenderingContext.pixelStorei */
  void pixelStorei(int pname, int param) native "WebGLRenderingContext_pixelStorei_Callback";


  /** @domName WebGLRenderingContext.polygonOffset */
  void polygonOffset(num factor, num units) native "WebGLRenderingContext_polygonOffset_Callback";


  /** @domName WebGLRenderingContext.readPixels */
  void readPixels(int x, int y, int width, int height, int format, int type, ArrayBufferView pixels) native "WebGLRenderingContext_readPixels_Callback";


  /** @domName WebGLRenderingContext.releaseShaderCompiler */
  void releaseShaderCompiler() native "WebGLRenderingContext_releaseShaderCompiler_Callback";


  /** @domName WebGLRenderingContext.renderbufferStorage */
  void renderbufferStorage(int target, int internalformat, int width, int height) native "WebGLRenderingContext_renderbufferStorage_Callback";


  /** @domName WebGLRenderingContext.sampleCoverage */
  void sampleCoverage(num value, bool invert) native "WebGLRenderingContext_sampleCoverage_Callback";


  /** @domName WebGLRenderingContext.scissor */
  void scissor(int x, int y, int width, int height) native "WebGLRenderingContext_scissor_Callback";


  /** @domName WebGLRenderingContext.shaderSource */
  void shaderSource(WebGLShader shader, String string) native "WebGLRenderingContext_shaderSource_Callback";


  /** @domName WebGLRenderingContext.stencilFunc */
  void stencilFunc(int func, int ref, int mask) native "WebGLRenderingContext_stencilFunc_Callback";


  /** @domName WebGLRenderingContext.stencilFuncSeparate */
  void stencilFuncSeparate(int face, int func, int ref, int mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback";


  /** @domName WebGLRenderingContext.stencilMask */
  void stencilMask(int mask) native "WebGLRenderingContext_stencilMask_Callback";


  /** @domName WebGLRenderingContext.stencilMaskSeparate */
  void stencilMaskSeparate(int face, int mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback";


  /** @domName WebGLRenderingContext.stencilOp */
  void stencilOp(int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOp_Callback";


  /** @domName WebGLRenderingContext.stencilOpSeparate */
  void stencilOpSeparate(int face, int fail, int zfail, int zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback";

  void texImage2D(/*unsigned long*/ target, /*long*/ level, /*unsigned long*/ internalformat, /*long*/ format_OR_width, /*long*/ height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [/*unsigned long*/ format, /*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (format is int || format == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
      _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (internalformat is int || internalformat == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && !?format && !?type && !?pixels) {
      _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.texImage2D_1 */
  void _texImage2D_1(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_1_Callback";


  /** @domName WebGLRenderingContext.texImage2D_2 */
  void _texImage2D_2(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_2_Callback";


  /** @domName WebGLRenderingContext.texImage2D_3 */
  void _texImage2D_3(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_3_Callback";


  /** @domName WebGLRenderingContext.texImage2D_4 */
  void _texImage2D_4(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_4_Callback";


  /** @domName WebGLRenderingContext.texImage2D_5 */
  void _texImage2D_5(target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_5_Callback";


  /** @domName WebGLRenderingContext.texParameterf */
  void texParameterf(int target, int pname, num param) native "WebGLRenderingContext_texParameterf_Callback";


  /** @domName WebGLRenderingContext.texParameteri */
  void texParameteri(int target, int pname, int param) native "WebGLRenderingContext_texParameteri_Callback";

  void texSubImage2D(/*unsigned long*/ target, /*long*/ level, /*long*/ xoffset, /*long*/ yoffset, /*long*/ format_OR_width, /*long*/ height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [/*unsigned long*/ type, /*ArrayBufferView*/ pixels]) {
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (type is int || type == null) && (pixels is ArrayBufferView || pixels == null)) {
      _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    if ((target is int || target == null) && (level is int || level == null) && (xoffset is int || xoffset == null) && (yoffset is int || yoffset == null) && (format_OR_width is int || format_OR_width == null) && (height_OR_type is int || height_OR_type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && !?type && !?pixels) {
      _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
      return;
    }
    throw "Incorrect number or type of arguments";
  }


  /** @domName WebGLRenderingContext.texSubImage2D_1 */
  void _texSubImage2D_1(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_1_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_2 */
  void _texSubImage2D_2(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_2_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_3 */
  void _texSubImage2D_3(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_3_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_4 */
  void _texSubImage2D_4(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_4_Callback";


  /** @domName WebGLRenderingContext.texSubImage2D_5 */
  void _texSubImage2D_5(target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_5_Callback";


  /** @domName WebGLRenderingContext.uniform1f */
  void uniform1f(WebGLUniformLocation location, num x) native "WebGLRenderingContext_uniform1f_Callback";


  /** @domName WebGLRenderingContext.uniform1fv */
  void uniform1fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform1fv_Callback";


  /** @domName WebGLRenderingContext.uniform1i */
  void uniform1i(WebGLUniformLocation location, int x) native "WebGLRenderingContext_uniform1i_Callback";


  /** @domName WebGLRenderingContext.uniform1iv */
  void uniform1iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform1iv_Callback";


  /** @domName WebGLRenderingContext.uniform2f */
  void uniform2f(WebGLUniformLocation location, num x, num y) native "WebGLRenderingContext_uniform2f_Callback";


  /** @domName WebGLRenderingContext.uniform2fv */
  void uniform2fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform2fv_Callback";


  /** @domName WebGLRenderingContext.uniform2i */
  void uniform2i(WebGLUniformLocation location, int x, int y) native "WebGLRenderingContext_uniform2i_Callback";


  /** @domName WebGLRenderingContext.uniform2iv */
  void uniform2iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform2iv_Callback";


  /** @domName WebGLRenderingContext.uniform3f */
  void uniform3f(WebGLUniformLocation location, num x, num y, num z) native "WebGLRenderingContext_uniform3f_Callback";


  /** @domName WebGLRenderingContext.uniform3fv */
  void uniform3fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform3fv_Callback";


  /** @domName WebGLRenderingContext.uniform3i */
  void uniform3i(WebGLUniformLocation location, int x, int y, int z) native "WebGLRenderingContext_uniform3i_Callback";


  /** @domName WebGLRenderingContext.uniform3iv */
  void uniform3iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform3iv_Callback";


  /** @domName WebGLRenderingContext.uniform4f */
  void uniform4f(WebGLUniformLocation location, num x, num y, num z, num w) native "WebGLRenderingContext_uniform4f_Callback";


  /** @domName WebGLRenderingContext.uniform4fv */
  void uniform4fv(WebGLUniformLocation location, Float32Array v) native "WebGLRenderingContext_uniform4fv_Callback";


  /** @domName WebGLRenderingContext.uniform4i */
  void uniform4i(WebGLUniformLocation location, int x, int y, int z, int w) native "WebGLRenderingContext_uniform4i_Callback";


  /** @domName WebGLRenderingContext.uniform4iv */
  void uniform4iv(WebGLUniformLocation location, Int32Array v) native "WebGLRenderingContext_uniform4iv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix2fv */
  void uniformMatrix2fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix3fv */
  void uniformMatrix3fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";


  /** @domName WebGLRenderingContext.uniformMatrix4fv */
  void uniformMatrix4fv(WebGLUniformLocation location, bool transpose, Float32Array array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";


  /** @domName WebGLRenderingContext.useProgram */
  void useProgram(WebGLProgram program) native "WebGLRenderingContext_useProgram_Callback";


  /** @domName WebGLRenderingContext.validateProgram */
  void validateProgram(WebGLProgram program) native "WebGLRenderingContext_validateProgram_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib1f */
  void vertexAttrib1f(int indx, num x) native "WebGLRenderingContext_vertexAttrib1f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib1fv */
  void vertexAttrib1fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib2f */
  void vertexAttrib2f(int indx, num x, num y) native "WebGLRenderingContext_vertexAttrib2f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib2fv */
  void vertexAttrib2fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib3f */
  void vertexAttrib3f(int indx, num x, num y, num z) native "WebGLRenderingContext_vertexAttrib3f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib3fv */
  void vertexAttrib3fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib4f */
  void vertexAttrib4f(int indx, num x, num y, num z, num w) native "WebGLRenderingContext_vertexAttrib4f_Callback";


  /** @domName WebGLRenderingContext.vertexAttrib4fv */
  void vertexAttrib4fv(int indx, Float32Array values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";


  /** @domName WebGLRenderingContext.vertexAttribPointer */
  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) native "WebGLRenderingContext_vertexAttribPointer_Callback";


  /** @domName WebGLRenderingContext.viewport */
  void viewport(int x, int y, int width, int height) native "WebGLRenderingContext_viewport_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLShader
class WebGLShader extends NativeFieldWrapperClass1 {
  WebGLShader.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLShaderPrecisionFormat
class WebGLShaderPrecisionFormat extends NativeFieldWrapperClass1 {
  WebGLShaderPrecisionFormat.internal();


  /** @domName WebGLShaderPrecisionFormat.precision */
  int get precision native "WebGLShaderPrecisionFormat_precision_Getter";


  /** @domName WebGLShaderPrecisionFormat.rangeMax */
  int get rangeMax native "WebGLShaderPrecisionFormat_rangeMax_Getter";


  /** @domName WebGLShaderPrecisionFormat.rangeMin */
  int get rangeMin native "WebGLShaderPrecisionFormat_rangeMin_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLTexture
class WebGLTexture extends NativeFieldWrapperClass1 {
  WebGLTexture.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLUniformLocation
class WebGLUniformLocation extends NativeFieldWrapperClass1 {
  WebGLUniformLocation.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebGLVertexArrayObjectOES
class WebGLVertexArrayObject extends NativeFieldWrapperClass1 {
  WebGLVertexArrayObject.internal();

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitCSSFilterValue
class WebKitCssFilterValue extends _CssValueList {
  WebKitCssFilterValue.internal(): super.internal();

  static const int CSS_FILTER_BLUR = 10;

  static const int CSS_FILTER_BRIGHTNESS = 8;

  static const int CSS_FILTER_CONTRAST = 9;

  static const int CSS_FILTER_CUSTOM = 12;

  static const int CSS_FILTER_DROP_SHADOW = 11;

  static const int CSS_FILTER_GRAYSCALE = 2;

  static const int CSS_FILTER_HUE_ROTATE = 5;

  static const int CSS_FILTER_INVERT = 6;

  static const int CSS_FILTER_OPACITY = 7;

  static const int CSS_FILTER_REFERENCE = 1;

  static const int CSS_FILTER_SATURATE = 4;

  static const int CSS_FILTER_SEPIA = 3;


  /** @domName WebKitCSSFilterValue.operationType */
  int get operationType native "WebKitCSSFilterValue_operationType_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitNamedFlow
class WebKitNamedFlow extends EventTarget {
  WebKitNamedFlow.internal(): super.internal();


  /** @domName WebKitNamedFlow.firstEmptyRegionIndex */
  int get firstEmptyRegionIndex native "WebKitNamedFlow_firstEmptyRegionIndex_Getter";


  /** @domName WebKitNamedFlow.name */
  String get name native "WebKitNamedFlow_name_Getter";


  /** @domName WebKitNamedFlow.overset */
  bool get overset native "WebKitNamedFlow_overset_Getter";


  /** @domName WebKitNamedFlow.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_addEventListener_Callback";


  /** @domName WebKitNamedFlow.dispatchEvent */
  bool $dom_dispatchEvent(Event event) native "WebKitNamedFlow_dispatchEvent_Callback";


  /** @domName WebKitNamedFlow.getContent */
  List<Node> getContent() native "WebKitNamedFlow_getContent_Callback";


  /** @domName WebKitNamedFlow.getRegions */
  List<Node> getRegions() native "WebKitNamedFlow_getRegions_Callback";


  /** @domName WebKitNamedFlow.getRegionsByContent */
  List<Node> getRegionsByContent(Node contentNode) native "WebKitNamedFlow_getRegionsByContent_Callback";


  /** @domName WebKitNamedFlow.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebKitNamedFlow_removeEventListener_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebSocket
class WebSocket extends EventTarget {
  factory WebSocket(String url) => _WebSocketFactoryProvider.createWebSocket(url);
  WebSocket.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  WebSocketEvents get on =>
    new WebSocketEvents(this);

  static const int CLOSED = 3;

  static const int CLOSING = 2;

  static const int CONNECTING = 0;

  static const int OPEN = 1;


  /** @domName WebSocket.URL */
  String get Url native "WebSocket_URL_Getter";


  /** @domName WebSocket.binaryType */
  String get binaryType native "WebSocket_binaryType_Getter";


  /** @domName WebSocket.binaryType */
  void set binaryType(String value) native "WebSocket_binaryType_Setter";


  /** @domName WebSocket.bufferedAmount */
  int get bufferedAmount native "WebSocket_bufferedAmount_Getter";


  /** @domName WebSocket.extensions */
  String get extensions native "WebSocket_extensions_Getter";


  /** @domName WebSocket.protocol */
  String get protocol native "WebSocket_protocol_Getter";


  /** @domName WebSocket.readyState */
  int get readyState native "WebSocket_readyState_Getter";


  /** @domName WebSocket.url */
  String get url native "WebSocket_url_Getter";


  /** @domName WebSocket.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_addEventListener_Callback";

  void close([/*unsigned short*/ code, /*DOMString*/ reason]) {
    if (?reason) {
      _close_1(code, reason);
      return;
    }
    if (?code) {
      _close_2(code);
      return;
    }
    _close_3();
  }


  /** @domName WebSocket.close_1 */
  void _close_1(code, reason) native "WebSocket_close_1_Callback";


  /** @domName WebSocket.close_2 */
  void _close_2(code) native "WebSocket_close_2_Callback";


  /** @domName WebSocket.close_3 */
  void _close_3() native "WebSocket_close_3_Callback";


  /** @domName WebSocket.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "WebSocket_dispatchEvent_Callback";


  /** @domName WebSocket.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WebSocket_removeEventListener_Callback";


  /** @domName WebSocket.send */
  void send(data) native "WebSocket_send_Callback";

}

/// @docsEditable true
class WebSocketEvents extends Events {
  /// @docsEditable true
  WebSocketEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get close => this['close'];

  /// @docsEditable true
  EventListenerList get error => this['error'];

  /// @docsEditable true
  EventListenerList get message => this['message'];

  /// @docsEditable true
  EventListenerList get open => this['open'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/// @domName WheelEvent
class WheelEvent extends MouseEvent {
  WheelEvent.internal(): super.internal();


  /** @domName WheelEvent.webkitDirectionInvertedFromDevice */
  bool get webkitDirectionInvertedFromDevice native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";


  /** @domName WheelEvent.wheelDeltaX */
  int get $dom_wheelDeltaX native "WheelEvent_wheelDeltaX_Getter";


  /** @domName WheelEvent.wheelDeltaY */
  int get $dom_wheelDeltaY native "WheelEvent_wheelDeltaY_Getter";


  /** @domName WheelEvent.initWebKitWheelEvent */
  void initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, LocalWindow view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) native "WheelEvent_initWebKitWheelEvent_Callback";


  /** @domName WheelEvent.deltaX */
  num get deltaX => $dom_wheelDeltaX;
  /** @domName WheelEvent.deltaY */
  num get deltaY => $dom_wheelDeltaY;
  /** @domName WheelEvent.deltaMode */
  int get deltaMode => 0;

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName Worker
class Worker extends AbstractWorker {

  ///@docsEditable true
  factory Worker(String scriptUrl) => _WorkerFactoryProvider.createWorker(scriptUrl);
  Worker.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  WorkerEvents get on =>
    new WorkerEvents(this);


  /** @domName Worker.postMessage */
  void postMessage(/*SerializedScriptValue*/ message, [List messagePorts]) native "Worker_postMessage_Callback";


  /** @domName Worker.terminate */
  void terminate() native "Worker_terminate_Callback";

}

/// @docsEditable true
class WorkerEvents extends AbstractWorkerEvents {
  /// @docsEditable true
  WorkerEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get message => this['message'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WorkerContext
class WorkerContext extends EventTarget {
  WorkerContext.internal(): super.internal();

  /// @domName EventTarget.addEventListener, EventTarget.removeEventListener, EventTarget.dispatchEvent; @docsEditable true
  WorkerContextEvents get on =>
    new WorkerContextEvents(this);

  static const int PERSISTENT = 1;

  static const int TEMPORARY = 0;


  /** @domName WorkerContext.indexedDB */
  IdbFactory get indexedDB native "WorkerContext_indexedDB_Getter";


  /** @domName WorkerContext.location */
  WorkerLocation get location native "WorkerContext_location_Getter";


  /** @domName WorkerContext.navigator */
  WorkerNavigator get navigator native "WorkerContext_navigator_Getter";


  /** @domName WorkerContext.self */
  WorkerContext get self native "WorkerContext_self_Getter";


  /** @domName WorkerContext.webkitNotifications */
  NotificationCenter get webkitNotifications native "WorkerContext_webkitNotifications_Getter";


  /** @domName WorkerContext.addEventListener */
  void $dom_addEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_addEventListener_Callback";


  /** @domName WorkerContext.clearInterval */
  void clearInterval(int handle) native "WorkerContext_clearInterval_Callback";


  /** @domName WorkerContext.clearTimeout */
  void clearTimeout(int handle) native "WorkerContext_clearTimeout_Callback";


  /** @domName WorkerContext.close */
  void close() native "WorkerContext_close_Callback";


  /** @domName WorkerContext.dispatchEvent */
  bool $dom_dispatchEvent(Event evt) native "WorkerContext_dispatchEvent_Callback";


  /** @domName WorkerContext.importScripts */
  void importScripts() native "WorkerContext_importScripts_Callback";


  /** @domName WorkerContext.openDatabase */
  Database openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabase_Callback";


  /** @domName WorkerContext.openDatabaseSync */
  DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) native "WorkerContext_openDatabaseSync_Callback";


  /** @domName WorkerContext.removeEventListener */
  void $dom_removeEventListener(String type, EventListener listener, [bool useCapture]) native "WorkerContext_removeEventListener_Callback";


  /** @domName WorkerContext.setInterval */
  int setInterval(TimeoutHandler handler, int timeout) native "WorkerContext_setInterval_Callback";


  /** @domName WorkerContext.setTimeout */
  int setTimeout(TimeoutHandler handler, int timeout) native "WorkerContext_setTimeout_Callback";


  /** @domName WorkerContext.webkitRequestFileSystem */
  void webkitRequestFileSystem(int type, int size, [FileSystemCallback successCallback, ErrorCallback errorCallback]) native "WorkerContext_webkitRequestFileSystem_Callback";


  /** @domName WorkerContext.webkitRequestFileSystemSync */
  FileSystemSync webkitRequestFileSystemSync(int type, int size) native "WorkerContext_webkitRequestFileSystemSync_Callback";


  /** @domName WorkerContext.webkitResolveLocalFileSystemSyncURL */
  EntrySync webkitResolveLocalFileSystemSyncUrl(String url) native "WorkerContext_webkitResolveLocalFileSystemSyncURL_Callback";


  /** @domName WorkerContext.webkitResolveLocalFileSystemURL */
  void webkitResolveLocalFileSystemUrl(String url, EntryCallback successCallback, [ErrorCallback errorCallback]) native "WorkerContext_webkitResolveLocalFileSystemURL_Callback";

}

/// @docsEditable true
class WorkerContextEvents extends Events {
  /// @docsEditable true
  WorkerContextEvents(EventTarget _ptr) : super(_ptr);

  /// @docsEditable true
  EventListenerList get error => this['error'];
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WorkerLocation
class WorkerLocation extends NativeFieldWrapperClass1 {
  WorkerLocation.internal();


  /** @domName WorkerLocation.hash */
  String get hash native "WorkerLocation_hash_Getter";


  /** @domName WorkerLocation.host */
  String get host native "WorkerLocation_host_Getter";


  /** @domName WorkerLocation.hostname */
  String get hostname native "WorkerLocation_hostname_Getter";


  /** @domName WorkerLocation.href */
  String get href native "WorkerLocation_href_Getter";


  /** @domName WorkerLocation.pathname */
  String get pathname native "WorkerLocation_pathname_Getter";


  /** @domName WorkerLocation.port */
  String get port native "WorkerLocation_port_Getter";


  /** @domName WorkerLocation.protocol */
  String get protocol native "WorkerLocation_protocol_Getter";


  /** @domName WorkerLocation.search */
  String get search native "WorkerLocation_search_Getter";


  /** @domName WorkerLocation.toString */
  String toString() native "WorkerLocation_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WorkerNavigator
class WorkerNavigator extends NativeFieldWrapperClass1 {
  WorkerNavigator.internal();


  /** @domName WorkerNavigator.appName */
  String get appName native "WorkerNavigator_appName_Getter";


  /** @domName WorkerNavigator.appVersion */
  String get appVersion native "WorkerNavigator_appVersion_Getter";


  /** @domName WorkerNavigator.onLine */
  bool get onLine native "WorkerNavigator_onLine_Getter";


  /** @domName WorkerNavigator.platform */
  String get platform native "WorkerNavigator_platform_Getter";


  /** @domName WorkerNavigator.userAgent */
  String get userAgent native "WorkerNavigator_userAgent_Getter";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XPathEvaluator
class XPathEvaluator extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory XPathEvaluator() => _XPathEvaluatorFactoryProvider.createXPathEvaluator();
  XPathEvaluator.internal();


  /** @domName XPathEvaluator.createExpression */
  XPathExpression createExpression(String expression, XPathNSResolver resolver) native "XPathEvaluator_createExpression_Callback";


  /** @domName XPathEvaluator.createNSResolver */
  XPathNSResolver createNSResolver(Node nodeResolver) native "XPathEvaluator_createNSResolver_Callback";


  /** @domName XPathEvaluator.evaluate */
  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) native "XPathEvaluator_evaluate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XPathException
class XPathException extends NativeFieldWrapperClass1 {
  XPathException.internal();

  static const int INVALID_EXPRESSION_ERR = 51;

  static const int TYPE_ERR = 52;


  /** @domName XPathException.code */
  int get code native "XPathException_code_Getter";


  /** @domName XPathException.message */
  String get message native "XPathException_message_Getter";


  /** @domName XPathException.name */
  String get name native "XPathException_name_Getter";


  /** @domName XPathException.toString */
  String toString() native "XPathException_toString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XPathExpression
class XPathExpression extends NativeFieldWrapperClass1 {
  XPathExpression.internal();


  /** @domName XPathExpression.evaluate */
  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) native "XPathExpression_evaluate_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XPathNSResolver
class XPathNSResolver extends NativeFieldWrapperClass1 {
  XPathNSResolver.internal();


  /** @domName XPathNSResolver.lookupNamespaceURI */
  String lookupNamespaceUri(String prefix) native "XPathNSResolver_lookupNamespaceURI_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XPathResult
class XPathResult extends NativeFieldWrapperClass1 {
  XPathResult.internal();

  static const int ANY_TYPE = 0;

  static const int ANY_UNORDERED_NODE_TYPE = 8;

  static const int BOOLEAN_TYPE = 3;

  static const int FIRST_ORDERED_NODE_TYPE = 9;

  static const int NUMBER_TYPE = 1;

  static const int ORDERED_NODE_ITERATOR_TYPE = 5;

  static const int ORDERED_NODE_SNAPSHOT_TYPE = 7;

  static const int STRING_TYPE = 2;

  static const int UNORDERED_NODE_ITERATOR_TYPE = 4;

  static const int UNORDERED_NODE_SNAPSHOT_TYPE = 6;


  /** @domName XPathResult.booleanValue */
  bool get booleanValue native "XPathResult_booleanValue_Getter";


  /** @domName XPathResult.invalidIteratorState */
  bool get invalidIteratorState native "XPathResult_invalidIteratorState_Getter";


  /** @domName XPathResult.numberValue */
  num get numberValue native "XPathResult_numberValue_Getter";


  /** @domName XPathResult.resultType */
  int get resultType native "XPathResult_resultType_Getter";


  /** @domName XPathResult.singleNodeValue */
  Node get singleNodeValue native "XPathResult_singleNodeValue_Getter";


  /** @domName XPathResult.snapshotLength */
  int get snapshotLength native "XPathResult_snapshotLength_Getter";


  /** @domName XPathResult.stringValue */
  String get stringValue native "XPathResult_stringValue_Getter";


  /** @domName XPathResult.iterateNext */
  Node iterateNext() native "XPathResult_iterateNext_Callback";


  /** @domName XPathResult.snapshotItem */
  Node snapshotItem(int index) native "XPathResult_snapshotItem_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XMLSerializer
class XmlSerializer extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory XmlSerializer() => _XmlSerializerFactoryProvider.createXmlSerializer();
  XmlSerializer.internal();


  /** @domName XMLSerializer.serializeToString */
  String serializeToString(Node node) native "XMLSerializer_serializeToString_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName XSLTProcessor
class XsltProcessor extends NativeFieldWrapperClass1 {

  ///@docsEditable true
  factory XsltProcessor() => _XsltProcessorFactoryProvider.createXsltProcessor();
  XsltProcessor.internal();


  /** @domName XSLTProcessor.clearParameters */
  void clearParameters() native "XSLTProcessor_clearParameters_Callback";


  /** @domName XSLTProcessor.getParameter */
  String getParameter(String namespaceURI, String localName) native "XSLTProcessor_getParameter_Callback";


  /** @domName XSLTProcessor.importStylesheet */
  void importStylesheet(Node stylesheet) native "XSLTProcessor_importStylesheet_Callback";


  /** @domName XSLTProcessor.removeParameter */
  void removeParameter(String namespaceURI, String localName) native "XSLTProcessor_removeParameter_Callback";


  /** @domName XSLTProcessor.reset */
  void reset() native "XSLTProcessor_reset_Callback";


  /** @domName XSLTProcessor.setParameter */
  void setParameter(String namespaceURI, String localName, String value) native "XSLTProcessor_setParameter_Callback";


  /** @domName XSLTProcessor.transformToDocument */
  Document transformToDocument(Node source) native "XSLTProcessor_transformToDocument_Callback";


  /** @domName XSLTProcessor.transformToFragment */
  DocumentFragment transformToFragment(Node source, Document docVal) native "XSLTProcessor_transformToFragment_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _ArrayBufferFactoryProvider {
  static ArrayBuffer createArrayBuffer(int length) native "ArrayBuffer_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _AudioElementFactoryProvider {
  static AudioElement createAudioElement([String src]) native "HTMLAudioElement_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _BlobFactoryProvider {
  static Blob createBlob(List blobParts, [String type, String endings]) native "Blob_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName ClientRectList
class _ClientRectList extends NativeFieldWrapperClass1 implements List<ClientRect> {
  _ClientRectList.internal();


  /** @domName ClientRectList.length */
  int get length native "ClientRectList_length_Getter";

  ClientRect operator[](int index) native "ClientRectList_item_Callback";

  void operator[]=(int index, ClientRect value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<ClientRect> mixins.
  // ClientRect is the element type.

  // From Iterable<ClientRect>:

  Iterator<ClientRect> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<ClientRect>(this);
  }

  // From Collection<ClientRect>:

  void add(ClientRect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(ClientRect value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<ClientRect> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, ClientRect)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(ClientRect element) => Collections.contains(this, element);

  void forEach(void f(ClientRect element)) => Collections.forEach(this, f);

  Collection map(f(ClientRect element)) => Collections.map(this, [], f);

  Collection<ClientRect> filter(bool f(ClientRect element)) =>
     Collections.filter(this, <ClientRect>[], f);

  bool every(bool f(ClientRect element)) => Collections.every(this, f);

  bool some(bool f(ClientRect element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<ClientRect>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(ClientRect a, ClientRect b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(ClientRect element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(ClientRect element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  ClientRect get first => this[0];

  ClientRect get last => this[length - 1];

  ClientRect removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  ClientRect removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<ClientRect> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [ClientRect initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<ClientRect> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <ClientRect>[]);

  // -- end List<ClientRect> mixins.


  /** @domName ClientRectList.item */
  ClientRect item(int index) native "ClientRectList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _CssMatrixFactoryProvider {
  static CssMatrix createCssMatrix([String cssValue]) native "WebKitCSSMatrix_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSRuleList
class _CssRuleList extends NativeFieldWrapperClass1 implements List<CssRule> {
  _CssRuleList.internal();


  /** @domName CSSRuleList.length */
  int get length native "CSSRuleList_length_Getter";

  CssRule operator[](int index) native "CSSRuleList_item_Callback";

  void operator[]=(int index, CssRule value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CssRule> mixins.
  // CssRule is the element type.

  // From Iterable<CssRule>:

  Iterator<CssRule> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<CssRule>(this);
  }

  // From Collection<CssRule>:

  void add(CssRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CssRule value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<CssRule> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssRule)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(CssRule element) => Collections.contains(this, element);

  void forEach(void f(CssRule element)) => Collections.forEach(this, f);

  Collection map(f(CssRule element)) => Collections.map(this, [], f);

  Collection<CssRule> filter(bool f(CssRule element)) =>
     Collections.filter(this, <CssRule>[], f);

  bool every(bool f(CssRule element)) => Collections.every(this, f);

  bool some(bool f(CssRule element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<CssRule>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(CssRule a, CssRule b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CssRule element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CssRule element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  CssRule get first => this[0];

  CssRule get last => this[length - 1];

  CssRule removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  CssRule removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<CssRule> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CssRule initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CssRule> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <CssRule>[]);

  // -- end List<CssRule> mixins.


  /** @domName CSSRuleList.item */
  CssRule item(int index) native "CSSRuleList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName CSSValueList
class _CssValueList extends CssValue implements List<CssValue> {
  _CssValueList.internal(): super.internal();


  /** @domName CSSValueList.length */
  int get length native "CSSValueList_length_Getter";

  CssValue operator[](int index) native "CSSValueList_item_Callback";

  void operator[]=(int index, CssValue value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<CssValue> mixins.
  // CssValue is the element type.

  // From Iterable<CssValue>:

  Iterator<CssValue> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<CssValue>(this);
  }

  // From Collection<CssValue>:

  void add(CssValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(CssValue value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<CssValue> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, CssValue)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(CssValue element) => Collections.contains(this, element);

  void forEach(void f(CssValue element)) => Collections.forEach(this, f);

  Collection map(f(CssValue element)) => Collections.map(this, [], f);

  Collection<CssValue> filter(bool f(CssValue element)) =>
     Collections.filter(this, <CssValue>[], f);

  bool every(bool f(CssValue element)) => Collections.every(this, f);

  bool some(bool f(CssValue element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<CssValue>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(CssValue a, CssValue b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(CssValue element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(CssValue element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  CssValue get first => this[0];

  CssValue get last => this[length - 1];

  CssValue removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  CssValue removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<CssValue> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [CssValue initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<CssValue> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <CssValue>[]);

  // -- end List<CssValue> mixins.


  /** @domName CSSValueList.item */
  CssValue item(int index) native "CSSValueList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _DataViewFactoryProvider {
  static DataView createDataView(ArrayBuffer buffer, [int byteOffset, int byteLength]) native "DataView_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _DomParserFactoryProvider {
  static DomParser createDomParser() native "DOMParser_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName HTMLElement
class _Element_Merged extends Element {
  _Element_Merged.internal(): super.internal();


  /** @domName HTMLElement.children */
  HtmlCollection get $dom_children native "HTMLElement_children_Getter";


  /** @domName HTMLElement.contentEditable */
  String get contentEditable native "HTMLElement_contentEditable_Getter";


  /** @domName HTMLElement.contentEditable */
  void set contentEditable(String value) native "HTMLElement_contentEditable_Setter";


  /** @domName HTMLElement.dir */
  String get dir native "HTMLElement_dir_Getter";


  /** @domName HTMLElement.dir */
  void set dir(String value) native "HTMLElement_dir_Setter";


  /** @domName HTMLElement.draggable */
  bool get draggable native "HTMLElement_draggable_Getter";


  /** @domName HTMLElement.draggable */
  void set draggable(bool value) native "HTMLElement_draggable_Setter";


  /** @domName HTMLElement.hidden */
  bool get hidden native "HTMLElement_hidden_Getter";


  /** @domName HTMLElement.hidden */
  void set hidden(bool value) native "HTMLElement_hidden_Setter";


  /** @domName HTMLElement.id */
  String get id native "HTMLElement_id_Getter";


  /** @domName HTMLElement.id */
  void set id(String value) native "HTMLElement_id_Setter";


  /** @domName HTMLElement.innerHTML */
  String get innerHtml native "HTMLElement_innerHTML_Getter";


  /** @domName HTMLElement.innerHTML */
  void set innerHtml(String value) native "HTMLElement_innerHTML_Setter";


  /** @domName HTMLElement.isContentEditable */
  bool get isContentEditable native "HTMLElement_isContentEditable_Getter";


  /** @domName HTMLElement.lang */
  String get lang native "HTMLElement_lang_Getter";


  /** @domName HTMLElement.lang */
  void set lang(String value) native "HTMLElement_lang_Setter";


  /** @domName HTMLElement.outerHTML */
  String get outerHtml native "HTMLElement_outerHTML_Getter";


  /** @domName HTMLElement.spellcheck */
  bool get spellcheck native "HTMLElement_spellcheck_Getter";


  /** @domName HTMLElement.spellcheck */
  void set spellcheck(bool value) native "HTMLElement_spellcheck_Setter";


  /** @domName HTMLElement.tabIndex */
  int get tabIndex native "HTMLElement_tabIndex_Getter";


  /** @domName HTMLElement.tabIndex */
  void set tabIndex(int value) native "HTMLElement_tabIndex_Setter";


  /** @domName HTMLElement.title */
  String get title native "HTMLElement_title_Getter";


  /** @domName HTMLElement.title */
  void set title(String value) native "HTMLElement_title_Setter";


  /** @domName HTMLElement.translate */
  bool get translate native "HTMLElement_translate_Getter";


  /** @domName HTMLElement.translate */
  void set translate(bool value) native "HTMLElement_translate_Setter";


  /** @domName HTMLElement.webkitdropzone */
  String get webkitdropzone native "HTMLElement_webkitdropzone_Getter";


  /** @domName HTMLElement.webkitdropzone */
  void set webkitdropzone(String value) native "HTMLElement_webkitdropzone_Setter";


  /** @domName HTMLElement.click */
  void click() native "HTMLElement_click_Callback";


  /** @domName HTMLElement.insertAdjacentElement */
  Element insertAdjacentElement(String where, Element element) native "HTMLElement_insertAdjacentElement_Callback";


  /** @domName HTMLElement.insertAdjacentHTML */
  void insertAdjacentHtml(String where, String html) native "HTMLElement_insertAdjacentHTML_Callback";


  /** @domName HTMLElement.insertAdjacentText */
  void insertAdjacentText(String where, String text) native "HTMLElement_insertAdjacentText_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EntryArray
class _EntryArray extends NativeFieldWrapperClass1 implements List<Entry> {
  _EntryArray.internal();


  /** @domName EntryArray.length */
  int get length native "EntryArray_length_Getter";

  Entry operator[](int index) native "EntryArray_item_Callback";

  void operator[]=(int index, Entry value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Entry> mixins.
  // Entry is the element type.

  // From Iterable<Entry>:

  Iterator<Entry> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Entry>(this);
  }

  // From Collection<Entry>:

  void add(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Entry value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Entry> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Entry)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Entry element) => Collections.contains(this, element);

  void forEach(void f(Entry element)) => Collections.forEach(this, f);

  Collection map(f(Entry element)) => Collections.map(this, [], f);

  Collection<Entry> filter(bool f(Entry element)) =>
     Collections.filter(this, <Entry>[], f);

  bool every(bool f(Entry element)) => Collections.every(this, f);

  bool some(bool f(Entry element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Entry>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Entry a, Entry b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Entry element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Entry element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Entry get first => this[0];

  Entry get last => this[length - 1];

  Entry removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Entry removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Entry> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Entry initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Entry> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Entry>[]);

  // -- end List<Entry> mixins.


  /** @domName EntryArray.item */
  Entry item(int index) native "EntryArray_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName EntryArraySync
class _EntryArraySync extends NativeFieldWrapperClass1 implements List<EntrySync> {
  _EntryArraySync.internal();


  /** @domName EntryArraySync.length */
  int get length native "EntryArraySync_length_Getter";

  EntrySync operator[](int index) native "EntryArraySync_item_Callback";

  void operator[]=(int index, EntrySync value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<EntrySync> mixins.
  // EntrySync is the element type.

  // From Iterable<EntrySync>:

  Iterator<EntrySync> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<EntrySync>(this);
  }

  // From Collection<EntrySync>:

  void add(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(EntrySync value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<EntrySync> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, EntrySync)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(EntrySync element) => Collections.contains(this, element);

  void forEach(void f(EntrySync element)) => Collections.forEach(this, f);

  Collection map(f(EntrySync element)) => Collections.map(this, [], f);

  Collection<EntrySync> filter(bool f(EntrySync element)) =>
     Collections.filter(this, <EntrySync>[], f);

  bool every(bool f(EntrySync element)) => Collections.every(this, f);

  bool some(bool f(EntrySync element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<EntrySync>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(EntrySync a, EntrySync b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(EntrySync element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(EntrySync element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  EntrySync get first => this[0];

  EntrySync get last => this[length - 1];

  EntrySync removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  EntrySync removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<EntrySync> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [EntrySync initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<EntrySync> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <EntrySync>[]);

  // -- end List<EntrySync> mixins.


  /** @domName EntryArraySync.item */
  EntrySync item(int index) native "EntryArraySync_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _EventSourceFactoryProvider {
  static EventSource createEventSource(String scriptUrl) native "EventSource_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _FileReaderFactoryProvider {
  static FileReader createFileReader() native "FileReader_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _FileReaderSyncFactoryProvider {
  static FileReaderSync createFileReaderSync() native "FileReaderSync_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _FormDataFactoryProvider {
  static FormData createFormData([FormElement form]) native "DOMFormData_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName GamepadList
class _GamepadList extends NativeFieldWrapperClass1 implements List<Gamepad> {
  _GamepadList.internal();


  /** @domName GamepadList.length */
  int get length native "GamepadList_length_Getter";

  Gamepad operator[](int index) native "GamepadList_item_Callback";

  void operator[]=(int index, Gamepad value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Gamepad> mixins.
  // Gamepad is the element type.

  // From Iterable<Gamepad>:

  Iterator<Gamepad> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Gamepad>(this);
  }

  // From Collection<Gamepad>:

  void add(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Gamepad value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Gamepad> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Gamepad)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Gamepad element) => Collections.contains(this, element);

  void forEach(void f(Gamepad element)) => Collections.forEach(this, f);

  Collection map(f(Gamepad element)) => Collections.map(this, [], f);

  Collection<Gamepad> filter(bool f(Gamepad element)) =>
     Collections.filter(this, <Gamepad>[], f);

  bool every(bool f(Gamepad element)) => Collections.every(this, f);

  bool some(bool f(Gamepad element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Gamepad>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Gamepad a, Gamepad b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Gamepad element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Gamepad element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Gamepad get first => this[0];

  Gamepad get last => this[length - 1];

  Gamepad removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Gamepad removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Gamepad> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Gamepad initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Gamepad> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Gamepad>[]);

  // -- end List<Gamepad> mixins.


  /** @domName GamepadList.item */
  Gamepad item(int index) native "GamepadList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _HttpRequestFactoryProvider {
  static HttpRequest createHttpRequest() => _createHttpRequest();
  static HttpRequest _createHttpRequest() native "XMLHttpRequest_constructor_Callback";

  static HttpRequest createHttpRequest_get(String url,
                                     onSuccess(HttpRequest request)) =>
      _HttpRequestUtils.get(url, onSuccess, false);

  static HttpRequest createHttpRequest_getWithCredentials(String url,
                                     onSuccess(HttpRequest request)) =>
      _HttpRequestUtils.get(url, onSuccess, true);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _IceCandidateFactoryProvider {
  static IceCandidate createIceCandidate(String label, String candidateLine) native "IceCandidate_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _MediaControllerFactoryProvider {
  static MediaController createMediaController() native "MediaController_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _MediaSourceFactoryProvider {
  static MediaSource createMediaSource() native "MediaSource_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _MediaStreamFactoryProvider {
  static MediaStream createMediaStream(MediaStreamTrackList audioTracks, MediaStreamTrackList videoTracks) native "MediaStream_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName MediaStreamList
class _MediaStreamList extends NativeFieldWrapperClass1 implements List<MediaStream> {
  _MediaStreamList.internal();


  /** @domName MediaStreamList.length */
  int get length native "MediaStreamList_length_Getter";

  MediaStream operator[](int index) native "MediaStreamList_item_Callback";

  void operator[]=(int index, MediaStream value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<MediaStream> mixins.
  // MediaStream is the element type.

  // From Iterable<MediaStream>:

  Iterator<MediaStream> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<MediaStream>(this);
  }

  // From Collection<MediaStream>:

  void add(MediaStream value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(MediaStream value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<MediaStream> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, MediaStream)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(MediaStream element) => Collections.contains(this, element);

  void forEach(void f(MediaStream element)) => Collections.forEach(this, f);

  Collection map(f(MediaStream element)) => Collections.map(this, [], f);

  Collection<MediaStream> filter(bool f(MediaStream element)) =>
     Collections.filter(this, <MediaStream>[], f);

  bool every(bool f(MediaStream element)) => Collections.every(this, f);

  bool some(bool f(MediaStream element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<MediaStream>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(MediaStream a, MediaStream b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(MediaStream element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(MediaStream element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  MediaStream get first => this[0];

  MediaStream get last => this[length - 1];

  MediaStream removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  MediaStream removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<MediaStream> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [MediaStream initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<MediaStream> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <MediaStream>[]);

  // -- end List<MediaStream> mixins.


  /** @domName MediaStreamList.item */
  MediaStream item(int index) native "MediaStreamList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _MessageChannelFactoryProvider {
  static MessageChannel createMessageChannel() native "MessageChannel_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _MutationObserverFactoryProvider {
  static MutationObserver createMutationObserver(MutationCallback callback) native "MutationObserver_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _NotificationFactoryProvider {
  static Notification createNotification(String title, [Map options]) native "Notification_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _OptionElementFactoryProvider {
  static OptionElement createOptionElement([String data, String value, bool defaultSelected, bool selected]) native "HTMLOptionElement_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _PeerConnection00FactoryProvider {
  static PeerConnection00 createPeerConnection00(String serverConfiguration, IceCallback iceCallback) native "PeerConnection00_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _RtcIceCandidateFactoryProvider {
  static RtcIceCandidate createRtcIceCandidate(Map dictionary) native "RTCIceCandidate_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _RtcPeerConnectionFactoryProvider {
  static RtcPeerConnection createRtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) native "RTCPeerConnection_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _RtcSessionDescriptionFactoryProvider {
  static RtcSessionDescription createRtcSessionDescription(Map dictionary) native "RTCSessionDescription_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _SessionDescriptionFactoryProvider {
  static SessionDescription createSessionDescription(String sdp) native "SessionDescription_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _ShadowRootFactoryProvider {
  static ShadowRoot createShadowRoot(Element host) native "ShadowRoot_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _SharedWorkerFactoryProvider {
  static SharedWorker createSharedWorker(String scriptURL, [String name]) native "SharedWorker_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _SpeechGrammarFactoryProvider {
  static SpeechGrammar createSpeechGrammar() native "SpeechGrammar_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _SpeechGrammarListFactoryProvider {
  static SpeechGrammarList createSpeechGrammarList() native "SpeechGrammarList_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechInputResultList
class _SpeechInputResultList extends NativeFieldWrapperClass1 implements List<SpeechInputResult> {
  _SpeechInputResultList.internal();


  /** @domName SpeechInputResultList.length */
  int get length native "SpeechInputResultList_length_Getter";

  SpeechInputResult operator[](int index) native "SpeechInputResultList_item_Callback";

  void operator[]=(int index, SpeechInputResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechInputResult> mixins.
  // SpeechInputResult is the element type.

  // From Iterable<SpeechInputResult>:

  Iterator<SpeechInputResult> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<SpeechInputResult>(this);
  }

  // From Collection<SpeechInputResult>:

  void add(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechInputResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechInputResult> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechInputResult)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(SpeechInputResult element) => Collections.contains(this, element);

  void forEach(void f(SpeechInputResult element)) => Collections.forEach(this, f);

  Collection map(f(SpeechInputResult element)) => Collections.map(this, [], f);

  Collection<SpeechInputResult> filter(bool f(SpeechInputResult element)) =>
     Collections.filter(this, <SpeechInputResult>[], f);

  bool every(bool f(SpeechInputResult element)) => Collections.every(this, f);

  bool some(bool f(SpeechInputResult element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechInputResult>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(SpeechInputResult a, SpeechInputResult b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechInputResult element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechInputResult element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechInputResult get first => this[0];

  SpeechInputResult get last => this[length - 1];

  SpeechInputResult removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  SpeechInputResult removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechInputResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechInputResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechInputResult> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <SpeechInputResult>[]);

  // -- end List<SpeechInputResult> mixins.


  /** @domName SpeechInputResultList.item */
  SpeechInputResult item(int index) native "SpeechInputResultList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _SpeechRecognitionFactoryProvider {
  static SpeechRecognition createSpeechRecognition() native "SpeechRecognition_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName SpeechRecognitionResultList
class _SpeechRecognitionResultList extends NativeFieldWrapperClass1 implements List<SpeechRecognitionResult> {
  _SpeechRecognitionResultList.internal();


  /** @domName SpeechRecognitionResultList.length */
  int get length native "SpeechRecognitionResultList_length_Getter";

  SpeechRecognitionResult operator[](int index) native "SpeechRecognitionResultList_item_Callback";

  void operator[]=(int index, SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<SpeechRecognitionResult> mixins.
  // SpeechRecognitionResult is the element type.

  // From Iterable<SpeechRecognitionResult>:

  Iterator<SpeechRecognitionResult> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<SpeechRecognitionResult>(this);
  }

  // From Collection<SpeechRecognitionResult>:

  void add(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(SpeechRecognitionResult value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<SpeechRecognitionResult> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, SpeechRecognitionResult)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(SpeechRecognitionResult element) => Collections.contains(this, element);

  void forEach(void f(SpeechRecognitionResult element)) => Collections.forEach(this, f);

  Collection map(f(SpeechRecognitionResult element)) => Collections.map(this, [], f);

  Collection<SpeechRecognitionResult> filter(bool f(SpeechRecognitionResult element)) =>
     Collections.filter(this, <SpeechRecognitionResult>[], f);

  bool every(bool f(SpeechRecognitionResult element)) => Collections.every(this, f);

  bool some(bool f(SpeechRecognitionResult element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<SpeechRecognitionResult>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(SpeechRecognitionResult a, SpeechRecognitionResult b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(SpeechRecognitionResult element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(SpeechRecognitionResult element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  SpeechRecognitionResult get first => this[0];

  SpeechRecognitionResult get last => this[length - 1];

  SpeechRecognitionResult removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  SpeechRecognitionResult removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<SpeechRecognitionResult> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [SpeechRecognitionResult initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<SpeechRecognitionResult> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <SpeechRecognitionResult>[]);

  // -- end List<SpeechRecognitionResult> mixins.


  /** @domName SpeechRecognitionResultList.item */
  SpeechRecognitionResult item(int index) native "SpeechRecognitionResultList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName StyleSheetList
class _StyleSheetList extends NativeFieldWrapperClass1 implements List<StyleSheet> {
  _StyleSheetList.internal();


  /** @domName StyleSheetList.length */
  int get length native "StyleSheetList_length_Getter";

  StyleSheet operator[](int index) native "StyleSheetList_item_Callback";

  void operator[]=(int index, StyleSheet value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<StyleSheet> mixins.
  // StyleSheet is the element type.

  // From Iterable<StyleSheet>:

  Iterator<StyleSheet> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<StyleSheet>(this);
  }

  // From Collection<StyleSheet>:

  void add(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(StyleSheet value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<StyleSheet> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, StyleSheet)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(StyleSheet element) => Collections.contains(this, element);

  void forEach(void f(StyleSheet element)) => Collections.forEach(this, f);

  Collection map(f(StyleSheet element)) => Collections.map(this, [], f);

  Collection<StyleSheet> filter(bool f(StyleSheet element)) =>
     Collections.filter(this, <StyleSheet>[], f);

  bool every(bool f(StyleSheet element)) => Collections.every(this, f);

  bool some(bool f(StyleSheet element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<StyleSheet>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(StyleSheet a, StyleSheet b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(StyleSheet element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(StyleSheet element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  StyleSheet get first => this[0];

  StyleSheet get last => this[length - 1];

  StyleSheet removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  StyleSheet removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<StyleSheet> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [StyleSheet initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<StyleSheet> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <StyleSheet>[]);

  // -- end List<StyleSheet> mixins.


  /** @domName StyleSheetList.item */
  StyleSheet item(int index) native "StyleSheetList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _TextTrackCueFactoryProvider {
  static TextTrackCue createTextTrackCue(num startTime, num endTime, String text) native "TextTrackCue_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// WARNING: Do not edit - generated code.


/// @domName WebKitAnimationList
class _WebKitAnimationList extends NativeFieldWrapperClass1 implements List<Animation> {
  _WebKitAnimationList.internal();


  /** @domName WebKitAnimationList.length */
  int get length native "WebKitAnimationList_length_Getter";

  Animation operator[](int index) native "WebKitAnimationList_item_Callback";

  void operator[]=(int index, Animation value) {
    throw new UnsupportedError("Cannot assign element of immutable List.");
  }
  // -- start List<Animation> mixins.
  // Animation is the element type.

  // From Iterable<Animation>:

  Iterator<Animation> iterator() {
    // Note: NodeLists are not fixed size. And most probably length shouldn't
    // be cached in both iterator _and_ forEach method. For now caching it
    // for consistency.
    return new FixedSizeListIterator<Animation>(this);
  }

  // From Collection<Animation>:

  void add(Animation value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addLast(Animation value) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  void addAll(Collection<Animation> collection) {
    throw new UnsupportedError("Cannot add to immutable List.");
  }

  dynamic reduce(dynamic initialValue, dynamic combine(dynamic, Animation)) {
    return Collections.reduce(this, initialValue, combine);
  }

  bool contains(Animation element) => Collections.contains(this, element);

  void forEach(void f(Animation element)) => Collections.forEach(this, f);

  Collection map(f(Animation element)) => Collections.map(this, [], f);

  Collection<Animation> filter(bool f(Animation element)) =>
     Collections.filter(this, <Animation>[], f);

  bool every(bool f(Animation element)) => Collections.every(this, f);

  bool some(bool f(Animation element)) => Collections.some(this, f);

  bool get isEmpty => this.length == 0;

  // From List<Animation>:
  void set length(int value) {
    throw new UnsupportedError("Cannot resize immutable List.");
  }

  void clear() {
    throw new UnsupportedError("Cannot clear immutable List.");
  }

  void sort([int compare(Animation a, Animation b)]) {
    throw new UnsupportedError("Cannot sort immutable List.");
  }

  int indexOf(Animation element, [int start = 0]) =>
      Lists.indexOf(this, element, start, this.length);

  int lastIndexOf(Animation element, [int start]) {
    if (start == null) start = length - 1;
    return Lists.lastIndexOf(this, element, start);
  }

  Animation get first => this[0];

  Animation get last => this[length - 1];

  Animation removeAt(int pos) {
    throw new UnsupportedError("Cannot removeAt on immutable List.");
  }

  Animation removeLast() {
    throw new UnsupportedError("Cannot removeLast on immutable List.");
  }

  void setRange(int start, int rangeLength, List<Animation> from, [int startFrom]) {
    throw new UnsupportedError("Cannot setRange on immutable List.");
  }

  void removeRange(int start, int rangeLength) {
    throw new UnsupportedError("Cannot removeRange on immutable List.");
  }

  void insertRange(int start, int rangeLength, [Animation initialValue]) {
    throw new UnsupportedError("Cannot insertRange on immutable List.");
  }

  List<Animation> getRange(int start, int rangeLength) =>
      Lists.getRange(this, start, rangeLength, <Animation>[]);

  // -- end List<Animation> mixins.


  /** @domName WebKitAnimationList.item */
  Animation item(int index) native "WebKitAnimationList_item_Callback";

}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _WorkerFactoryProvider {
  static Worker createWorker(String scriptUrl) native "Worker_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _XPathEvaluatorFactoryProvider {
  static XPathEvaluator createXPathEvaluator() native "XPathEvaluator_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _XmlSerializerFactoryProvider {
  static XmlSerializer createXmlSerializer() native "XMLSerializer_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _XsltProcessorFactoryProvider {
  static XsltProcessor createXsltProcessor() native "XSLTProcessor_constructor_Callback";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


abstract class _AttributeMap implements Map<String, String> {
  final Element _element;

  _AttributeMap(this._element);

  bool containsValue(String value) {
    for (var v in this.values) {
      if (value == v) {
        return true;
      }
    }
    return false;
  }

  String putIfAbsent(String key, String ifAbsent()) {
    if (!containsKey(key)) {
      this[key] = ifAbsent();
    }
    return this[key];
  }

  void clear() {
    for (var key in keys) {
      remove(key);
    }
  }

  void forEach(void f(String key, String value)) {
    for (var key in keys) {
      var value = this[key];
      f(key, value);
    }
  }

  Collection<String> get keys {
    // TODO: generate a lazy collection instead.
    var attributes = _element.$dom_attributes;
    var keys = new List<String>();
    for (int i = 0, len = attributes.length; i < len; i++) {
      if (_matches(attributes[i])) {
        keys.add(attributes[i].$dom_localName);
      }
    }
    return keys;
  }

  Collection<String> get values {
    // TODO: generate a lazy collection instead.
    var attributes = _element.$dom_attributes;
    var values = new List<String>();
    for (int i = 0, len = attributes.length; i < len; i++) {
      if (_matches(attributes[i])) {
        values.add(attributes[i].value);
      }
    }
    return values;
  }

  /**
   * Returns true if there is no {key, value} pair in the map.
   */
  bool get isEmpty {
    return length == 0;
  }

  /**
   * Checks to see if the node should be included in this map.
   */
  bool _matches(Node node);
}

/**
 * Wrapper to expose [Element.attributes] as a typed map.
 */
class _ElementAttributeMap extends _AttributeMap {

  _ElementAttributeMap(Element element): super(element);

  bool containsKey(String key) {
    return _element.$dom_hasAttribute(key);
  }

  String operator [](String key) {
    return _element.$dom_getAttribute(key);
  }

  void operator []=(String key, value) {
    _element.$dom_setAttribute(key, '$value');
  }

  String remove(String key) {
    String value = _element.$dom_getAttribute(key);
    _element.$dom_removeAttribute(key);
    return value;
  }

  /**
   * The number of {key, value} pairs in the map.
   */
  int get length {
    return keys.length;
  }

  bool _matches(Node node) => node.$dom_namespaceUri == null;
}

/**
 * Wrapper to expose namespaced attributes as a typed map.
 */
class _NamespacedAttributeMap extends _AttributeMap {

  final String _namespace;

  _NamespacedAttributeMap(Element element, this._namespace): super(element);

  bool containsKey(String key) {
    return _element.$dom_hasAttributeNS(_namespace, key);
  }

  String operator [](String key) {
    return _element.$dom_getAttributeNS(_namespace, key);
  }

  void operator []=(String key, value) {
    _element.$dom_setAttributeNS(_namespace, key, '$value');
  }

  String remove(String key) {
    String value = this[key];
    _element.$dom_removeAttributeNS(_namespace, key);
    return value;
  }

  /**
   * The number of {key, value} pairs in the map.
   */
  int get length {
    return keys.length;
  }

  bool _matches(Node node) => node.$dom_namespaceUri == _namespace;
}


/**
 * Provides a Map abstraction on top of data-* attributes, similar to the
 * dataSet in the old DOM.
 */
class _DataAttributeMap implements Map<String, String> {

  final Map<String, String> $dom_attributes;

  _DataAttributeMap(this.$dom_attributes);

  // interface Map

  // TODO: Use lazy iterator when it is available on Map.
  bool containsValue(String value) => values.some((v) => v == value);

  bool containsKey(String key) => $dom_attributes.containsKey(_attr(key));

  String operator [](String key) => $dom_attributes[_attr(key)];

  void operator []=(String key, value) {
    $dom_attributes[_attr(key)] = '$value';
  }

  String putIfAbsent(String key, String ifAbsent()) =>
    $dom_attributes.putIfAbsent(_attr(key), ifAbsent);

  String remove(String key) => $dom_attributes.remove(_attr(key));

  void clear() {
    // Needs to operate on a snapshot since we are mutating the collection.
    for (String key in keys) {
      remove(key);
    }
  }

  void forEach(void f(String key, String value)) {
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        f(_strip(key), value);
      }
    });
  }

  Collection<String> get keys {
    final keys = new List<String>();
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        keys.add(_strip(key));
      }
    });
    return keys;
  }

  Collection<String> get values {
    final values = new List<String>();
    $dom_attributes.forEach((String key, String value) {
      if (_matches(key)) {
        values.add(value);
      }
    });
    return values;
  }

  int get length => keys.length;

  // TODO: Use lazy iterator when it is available on Map.
  bool get isEmpty => length == 0;

  // Helpers.
  String _attr(String key) => 'data-$key';
  bool _matches(String key) => key.startsWith('data-');
  String _strip(String key) => key.substring(5);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * An object representing the top-level context object for web scripting.
 *
 * In a web browser, a [Window] object represents the actual browser window.
 * In a multi-tabbed browser, each tab has its own [Window] object. A [Window]
 * is the container that displays a [Document]'s content. All web scripting
 * happens within the context of a [Window] object.
 *
 * **Note:** This class represents any window, whereas [LocalWindow] is
 * used to access the properties and content of the current window.
 *
 * See also:
 *
 * * [DOM Window](https://developer.mozilla.org/en-US/docs/DOM/window) from MDN.
 * * [Window](http://www.w3.org/TR/Window/) from the W3C.
 */
abstract class Window {
  // Fields.

  /**
   * The current location of this window.
   *
   *     Location currentLocation = window.location;
   *     print(currentLocation.href); // 'http://www.example.com:80/'
   */
  Location get location;
  History get history;

  /**
   * Indicates whether this window has been closed.
   *
   *     print(window.closed); // 'false'
   *     window.close();
   *     print(window.closed); // 'true'
   */
  bool get closed;

  /**
   * A reference to the window that opened this one.
   *
   *     Window thisWindow = window;
   *     Window otherWindow = thisWindow.open('http://www.example.com/', 'foo');
   *     print(otherWindow.opener == thisWindow); // 'true'
   */
  Window get opener;

  /**
   * A reference to the parent of this window.
   *
   * If this [Window] has no parent, [parent] will return a reference to
   * the [Window] itself.
   *
   *     IFrameElement myIFrame = new IFrameElement();
   *     window.document.body.elements.add(myIFrame);
   *     print(myIframe.contentWindow.parent == window) // 'true'
   *
   *     print(window.parent == window) // 'true'
   */
  Window get parent;

  /**
   * A reference to the topmost window in the window hierarchy.
   *
   * If this [Window] is the topmost [Window], [top] will return a reference to
   * the [Window] itself.
   *
   *     // Add an IFrame to the current window.
   *     IFrameElement myIFrame = new IFrameElement();
   *     window.document.body.elements.add(myIFrame);
   *
   *     // Add an IFrame inside of the other IFrame.
   *     IFrameElement innerIFrame = new IFrameElement();
   *     myIFrame.elements.add(innerIFrame);
   *
   *     print(myIframe.contentWindow.top == window) // 'true'
   *     print(innerIFrame.contentWindow.top == window) // 'true'
   *
   *     print(window.top == window) // 'true'
   */
  Window get top;

  // Methods.
  /**
   * Closes the window.
   *
   * This method should only succeed if the [Window] object is
   * **script-closeable** and the window calling [close] is allowed to navigate
   * the window.
   *
   * A window is script-closeable if it is either a window
   * that was opened by another window, or if it is a window with only one
   * document in its history.
   *
   * A window might not be allowed to navigate, and therefore close, another
   * window due to browser security features.
   *
   *     var other = window.open('http://www.example.com', 'foo');
   *     // Closes other window, as it is script-closeable.
   *     other.close();
   *     print(other.closed()); // 'true'
   *
   *     window.location('http://www.mysite.com', 'foo');
   *     // Does not close this window, as the history has changed.
   *     window.close();
   *     print(window.closed()); // 'false'
   *
   * See also:
   *
   * * [Window close discussion](http://www.w3.org/TR/html5/browsers.html#dom-window-close) from the W3C
   */
  void close();
  void postMessage(var message, String targetOrigin, [List messagePorts]);
}

abstract class Location {
  void set href(String val);
}

abstract class History {
  void back();
  void forward();
  void go(int distance);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


abstract class CssClassSet implements Set<String> {

  String toString() {
    return Strings.join(new List.from(readClasses()), ' ');
  }

  /**
   * Adds the class [token] to the element if it is not on it, removes it if it
   * is.
   */
  bool toggle(String value) {
    Set<String> s = readClasses();
    bool result = false;
    if (s.contains(value)) {
      s.remove(value);
    } else {
      s.add(value);
      result = true;
    }
    writeClasses(s);
    return result;
  }

  /**
   * Returns [:true:] if classes cannot be added or removed from this
   * [:CssClassSet:].
   */
  bool get frozen => false;

  // interface Iterable - BEGIN
  Iterator<String> iterator() => readClasses().iterator();
  // interface Iterable - END

  // interface Collection - BEGIN
  void forEach(void f(String element)) {
    readClasses().forEach(f);
  }

  Collection map(f(String element)) => readClasses().map(f);

  Collection<String> filter(bool f(String element)) => readClasses().filter(f);

  bool every(bool f(String element)) => readClasses().every(f);

  bool some(bool f(String element)) => readClasses().some(f);

  bool get isEmpty => readClasses().isEmpty;

  int get length =>readClasses().length;

  dynamic reduce(dynamic initialValue,
      dynamic combine(dynamic previousValue, String element)) {
    return readClasses().reduce(initialValue, combine);
  }
  // interface Collection - END

  // interface Set - BEGIN
  bool contains(String value) => readClasses().contains(value);

  void add(String value) {
    // TODO - figure out if we need to do any validation here
    // or if the browser natively does enough
    _modify((s) => s.add(value));
  }

  bool remove(String value) {
    Set<String> s = readClasses();
    bool result = s.remove(value);
    writeClasses(s);
    return result;
  }

  void addAll(Collection<String> collection) {
    // TODO - see comment above about validation
    _modify((s) => s.addAll(collection));
  }

  void removeAll(Collection<String> collection) {
    _modify((s) => s.removeAll(collection));
  }

  bool isSubsetOf(Collection<String> collection) =>
    readClasses().isSubsetOf(collection);

  bool containsAll(Collection<String> collection) =>
    readClasses().containsAll(collection);

  Set<String> intersection(Collection<String> other) =>
    readClasses().intersection(other);

  void clear() {
    _modify((s) => s.clear());
  }
  // interface Set - END

  /**
   * Helper method used to modify the set of css classes on this element.
   *
   *   f - callback with:
   *      s - a Set of all the css class name currently on this element.
   *
   *   After f returns, the modified set is written to the
   *       className property of this element.
   */
  void _modify( f(Set<String> s)) {
    Set<String> s = readClasses();
    f(s);
    writeClasses(s);
  }

  /**
   * Read the class names from the Element class property,
   * and put them into a set (duplicates are discarded).
   * This is intended to be overridden by specific implementations.
   */
  Set<String> readClasses();

  /**
   * Join all the elements of a set into one string and write
   * back to the element.
   * This is intended to be overridden by specific implementations.
   */
  void writeClasses(Set<String> s);
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


typedef void EventListener(Event event);
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Works with KeyboardEvent and KeyEvent to determine how to expose information
 * about Key(board)Events. This class functions like an EventListenerList, and
 * provides a consistent interface for the Dart
 * user, despite the fact that a multitude of browsers that have varying
 * keyboard default behavior.
 *
 * This class is very much a work in progress, and we'd love to get information
 * on how we can make this class work with as many international keyboards as
 * possible. Bugs welcome!
 */
class KeyboardEventController {
  // This code inspired by Closure's KeyHandling library.
  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keyhandler.js.source.html

  /**
   * The set of keys that have been pressed down without seeing their
   * corresponding keyup event.
   */
  List<KeyboardEvent> _keyDownList;

  /** The set of functions that wish to be notified when a KeyEvent happens. */
  List<Function> _callbacks;

  /** The type of KeyEvent we are tracking (keyup, keydown, keypress). */
  String _type;

  /** The element we are watching for events to happen on. */
  EventTarget _target;

  // The distance to shift from upper case alphabet Roman letters to lower case.
  final int _ROMAN_ALPHABET_OFFSET = "a".charCodes[0] - "A".charCodes[0];

  // Instance members referring to the internal event handlers because closures
  // are not hashable.
  var _keyUp, _keyDown, _keyPress;

  /**
   * An enumeration of key identifiers currently part of the W3C draft for DOM3
   * and their mappings to keyCodes.
   * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set
   */
  static Map<String, int> _keyIdentifier = {
    'Up': KeyCode.UP,
    'Down': KeyCode.DOWN,
    'Left': KeyCode.LEFT,
    'Right': KeyCode.RIGHT,
    'Enter': KeyCode.ENTER,
    'F1': KeyCode.F1,
    'F2': KeyCode.F2,
    'F3': KeyCode.F3,
    'F4': KeyCode.F4,
    'F5': KeyCode.F5,
    'F6': KeyCode.F6,
    'F7': KeyCode.F7,
    'F8': KeyCode.F8,
    'F9': KeyCode.F9,
    'F10': KeyCode.F10,
    'F11': KeyCode.F11,
    'F12': KeyCode.F12,
    'U+007F': KeyCode.DELETE,
    'Home': KeyCode.HOME,
    'End': KeyCode.END,
    'PageUp': KeyCode.PAGE_UP,
    'PageDown': KeyCode.PAGE_DOWN,
    'Insert': KeyCode.INSERT
  };

  /** Named constructor to add an onKeyPress event listener to our handler. */
  KeyboardEventController.keypress(EventTarget target) {
    _KeyboardEventController(target, 'keypress');
  }

  /** Named constructor to add an onKeyUp event listener to our handler. */
  KeyboardEventController.keyup(EventTarget target) {
    _KeyboardEventController(target, 'keyup');
  }

  /** Named constructor to add an onKeyDown event listener to our handler. */
  KeyboardEventController.keydown(EventTarget target) {
    _KeyboardEventController(target, 'keydown');
  }

  /**
   * General constructor, performs basic initialization for our improved
   * KeyboardEvent controller.
   */
  _KeyboardEventController(EventTarget target, String type) {
    _callbacks = [];
    _type = type;
    _target = target;
    _keyDown = processKeyDown;
    _keyUp = processKeyUp;
    _keyPress = processKeyPress;
  }

  /**
   * Hook up all event listeners under the covers so we can estimate keycodes
   * and charcodes when they are not provided.
   */
  void _initializeAllEventListeners() {
    _keyDownList = [];
    _target.on.keyDown.add(_keyDown, true);
    _target.on.keyPress.add(_keyPress, true);
    _target.on.keyUp.add(_keyUp, true);
  }

  /** Add a callback that wishes to be notified when a KeyEvent occurs. */
  void add(void callback(KeyEvent)) {
    if (_callbacks.length == 0) {
      _initializeAllEventListeners();
    }
    _callbacks.add(callback);
  }

  /**
   * Notify all callback listeners that a KeyEvent of the relevant type has
   * occurred.
   */
  bool _dispatch(KeyEvent event) {
    if (event.type == _type) {
      // Make a copy of the listeners in case a callback gets removed while
      // dispatching from the list.
      List callbacksCopy = new List.from(_callbacks);
      for(var callback in callbacksCopy) {
        callback(event);
      }
    }
  }

  /** Remove the given callback from the listeners list. */
  void remove(void callback(KeyEvent)) {
    var index = _callbacks.indexOf(callback);
    if (index != -1) {
      _callbacks.removeAt(index);
    }
    if (_callbacks.length == 0) {
      // If we have no listeners, don't bother keeping track of keypresses.
      _target.on.keyDown.remove(_keyDown);
      _target.on.keyPress.remove(_keyPress);
      _target.on.keyUp.remove(_keyUp);
    }
  }

  /** Determine if caps lock is one of the currently depressed keys. */
  bool get _capsLockOn =>
      _keyDownList.some((var element) => element.keyCode == KeyCode.CAPS_LOCK);

  /**
   * Given the previously recorded keydown key codes, see if we can determine
   * the keycode of this keypress [event]. (Generally browsers only provide
   * charCode information for keypress events, but with a little
   * reverse-engineering, we can also determine the keyCode.) Returns
   * KeyCode.UNKNOWN if the keycode could not be determined.
   */
  int _determineKeyCodeForKeypress(KeyboardEvent event) {
    // Note: This function is a work in progress. We'll expand this function
    // once we get more information about other keyboards.
    for (var prevEvent in _keyDownList) {
      if (prevEvent._shadowCharCode == event.charCode) {
        return prevEvent.keyCode;
      }
      if ((event.shiftKey || _capsLockOn) && event.charCode >= "A".charCodes[0]
          && event.charCode <= "Z".charCodes[0] && event.charCode +
          _ROMAN_ALPHABET_OFFSET == prevEvent._shadowCharCode) {
        return prevEvent.keyCode;
      }
    }
    return KeyCode.UNKNOWN;
  }

  /**
   * Given the charater code returned from a keyDown [event], try to ascertain
   * and return the corresponding charCode for the character that was pressed.
   * This information is not shown to the user, but used to help polyfill
   * keypress events.
   */
  int _findCharCodeKeyDown(KeyboardEvent event) {
    if (event.keyLocation == 3) { // Numpad keys.
      switch (event.keyCode) {
        case KeyCode.NUM_ZERO:
          // Even though this function returns _charCodes_, for some cases the
          // KeyCode == the charCode we want, in which case we use the keycode
          // constant for readability.
          return KeyCode.ZERO;
        case KeyCode.NUM_ONE:
          return KeyCode.ONE;
        case KeyCode.NUM_TWO:
          return KeyCode.TWO;
        case KeyCode.NUM_THREE:
          return KeyCode.THREE;
        case KeyCode.NUM_FOUR:
          return KeyCode.FOUR;
        case KeyCode.NUM_FIVE:
          return KeyCode.FIVE;
        case KeyCode.NUM_SIX:
          return KeyCode.SIX;
        case KeyCode.NUM_SEVEN:
          return KeyCode.SEVEN;
        case KeyCode.NUM_EIGHT:
          return KeyCode.EIGHT;
        case KeyCode.NUM_NINE:
          return KeyCode.NINE;
        case KeyCode.NUM_MULTIPLY:
          return 42; // Char code for *
        case KeyCode.NUM_PLUS:
          return 43; // +
        case KeyCode.NUM_MINUS:
          return 45; // -
        case KeyCode.NUM_PERIOD:
          return 46; // .
        case KeyCode.NUM_DIVISION:
          return 47; // /
      }
    } else if (event.keyCode >= 65 && event.keyCode <= 90) {
      // Set the "char code" for key down as the lower case letter. Again, this
      // will not show up for the user, but will be helpful in estimating
      // keyCode locations and other information during the keyPress event.
      return event.keyCode + _ROMAN_ALPHABET_OFFSET;
    }
    switch(event.keyCode) {
      case KeyCode.SEMICOLON:
        return KeyCode.FF_SEMICOLON;
      case KeyCode.EQUALS:
        return KeyCode.FF_EQUALS;
      case KeyCode.COMMA:
        return 44; // Ascii value for ,
      case KeyCode.DASH:
        return 45; // -
      case KeyCode.PERIOD:
        return 46; // .
      case KeyCode.SLASH:
        return 47; // /
      case KeyCode.APOSTROPHE:
        return 96; // `
      case KeyCode.OPEN_SQUARE_BRACKET:
        return 91; // [
      case KeyCode.BACKSLASH:
        return 92; // \
      case KeyCode.CLOSE_SQUARE_BRACKET:
        return 93; // ]
      case KeyCode.SINGLE_QUOTE:
        return 39; // '
    }
    return event.keyCode;
  }

  /**
   * Returns true if the key fires a keypress event in the current browser.
   */
  bool _firesKeyPressEvent(KeyEvent event) {
    if (!_Device.isIE && !_Device.isWebKit) {
      return true;
    }

    if (_Device.userAgent.contains('Mac') && event.altKey) {
      return KeyCode.isCharacterKey(event.keyCode);
    }

    // Alt but not AltGr which is represented as Alt+Ctrl.
    if (event.altKey && !event.ctrlKey) {
      return false;
    }

    // Saves Ctrl or Alt + key for IE and WebKit, which won't fire keypress.
    if (!event.shiftKey &&
        (_keyDownList.last.keyCode == KeyCode.CTRL ||
         _keyDownList.last.keyCode == KeyCode.ALT ||
         _Device.userAgent.contains('Mac') &&
         _keyDownList.last.keyCode == KeyCode.META)) {
      return false;
    }

    // Some keys with Ctrl/Shift do not issue keypress in WebKit.
    if (_Device.isWebKit && event.ctrlKey && event.shiftKey && (
        event.keyCode == KeyCode.BACKSLASH ||
        event.keyCode == KeyCode.OPEN_SQUARE_BRACKET ||
        event.keyCode == KeyCode.CLOSE_SQUARE_BRACKET ||
        event.keyCode == KeyCode.TILDE ||
        event.keyCode == KeyCode.SEMICOLON || event.keyCode == KeyCode.DASH ||
        event.keyCode == KeyCode.EQUALS || event.keyCode == KeyCode.COMMA ||
        event.keyCode == KeyCode.PERIOD || event.keyCode == KeyCode.SLASH ||
        event.keyCode == KeyCode.APOSTROPHE ||
        event.keyCode == KeyCode.SINGLE_QUOTE)) {
      return false;
    }

    switch (event.keyCode) {
      case KeyCode.ENTER:
        // IE9 does not fire keypress on ENTER.
        return !_Device.isIE;
      case KeyCode.ESC:
        return !_Device.isWebKit;
    }

    return KeyCode.isCharacterKey(event.keyCode);
  }

  /**
   * Normalize the keycodes to the IE KeyCodes (this is what Chrome, IE, and
   * Opera all use).
   */
  int _normalizeKeyCodes(KeyboardEvent event) {
    // Note: This may change once we get input about non-US keyboards.
    if (_Device.isFirefox) {
      switch(event.keyCode) {
        case KeyCode.FF_EQUALS:
          return KeyCode.EQUALS;
        case KeyCode.FF_SEMICOLON:
          return KeyCode.SEMICOLON;
        case KeyCode.MAC_FF_META:
          return KeyCode.META;
        case KeyCode.WIN_KEY_FF_LINUX:
          return KeyCode.WIN_KEY;
      }
    }
    return event.keyCode;
  }

  /** Handle keydown events. */
  void processKeyDown(KeyboardEvent e) {
    // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window
    // before we've caught a key-up event.  If the last-key was one of these
    // we reset the state.
    if (_keyDownList.length > 0 &&
        (_keyDownList.last.keyCode == KeyCode.CTRL && !e.ctrlKey ||
         _keyDownList.last.keyCode == KeyCode.ALT && !e.altKey ||
         _Device.userAgent.contains('Mac') &&
         _keyDownList.last.keyCode == KeyCode.META && !e.metaKey)) {
      _keyDownList = [];
    }

    var event = new KeyEvent(e);
    event._shadowKeyCode = _normalizeKeyCodes(event);
    // Technically a "keydown" event doesn't have a charCode. This is
    // calculated nonetheless to provide us with more information in giving
    // as much information as possible on keypress about keycode and also
    // charCode.
    event._shadowCharCode = _findCharCodeKeyDown(event);
    if (_keyDownList.length > 0 && event.keyCode != _keyDownList.last.keyCode &&
        !_firesKeyPressEvent(event)) {
      // Some browsers have quirks not firing keypress events where all other
      // browsers do. This makes them more consistent.
      processKeyPress(event);
    }
    _keyDownList.add(event);
    _dispatch(event);
  }

  /** Handle keypress events. */
  void processKeyPress(KeyboardEvent event) {
    var e = new KeyEvent(event);
    // IE reports the character code in the keyCode field for keypress events.
    // There are two exceptions however, Enter and Escape.
    if (_Device.isIE) {
      if (e.keyCode == KeyCode.ENTER || e.keyCode == KeyCode.ESC) {
        e._shadowCharCode = 0;
      } else {
        e._shadowCharCode = e.keyCode;
      }
    } else if (_Device.isOpera) {
      // Opera reports the character code in the keyCode field.
      e._shadowCharCode = KeyCode.isCharacterKey(e.keyCode) ? e.keyCode : 0;
    }
    // Now we guestimate about what the keycode is that was actually
    // pressed, given previous keydown information.
    e._shadowKeyCode = _determineKeyCodeForKeypress(e);

    // Correct the key value for certain browser-specific quirks.
    if (e._shadowKeyIdentifier != null &&
        _keyIdentifier.containsKey(e._shadowKeyIdentifier)) {
      // This is needed for Safari Windows because it currently doesn't give a
      // keyCode/which for non printable keys.
      e._shadowKeyCode = _keyIdentifier[e._shadowKeyIdentifier];
    }
    e._shadowAltKey = _keyDownList.some((var element) => element.altKey);
    _dispatch(e);
  }

  /** Handle keyup events. */
  void processKeyUp(KeyboardEvent event) {
    var e = new KeyEvent(event);
    KeyboardEvent toRemove = null;
    for (var key in _keyDownList) {
      if (key.keyCode == e.keyCode) {
        toRemove = key;
      }
    }
    if (toRemove != null) {
      _keyDownList = _keyDownList.filter((element) => element != toRemove);
    } else if (_keyDownList.length > 0) {
      // This happens when we've reached some international keyboard case we
      // haven't accounted for or we haven't correctly eliminated all browser
      // inconsistencies. Filing bugs on when this is reached is welcome!
      _keyDownList.removeLast();
    }
    _dispatch(e);
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Defines the keycode values for keys that are returned by 
 * KeyboardEvent.keyCode.
 * 
 * Important note: There is substantial divergence in how different browsers
 * handle keycodes and their variants in different locales/keyboard layouts. We
 * provide these constants to help make code processing keys more readable.
 */
abstract class KeyCode {
  // These constant names were borrowed from Closure's Keycode enumeration
  // class.
  // http://closure-library.googlecode.com/svn/docs/closure_goog_events_keycodes.js.source.html  
  static const int WIN_KEY_FF_LINUX = 0;
  static const int MAC_ENTER = 3;
  static const int BACKSPACE = 8;
  static const int TAB = 9;
  /** NUM_CENTER is also NUMLOCK for FF and Safari on Mac. */
  static const int NUM_CENTER = 12;
  static const int ENTER = 13;
  static const int SHIFT = 16;
  static const int CTRL = 17;
  static const int ALT = 18;
  static const int PAUSE = 19;
  static const int CAPS_LOCK = 20;
  static const int ESC = 27;
  static const int SPACE = 32;
  static const int PAGE_UP = 33;
  static const int PAGE_DOWN = 34;
  static const int END = 35;
  static const int HOME = 36;
  static const int LEFT = 37;
  static const int UP = 38;
  static const int RIGHT = 39;
  static const int DOWN = 40;
  static const int NUM_NORTH_EAST = 33;
  static const int NUM_SOUTH_EAST = 34;
  static const int NUM_SOUTH_WEST = 35;
  static const int NUM_NORTH_WEST = 36;
  static const int NUM_WEST = 37;
  static const int NUM_NORTH = 38;
  static const int NUM_EAST = 39;
  static const int NUM_SOUTH = 40;
  static const int PRINT_SCREEN = 44;
  static const int INSERT = 45;
  static const int NUM_INSERT = 45;
  static const int DELETE = 46;
  static const int NUM_DELETE = 46;
  static const int ZERO = 48;
  static const int ONE = 49;
  static const int TWO = 50;
  static const int THREE = 51;
  static const int FOUR = 52;
  static const int FIVE = 53;
  static const int SIX = 54;
  static const int SEVEN = 55;
  static const int EIGHT = 56;
  static const int NINE = 57;
  static const int FF_SEMICOLON = 59;
  static const int FF_EQUALS = 61;
  /**
   * CAUTION: The question mark is for US-keyboard layouts. It varies
   * for other locales and keyboard layouts.
   */
  static const int QUESTION_MARK = 63;
  static const int A = 65;
  static const int B = 66;
  static const int C = 67;
  static const int D = 68;
  static const int E = 69;
  static const int F = 70;
  static const int G = 71;
  static const int H = 72;
  static const int I = 73;
  static const int J = 74;
  static const int K = 75;
  static const int L = 76;
  static const int M = 77;
  static const int N = 78;
  static const int O = 79;
  static const int P = 80;
  static const int Q = 81;
  static const int R = 82;
  static const int S = 83;
  static const int T = 84;
  static const int U = 85;
  static const int V = 86;
  static const int W = 87;
  static const int X = 88;
  static const int Y = 89;
  static const int Z = 90;
  static const int META = 91;
  static const int WIN_KEY_LEFT = 91;
  static const int WIN_KEY_RIGHT = 92;
  static const int CONTEXT_MENU = 93;
  static const int NUM_ZERO = 96;
  static const int NUM_ONE = 97;
  static const int NUM_TWO = 98;
  static const int NUM_THREE = 99;
  static const int NUM_FOUR = 100;
  static const int NUM_FIVE = 101;
  static const int NUM_SIX = 102;
  static const int NUM_SEVEN = 103;
  static const int NUM_EIGHT = 104;
  static const int NUM_NINE = 105;
  static const int NUM_MULTIPLY = 106;
  static const int NUM_PLUS = 107;
  static const int NUM_MINUS = 109;
  static const int NUM_PERIOD = 110;
  static const int NUM_DIVISION = 111;
  static const int F1 = 112;
  static const int F2 = 113;
  static const int F3 = 114;
  static const int F4 = 115;
  static const int F5 = 116;
  static const int F6 = 117;
  static const int F7 = 118;
  static const int F8 = 119;
  static const int F9 = 120;
  static const int F10 = 121;
  static const int F11 = 122;
  static const int F12 = 123;
  static const int NUMLOCK = 144;
  static const int SCROLL_LOCK = 145;

  // OS-specific media keys like volume controls and browser controls.
  static const int FIRST_MEDIA_KEY = 166;
  static const int LAST_MEDIA_KEY = 183;

  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int SEMICOLON = 186;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int DASH = 189;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int EQUALS = 187;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int COMMA = 188;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int PERIOD = 190;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int SLASH = 191;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int APOSTROPHE = 192;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int TILDE = 192;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int SINGLE_QUOTE = 222;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int OPEN_SQUARE_BRACKET = 219;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int BACKSLASH = 220;
  /**
   * CAUTION: This constant requires localization for other locales and keyboard
   * layouts.
   */
  static const int CLOSE_SQUARE_BRACKET = 221;
  static const int WIN_KEY = 224;
  static const int MAC_FF_META = 224;
  static const int WIN_IME = 229;

  /** A sentinel value if the keycode could not be determined. */
  static const int UNKNOWN = -1;

  /**
   * Returns true if the keyCode produces a (US keyboard) character.
   * Note: This does not (yet) cover characters on non-US keyboards (Russian,
   * Hebrew, etc.).
   */
  static bool isCharacterKey(int keyCode) {
    if ((keyCode >= ZERO && keyCode <= NINE) ||
        (keyCode >= NUM_ZERO && keyCode <= NUM_MULTIPLY) ||
        (keyCode >= A && keyCode <= Z)) {
      return true;
    }
 
    // Safari sends zero key code for non-latin characters.
    if (_Device.isWebKit && keyCode == 0) {
      return true;
    }
 
    return (keyCode == SPACE || keyCode == QUESTION_MARK || keyCode == NUM_PLUS
        || keyCode == NUM_MINUS || keyCode == NUM_PERIOD ||
        keyCode == NUM_DIVISION || keyCode == SEMICOLON ||
        keyCode == FF_SEMICOLON || keyCode == DASH || keyCode == EQUALS ||
        keyCode == FF_EQUALS || keyCode == COMMA || keyCode == PERIOD ||
        keyCode == SLASH || keyCode == APOSTROPHE || keyCode == SINGLE_QUOTE ||
        keyCode == OPEN_SQUARE_BRACKET || keyCode == BACKSLASH ||
        keyCode == CLOSE_SQUARE_BRACKET);
  }
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Defines the standard key locations returned by
 * KeyboardEvent.getKeyLocation.
 */
abstract class KeyLocation {

  /**
   * The event key is not distinguished as the left or right version
   * of the key, and did not originate from the numeric keypad (or did not
   * originate with a virtual key corresponding to the numeric keypad).
   */
  static const int STANDARD = 0;

  /**
   * The event key is in the left key location.
   */
  static const int LEFT = 1;

  /**
   * The event key is in the right key location.
   */
  static const int RIGHT = 2;

  /**
   * The event key originated on the numeric keypad or with a virtual key
   * corresponding to the numeric keypad.
   */
  static const int NUMPAD = 3;

  /**
   * The event key originated on a mobile device, either on a physical
   * keypad or a virtual keyboard.
   */
  static const int MOBILE = 4;

  /**
   * The event key originated on a game controller or a joystick on a mobile
   * device.
   */
  static const int JOYSTICK = 5;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Defines the standard keyboard identifier names for keys that are returned
 * by KeyEvent.getKeyboardIdentifier when the key does not have a direct
 * unicode mapping.
 */
abstract class KeyName {

  /** The Accept (Commit, OK) key */
  static const String ACCEPT = "Accept";

  /** The Add key */
  static const String ADD = "Add";

  /** The Again key */
  static const String AGAIN = "Again";

  /** The All Candidates key */
  static const String ALL_CANDIDATES = "AllCandidates";

  /** The Alphanumeric key */
  static const String ALPHANUMERIC = "Alphanumeric";

  /** The Alt (Menu) key */
  static const String ALT = "Alt";

  /** The Alt-Graph key */
  static const String ALT_GRAPH = "AltGraph";

  /** The Application key */
  static const String APPS = "Apps";

  /** The ATTN key */
  static const String ATTN = "Attn";

  /** The Browser Back key */
  static const String BROWSER_BACK = "BrowserBack";

  /** The Browser Favorites key */
  static const String BROWSER_FAVORTIES = "BrowserFavorites";

  /** The Browser Forward key */
  static const String BROWSER_FORWARD = "BrowserForward";

  /** The Browser Home key */
  static const String BROWSER_NAME = "BrowserHome";

  /** The Browser Refresh key */
  static const String BROWSER_REFRESH = "BrowserRefresh";

  /** The Browser Search key */
  static const String BROWSER_SEARCH = "BrowserSearch";

  /** The Browser Stop key */
  static const String BROWSER_STOP = "BrowserStop";

  /** The Camera key */
  static const String CAMERA = "Camera";

  /** The Caps Lock (Capital) key */
  static const String CAPS_LOCK = "CapsLock";

  /** The Clear key */
  static const String CLEAR = "Clear";

  /** The Code Input key */
  static const String CODE_INPUT = "CodeInput";

  /** The Compose key */
  static const String COMPOSE = "Compose";

  /** The Control (Ctrl) key */
  static const String CONTROL = "Control";

  /** The Crsel key */
  static const String CRSEL = "Crsel";

  /** The Convert key */
  static const String CONVERT = "Convert";

  /** The Copy key */
  static const String COPY = "Copy";

  /** The Cut key */
  static const String CUT = "Cut";

  /** The Decimal key */
  static const String DECIMAL = "Decimal";

  /** The Divide key */
  static const String DIVIDE = "Divide";

  /** The Down Arrow key */
  static const String DOWN = "Down";

  /** The diagonal Down-Left Arrow key */
  static const String DOWN_LEFT = "DownLeft";

  /** The diagonal Down-Right Arrow key */
  static const String DOWN_RIGHT = "DownRight";

  /** The Eject key */
  static const String EJECT = "Eject";

  /** The End key */
  static const String END = "End";

  /**
   * The Enter key. Note: This key value must also be used for the Return
   *  (Macintosh numpad) key
   */
  static const String ENTER = "Enter";

  /** The Erase EOF key */
  static const String ERASE_EOF= "EraseEof";

  /** The Execute key */
  static const String EXECUTE = "Execute";

  /** The Exsel key */
  static const String EXSEL = "Exsel";

  /** The Function switch key */
  static const String FN = "Fn";

  /** The F1 key */
  static const String F1 = "F1";

  /** The F2 key */
  static const String F2 = "F2";

  /** The F3 key */
  static const String F3 = "F3";

  /** The F4 key */
  static const String F4 = "F4";

  /** The F5 key */
  static const String F5 = "F5";

  /** The F6 key */
  static const String F6 = "F6";

  /** The F7 key */
  static const String F7 = "F7";

  /** The F8 key */
  static const String F8 = "F8";

  /** The F9 key */
  static const String F9 = "F9";

  /** The F10 key */
  static const String F10 = "F10";

  /** The F11 key */
  static const String F11 = "F11";

  /** The F12 key */
  static const String F12 = "F12";

  /** The F13 key */
  static const String F13 = "F13";

  /** The F14 key */
  static const String F14 = "F14";

  /** The F15 key */
  static const String F15 = "F15";

  /** The F16 key */
  static const String F16 = "F16";

  /** The F17 key */
  static const String F17 = "F17";

  /** The F18 key */
  static const String F18 = "F18";

  /** The F19 key */
  static const String F19 = "F19";

  /** The F20 key */
  static const String F20 = "F20";

  /** The F21 key */
  static const String F21 = "F21";

  /** The F22 key */
  static const String F22 = "F22";

  /** The F23 key */
  static const String F23 = "F23";

  /** The F24 key */
  static const String F24 = "F24";

  /** The Final Mode (Final) key used on some asian keyboards */
  static const String FINAL_MODE = "FinalMode";

  /** The Find key */
  static const String FIND = "Find";

  /** The Full-Width Characters key */
  static const String FULL_WIDTH = "FullWidth";

  /** The Half-Width Characters key */
  static const String HALF_WIDTH = "HalfWidth";

  /** The Hangul (Korean characters) Mode key */
  static const String HANGUL_MODE = "HangulMode";

  /** The Hanja (Korean characters) Mode key */
  static const String HANJA_MODE = "HanjaMode";

  /** The Help key */
  static const String HELP = "Help";

  /** The Hiragana (Japanese Kana characters) key */
  static const String HIRAGANA = "Hiragana";

  /** The Home key */
  static const String HOME = "Home";

  /** The Insert (Ins) key */
  static const String INSERT = "Insert";

  /** The Japanese-Hiragana key */
  static const String JAPANESE_HIRAGANA = "JapaneseHiragana";

  /** The Japanese-Katakana key */
  static const String JAPANESE_KATAKANA = "JapaneseKatakana";

  /** The Japanese-Romaji key */
  static const String JAPANESE_ROMAJI = "JapaneseRomaji";

  /** The Junja Mode key */
  static const String JUNJA_MODE = "JunjaMode";

  /** The Kana Mode (Kana Lock) key */
  static const String KANA_MODE = "KanaMode";

  /**
   * The Kanji (Japanese name for ideographic characters of Chinese origin)
   * Mode key
   */
  static const String KANJI_MODE = "KanjiMode";

  /** The Katakana (Japanese Kana characters) key */
  static const String KATAKANA = "Katakana";

  /** The Start Application One key */
  static const String LAUNCH_APPLICATION_1 = "LaunchApplication1";

  /** The Start Application Two key */
  static const String LAUNCH_APPLICATION_2 = "LaunchApplication2";

  /** The Start Mail key */
  static const String LAUNCH_MAIL = "LaunchMail";

  /** The Left Arrow key */
  static const String LEFT = "Left";

  /** The Menu key */
  static const String MENU = "Menu";

  /**
   * The Meta key. Note: This key value shall be also used for the Apple
   * Command key
   */
  static const String META = "Meta";

  /** The Media Next Track key */
  static const String MEDIA_NEXT_TRACK = "MediaNextTrack";

  /** The Media Play Pause key */
  static const String MEDIA_PAUSE_PLAY = "MediaPlayPause";

  /** The Media Previous Track key */
  static const String MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";

  /** The Media Stop key */
  static const String MEDIA_STOP = "MediaStop";

  /** The Mode Change key */
  static const String MODE_CHANGE = "ModeChange";

  /** The Next Candidate function key */
  static const String NEXT_CANDIDATE = "NextCandidate";

  /** The Nonconvert (Don't Convert) key */
  static const String NON_CONVERT = "Nonconvert";

  /** The Number Lock key */
  static const String NUM_LOCK = "NumLock";

  /** The Page Down (Next) key */
  static const String PAGE_DOWN = "PageDown";

  /** The Page Up key */
  static const String PAGE_UP = "PageUp";

  /** The Paste key */
  static const String PASTE = "Paste";

  /** The Pause key */
  static const String PAUSE = "Pause";

  /** The Play key */
  static const String PLAY = "Play";

  /**
   * The Power key. Note: Some devices may not expose this key to the
   * operating environment
   */
  static const String POWER = "Power";

  /** The Previous Candidate function key */
  static const String PREVIOUS_CANDIDATE = "PreviousCandidate";

  /** The Print Screen (PrintScrn, SnapShot) key */
  static const String PRINT_SCREEN = "PrintScreen";

  /** The Process key */
  static const String PROCESS = "Process";

  /** The Props key */
  static const String PROPS = "Props";

  /** The Right Arrow key */
  static const String RIGHT = "Right";

  /** The Roman Characters function key */
  static const String ROMAN_CHARACTERS = "RomanCharacters";

  /** The Scroll Lock key */
  static const String SCROLL = "Scroll";

  /** The Select key */
  static const String SELECT = "Select";

  /** The Select Media key */
  static const String SELECT_MEDIA = "SelectMedia";

  /** The Separator key */
  static const String SEPARATOR = "Separator";

  /** The Shift key */
  static const String SHIFT = "Shift";

  /** The Soft1 key */
  static const String SOFT_1 = "Soft1";

  /** The Soft2 key */
  static const String SOFT_2 = "Soft2";

  /** The Soft3 key */
  static const String SOFT_3 = "Soft3";

  /** The Soft4 key */
  static const String SOFT_4 = "Soft4";

  /** The Stop key */
  static const String STOP = "Stop";

  /** The Subtract key */
  static const String SUBTRACT = "Subtract";

  /** The Symbol Lock key */
  static const String SYMBOL_LOCK = "SymbolLock";

  /** The Up Arrow key */
  static const String UP = "Up";

  /** The diagonal Up-Left Arrow key */
  static const String UP_LEFT = "UpLeft";

  /** The diagonal Up-Right Arrow key */
  static const String UP_RIGHT = "UpRight";

  /** The Undo key */
  static const String UNDO = "Undo";

  /** The Volume Down key */
  static const String VOLUME_DOWN = "VolumeDown";

  /** The Volume Mute key */
  static const String VOLUMN_MUTE = "VolumeMute";

  /** The Volume Up key */
  static const String VOLUMN_UP = "VolumeUp";

  /** The Windows Logo key */
  static const String WIN = "Win";

  /** The Zoom key */
  static const String ZOOM = "Zoom";

  /**
   * The Backspace (Back) key. Note: This key value shall be also used for the
   * key labeled 'delete' MacOS keyboards when not modified by the 'Fn' key
   */
  static const String BACKSPACE = "Backspace";

  /** The Horizontal Tabulation (Tab) key */
  static const String TAB = "Tab";

  /** The Cancel key */
  static const String CANCEL = "Cancel";

  /** The Escape (Esc) key */
  static const String ESC = "Esc";

  /** The Space (Spacebar) key:   */
  static const String SPACEBAR = "Spacebar";

  /**
   * The Delete (Del) Key. Note: This key value shall be also used for the key
   * labeled 'delete' MacOS keyboards when modified by the 'Fn' key
   */
  static const String DEL = "Del";

  /** The Combining Grave Accent (Greek Varia, Dead Grave) key */
  static const String DEAD_GRAVE = "DeadGrave";

  /**
   * The Combining Acute Accent (Stress Mark, Greek Oxia, Tonos, Dead Eacute)
   * key
   */
  static const String DEAD_EACUTE = "DeadEacute";

  /** The Combining Circumflex Accent (Hat, Dead Circumflex) key */
  static const String DEAD_CIRCUMFLEX = "DeadCircumflex";

  /** The Combining Tilde (Dead Tilde) key */
  static const String DEAD_TILDE = "DeadTilde";

  /** The Combining Macron (Long, Dead Macron) key */
  static const String DEAD_MACRON = "DeadMacron";

  /** The Combining Breve (Short, Dead Breve) key */
  static const String DEAD_BREVE = "DeadBreve";

  /** The Combining Dot Above (Derivative, Dead Above Dot) key */
  static const String DEAD_ABOVE_DOT = "DeadAboveDot";

  /**
   * The Combining Diaeresis (Double Dot Abode, Umlaut, Greek Dialytika,
   * Double Derivative, Dead Diaeresis) key
   */
  static const String DEAD_UMLAUT = "DeadUmlaut";

  /** The Combining Ring Above (Dead Above Ring) key */
  static const String DEAD_ABOVE_RING = "DeadAboveRing";

  /** The Combining Double Acute Accent (Dead Doubleacute) key */
  static const String DEAD_DOUBLEACUTE = "DeadDoubleacute";

  /** The Combining Caron (Hacek, V Above, Dead Caron) key */
  static const String DEAD_CARON = "DeadCaron";

  /** The Combining Cedilla (Dead Cedilla) key */
  static const String DEAD_CEDILLA = "DeadCedilla";

  /** The Combining Ogonek (Nasal Hook, Dead Ogonek) key */
  static const String DEAD_OGONEK = "DeadOgonek";

  /**
   * The Combining Greek Ypogegrammeni (Greek Non-Spacing Iota Below, Iota
   * Subscript, Dead Iota) key
   */
  static const String DEAD_IOTA = "DeadIota";

  /**
   * The Combining Katakana-Hiragana Voiced Sound Mark (Dead Voiced Sound) key
   */
  static const String DEAD_VOICED_SOUND = "DeadVoicedSound";

  /**
   * The Combining Katakana-Hiragana Semi-Voiced Sound Mark (Dead Semivoiced
   * Sound) key
   */
  static const String DEC_SEMIVOICED_SOUND= "DeadSemivoicedSound";

  /**
   * Key value used when an implementation is unable to identify another key
   * value, due to either hardware, platform, or software constraints
   */
  static const String UNIDENTIFIED = "Unidentified";
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Contains the set of standard values returned by HTMLDocument.getReadyState.
 */
abstract class ReadyState {
  /**
   * Indicates the document is still loading and parsing.
   */
  static const String LOADING = "loading";

  /**
   * Indicates the document is finished parsing but is still loading
   * subresources.
   */
  static const String INTERACTIVE = "interactive";

  /**
   * Indicates the document and all subresources have been loaded.
   */
  static const String COMPLETE = "complete";
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// TODO(antonm): support not DOM isolates too.
class _Timer implements Timer {
  final canceller;

  _Timer(this.canceller);

  void cancel() { canceller(); }
}

get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool repeating) {
  var maker;
  var canceller;
  if (repeating) {
    maker = window.setInterval;
    canceller = window.clearInterval;
  } else {
    maker = window.setTimeout;
    canceller = window.clearTimeout;
  }
  Timer timer;
  final int id = maker(() { callback(timer); }, milliSeconds);
  timer = new _Timer(() { canceller(id); });
  return timer;
};
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _HttpRequestUtils {

  // Helper for factory HttpRequest.get
  static HttpRequest get(String url,
                            onSuccess(HttpRequest request),
                            bool withCredentials) {
    final request = new HttpRequest();
    request.open('GET', url, true);

    request.withCredentials = withCredentials;

    // Status 0 is for local XHR request.
    request.on.readyStateChange.add((e) {
      if (request.readyState == HttpRequest.DONE &&
          (request.status == 200 || request.status == 0)) {
        onSuccess(request);
      }
    });

    request.send();

    return request;
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _CustomEventFactoryProvider {
  static CustomEvent createCustomEvent(String type, [bool canBubble = true,
      bool cancelable = true, Object detail = null]) {
    final CustomEvent e = document.$dom_createEvent("CustomEvent");
    e.$dom_initCustomEvent(type, canBubble, cancelable, detail);
    return e;
  }
}

class _EventFactoryProvider {
  static Event createEvent(String type, [bool canBubble = true,
      bool cancelable = true]) {
    final Event e = document.$dom_createEvent("Event");
    e.$dom_initEvent(type, canBubble, cancelable);
    return e;
  }
}

class _MouseEventFactoryProvider {
  static MouseEvent createMouseEvent(String type, Window view, int detail,
      int screenX, int screenY, int clientX, int clientY, int button,
      [bool canBubble = true, bool cancelable = true, bool ctrlKey = false,
      bool altKey = false, bool shiftKey = false, bool metaKey = false,
      EventTarget relatedTarget = null]) {
    final e = document.$dom_createEvent("MouseEvent");
    e.$dom_initMouseEvent(type, canBubble, cancelable, view, detail,
        screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey,
        button, relatedTarget);
    return e;
  }
}

class _CssStyleDeclarationFactoryProvider {
  static CssStyleDeclaration createCssStyleDeclaration_css(String css) {
    final style = new Element.tag('div').style;
    style.cssText = css;
    return style;
  }

  static CssStyleDeclaration createCssStyleDeclaration() {
    return new CssStyleDeclaration.css('');
  }
}

class _DocumentFragmentFactoryProvider {
  /** @domName Document.createDocumentFragment */
  static DocumentFragment createDocumentFragment() =>
      document.createDocumentFragment();

  static DocumentFragment createDocumentFragment_html(String html) {
    final fragment = new DocumentFragment();
    fragment.innerHtml = html;
    return fragment;
  }

  // TODO(nweiz): enable this when XML is ported.
  // factory DocumentFragment.xml(String xml) {
  //   final fragment = new DocumentFragment();
  //   final e = new XMLElement.tag("xml");
  //   e.innerHtml = xml;
  //
  //   // Copy list first since we don't want liveness during iteration.
  //   final List nodes = new List.from(e.nodes);
  //   fragment.nodes.addAll(nodes);
  //   return fragment;
  // }

  static DocumentFragment createDocumentFragment_svg(String svgContent) {
    final fragment = new DocumentFragment();
    final e = new svg.SvgSvgElement();
    e.innerHtml = svgContent;

    // Copy list first since we don't want liveness during iteration.
    final List nodes = new List.from(e.nodes);
    fragment.nodes.addAll(nodes);
    return fragment;
  }
}
/**
 * A custom KeyboardEvent that attempts to eliminate cross-browser
 * inconsistencies, and also provide both keyCode and charCode information
 * for all key events (when such information can be determined).
 *
 * This class is very much a work in progress, and we'd love to get information
 * on how we can make this class work with as many international keyboards as
 * possible. Bugs welcome!
 */
class KeyEvent implements KeyboardEvent {
  /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
  KeyboardEvent _parent;

  /** The "fixed" value of whether the alt key is being pressed. */
  bool _shadowAltKey;

  /** Caculated value of what the estimated charCode is for this event. */
  int _shadowCharCode;

  /** Caculated value of what the estimated keyCode is for this event. */
  int _shadowKeyCode;

  /** Caculated value of what the estimated keyCode is for this event. */
  int get keyCode => _shadowKeyCode;

  /** Caculated value of what the estimated charCode is for this event. */
  int get charCode => this.type == 'keypress' ? _shadowCharCode : 0;

  /** Caculated value of whether the alt key is pressed is for this event. */
  bool get altKey => _shadowAltKey;

  /** Caculated value of what the estimated keyCode is for this event. */
  int get which => keyCode;

  /** Accessor to the underlying keyCode value is the parent event. */
  int get _realKeyCode => _parent.keyCode;

  /** Accessor to the underlying charCode value is the parent event. */
  int get _realCharCode => _parent.charCode;

  /** Accessor to the underlying altKey value is the parent event. */
  bool get _realAltKey => _parent.altKey;

  /** Construct a KeyEvent with [parent] as event we're emulating. */
  KeyEvent(KeyboardEvent parent) {
    _parent = parent;
    _shadowAltKey = _realAltKey;
    _shadowCharCode = _realCharCode;
    _shadowKeyCode = _realKeyCode;
  }

  /** True if the altGraphKey is pressed during this event. */
  bool get altGraphKey => _parent.altGraphKey;
  bool get bubbles => _parent.bubbles;
  /** True if this event can be cancelled. */
  bool get cancelable => _parent.cancelable;
  bool get cancelBubble => _parent.cancelBubble;
  void set cancelBubble(bool cancel) {
    _parent.cancelBubble = cancel;
  }
  /** Accessor to the clipboardData available for this event. */
  Clipboard get clipboardData => _parent.clipboardData;
  /** True if the ctrl key is pressed during this event. */
  bool get ctrlKey => _parent.ctrlKey;
  /** Accessor to the target this event is listening to for changes. */
  EventTarget get currentTarget => _parent.currentTarget;
  bool get defaultPrevented => _parent.defaultPrevented;
  int get detail => _parent.detail;
  int get eventPhase => _parent.eventPhase;
  /**
   * Accessor to the part of the keyboard that the key was pressed from (one of
   * KeyLocation.STANDARD, KeyLocation.RIGHT, KeyLocation.LEFT,
   * KeyLocation.NUMPAD, KeyLocation.MOBILE, KeyLocation.JOYSTICK).
   */
  int get keyLocation => _parent.keyLocation;
  int get layerX => _parent.layerX;
  int get layerY => _parent.layerY;
  /** True if the Meta (or Mac command) key is pressed during this event. */
  bool get metaKey => _parent.metaKey;
  int get pageX => _parent.pageX;
  int get pageY => _parent.pageY;
  bool get returnValue => _parent.returnValue;
  void set returnValue(bool value) {
    _parent.returnValue = value;
  }
  /** True if the shift key was pressed during this event. */
  bool get shiftKey => _parent.shiftKey;
  int get timeStamp => _parent.timeStamp;
  /**
   * The type of key event that occurred. One of "keydown", "keyup", or
   * "keypress".
   */
  String get type => _parent.type;
  Window get view => _parent.view;
  void preventDefault() => _parent.preventDefault();
  void stopImmediatePropagation() => _parent.stopImmediatePropagation();
  void stopPropagation() => _parent.stopPropagation();
  void $dom_initUIEvent(String type, bool canBubble, bool cancelable,
      LocalWindow view, int detail) {
    throw new UnsupportedError("Cannot initialize a UI Event from a KeyEvent.");
  }
  void $dom_initEvent(String eventTypeArg, bool canBubbleArg,
      bool cancelableArg) {
    throw new UnsupportedError("Cannot initialize an Event from a KeyEvent.");
  }
  String get _shadowKeyIdentifier => _parent.$dom_keyIdentifier;

  int get $dom_charCode => charCode;
  int get $dom_keyCode => keyCode;
  EventTarget get target => _parent.target;
  String get $dom_keyIdentifier {
    throw new UnsupportedError("keyIdentifier is unsupported.");
  }
  void $dom_initKeyboardEvent(String type, bool canBubble, bool cancelable,
      LocalWindow view, String keyIdentifier, int keyLocation, bool ctrlKey,
      bool altKey, bool shiftKey, bool metaKey,
      bool altGraphKey) {
    throw new UnsupportedError(
        "Cannot initialize a KeyboardEvent from a KeyEvent.");
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _TypedArrayFactoryProvider {
  static Float32Array createFloat32Array(int length) => _F32(length);
  static Float32Array createFloat32Array_fromList(List<num> list) =>
      _F32(ensureNative(list));
  static Float32Array createFloat32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F32(buffer, byteOffset, length);
  static _F32(arg0, [arg1, arg2]) native "Float32Array_constructor_Callback";

  static Float64Array createFloat64Array(int length) => _F64(length);
  static Float64Array createFloat64Array_fromList(List<num> list) =>
      _F64(ensureNative(list));
  static Float64Array createFloat64Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _F64(buffer, byteOffset, length);
  static _F64(arg0, [arg1, arg2]) native "Float64Array_constructor_Callback";

  static Int8Array createInt8Array(int length) => _I8(length);
  static Int8Array createInt8Array_fromList(List<num> list) =>
      _I8(ensureNative(list));
  static Int8Array createInt8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I8(buffer, byteOffset, length);
  static _I8(arg0, [arg1, arg2]) native "Int8Array_constructor_Callback";

  static Int16Array createInt16Array(int length) => _I16(length);
  static Int16Array createInt16Array_fromList(List<num> list) =>
      _I16(ensureNative(list));
  static Int16Array createInt16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I16(buffer, byteOffset, length);
  static _I16(arg0, [arg1, arg2]) native "Int16Array_constructor_Callback";

  static Int32Array createInt32Array(int length) => _I32(length);
  static Int32Array createInt32Array_fromList(List<num> list) =>
      _I32(ensureNative(list));
  static Int32Array createInt32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _I32(buffer, byteOffset, length);
  static _I32(arg0, [arg1, arg2]) native "Int32Array_constructor_Callback";

  static Uint8Array createUint8Array(int length) => _U8(length);
  static Uint8Array createUint8Array_fromList(List<num> list) =>
      _U8(ensureNative(list));
  static Uint8Array createUint8Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U8(buffer, byteOffset, length);
  static _U8(arg0, [arg1, arg2]) native "Uint8Array_constructor_Callback";

  static Uint16Array createUint16Array(int length) => _U16(length);
  static Uint16Array createUint16Array_fromList(List<num> list) =>
      _U16(ensureNative(list));
  static Uint16Array createUint16Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U16(buffer, byteOffset, length);
  static _U16(arg0, [arg1, arg2]) native "Uint16Array_constructor_Callback";

  static Uint32Array createUint32Array(int length) => _U32(length);
  static Uint32Array createUint32Array_fromList(List<num> list) =>
      _U32(ensureNative(list));
  static Uint32Array createUint32Array_fromBuffer(ArrayBuffer buffer,
      [int byteOffset = 0, int length]) => _U32(buffer, byteOffset, length);
  static _U32(arg0, [arg1, arg2]) native "Uint32Array_constructor_Callback";

  static Uint8ClampedArray createUint8ClampedArray(int length) => _U8C(length);
  static Uint8ClampedArray createUint8ClampedArray_fromList(
      List<num> list) => _U8C(ensureNative(list));
  static Uint8ClampedArray createUint8ClampedArray_fromBuffer(
      ArrayBuffer buffer, [int byteOffset = 0, int length]) =>
      _U8C(buffer, byteOffset, length);
  static _U8C(arg0, [arg1, arg2]) native "Uint8ClampedArray_constructor_Callback";

  static ensureNative(List list) => list;  // TODO: make sure.
}

class _PointFactoryProvider {
  static Point createPoint(num x, num y) => _createWebKitPoint(x, y);
  static _createWebKitPoint(num x, num y) native "WebKitPoint_constructor_Callback";
}

class _WebSocketFactoryProvider {
  static WebSocket createWebSocket(String url) => _createWebSocket(url);
  static _createWebSocket(String url) native "WebSocket_constructor_Callback";
}

class _TextFactoryProvider {
  static Text createText(String data) => document.$dom_createTextNode(data);
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Utils for device detection.
 */
class _Device {
  /**
   * Gets the browser's user agent. Using this function allows tests to inject
   * the user agent.
   * Returns the user agent.
   */
  static String get userAgent => window.navigator.userAgent;

  /**
   * Determines if the current device is running Opera.
   */
  static bool get isOpera => userAgent.contains("Opera", 0);

  /**
   * Determines if the current device is running Internet Explorer.
   */
  static bool get isIE => !isOpera && userAgent.contains("MSIE", 0);

  /**
   * Determines if the current device is running Firefox.
   */
  static bool get isFirefox => userAgent.contains("Firefox", 0);

  /**
   * Determines if the current device is running WebKit.
   */
  static bool get isWebKit => !isOpera && userAgent.contains("WebKit", 0);
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


_serialize(var message) {
  return new _JsSerializer().traverse(message);
}

class _JsSerializer extends _Serializer {

  visitSendPortSync(SendPortSync x) {
    if (x is _JsSendPortSync) return visitJsSendPortSync(x);
    if (x is _LocalSendPortSync) return visitLocalSendPortSync(x);
    if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x);
    throw "Unknown port type $x";
  }

  visitJsSendPortSync(_JsSendPortSync x) {
    return [ 'sendport', 'nativejs', x._id ];
  }

  visitLocalSendPortSync(_LocalSendPortSync x) {
    return [ 'sendport', 'dart',
             ReceivePortSync._isolateId, x._receivePort._portId ];
  }

  visitSendPort(SendPort x) {
    throw new UnimplementedError('Asynchronous send port not yet implemented.');
  }

  visitRemoteSendPortSync(_RemoteSendPortSync x) {
    return [ 'sendport', 'dart', x._isolateId, x._portId ];
  }
}

_deserialize(var message) {
  return new _JsDeserializer().deserialize(message);
}


class _JsDeserializer extends _Deserializer {

  static const _UNSPECIFIED = const Object();

  deserializeSendPort(List x) {
    String tag = x[1];
    switch (tag) {
      case 'nativejs':
        num id = x[2];
        return new _JsSendPortSync(id);
      case 'dart':
        num isolateId = x[2];
        num portId = x[3];
        return ReceivePortSync._lookup(isolateId, portId);
      default:
        throw 'Illegal SendPortSync type: $tag';
    }
  }
}

// The receiver is JS.
class _JsSendPortSync implements SendPortSync {

  num _id;
  _JsSendPortSync(this._id);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _callPortSync(_id, serialized);
    return _deserialize(result);
  }

}

// TODO(vsm): Differentiate between Dart2Js and Dartium isolates.
// The receiver is a different Dart isolate, compiled to JS.
class _RemoteSendPortSync implements SendPortSync {

  int _isolateId;
  int _portId;
  _RemoteSendPortSync(this._isolateId, this._portId);

  callSync(var message) {
    var serialized = _serialize(message);
    var result = _call(_isolateId, _portId, serialized);
    return _deserialize(result);
  }

  static _call(int isolateId, int portId, var message) {
    var target = 'dart-port-$isolateId-$portId';
    // TODO(vsm): Make this re-entrant.
    // TODO(vsm): Set this up set once, on the first call.
    var source = '$target-result';
    var result = null;
    var listener = (Event e) {
      result = JSON.parse(_getPortSyncEventData(e));
    };
    window.on[source].add(listener);
    _dispatchEvent(target, [source, message]);
    window.on[source].remove(listener);
    return result;
  }
}

// The receiver is in the same Dart isolate, compiled to JS.
class _LocalSendPortSync implements SendPortSync {

  ReceivePortSync _receivePort;

  _LocalSendPortSync._internal(this._receivePort);

  callSync(var message) {
    // TODO(vsm): Do a more efficient deep copy.
    var copy = _deserialize(_serialize(message));
    var result = _receivePort._callback(copy);
    return _deserialize(_serialize(result));
  }
}

// TODO(vsm): Move this to dart:isolate.  This will take some
// refactoring as there are dependences here on the DOM.  Users
// interact with this class (or interface if we change it) directly -
// new ReceivePortSync.  I think most of the DOM logic could be
// delayed until the corresponding SendPort is registered on the
// window.

// A Dart ReceivePortSync (tagged 'dart' when serialized) is
// identifiable / resolvable by the combination of its isolateid and
// portid.  When a corresponding SendPort is used within the same
// isolate, the _portMap below can be used to obtain the
// ReceivePortSync directly.  Across isolates (or from JS), an
// EventListener can be used to communicate with the port indirectly.
class ReceivePortSync {

  static Map<int, ReceivePortSync> _portMap;
  static int _portIdCount;
  static int _cachedIsolateId;

  num _portId;
  Function _callback;
  EventListener _listener;

  ReceivePortSync() {
    if (_portIdCount == null) {
      _portIdCount = 0;
      _portMap = new Map<int, ReceivePortSync>();
    }
    _portId = _portIdCount++;
    _portMap[_portId] = this;
  }

  static int get _isolateId {
    // TODO(vsm): Make this coherent with existing isolate code.
    if (_cachedIsolateId == null) {
      _cachedIsolateId = _getNewIsolateId();
    }
    return _cachedIsolateId;
  }

  static String _getListenerName(isolateId, portId) =>
      'dart-port-$isolateId-$portId';
  String get _listenerName => _getListenerName(_isolateId, _portId);

  void receive(callback(var message)) {
    _callback = callback;
    if (_listener == null) {
      _listener = (Event e) {
        var data = JSON.parse(_getPortSyncEventData(e));
        var replyTo = data[0];
        var message = _deserialize(data[1]);
        var result = _callback(message);
        _dispatchEvent(replyTo, _serialize(result));
      };
      window.on[_listenerName].add(_listener);
    }
  }

  void close() {
    _portMap.remove(_portId);
    if (_listener != null) window.on[_listenerName].remove(_listener);
  }

  SendPortSync toSendPort() {
    return new _LocalSendPortSync._internal(this);
  }

  static SendPortSync _lookup(int isolateId, int portId) {
    if (isolateId == _isolateId) {
      return _portMap[portId].toSendPort();
    } else {
      return new _RemoteSendPortSync(isolateId, portId);
    }
  }
}

get _isolateId => ReceivePortSync._isolateId;

void _dispatchEvent(String receiver, var message) {
  var event = new CustomEvent(receiver, false, false, JSON.stringify(message));
  window.$dom_dispatchEvent(event);
}

String _getPortSyncEventData(CustomEvent event) => event.detail;
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


typedef Object ComputeValue();

class _MeasurementRequest<T> {
  final ComputeValue computeValue;
  final Completer<T> completer;
  Object value;
  bool exception = false;
  _MeasurementRequest(this.computeValue, this.completer);
}

typedef void _MeasurementCallback();


/**
 * This class attempts to invoke a callback as soon as the current event stack
 * unwinds, but before the browser repaints.
 */
abstract class _MeasurementScheduler {
  bool _nextMeasurementFrameScheduled = false;
  _MeasurementCallback _callback;

  _MeasurementScheduler(this._callback);

  /**
   * Creates the best possible measurement scheduler for the current platform.
   */
  factory _MeasurementScheduler.best(_MeasurementCallback callback) {
    if (_isMutationObserverSupported()) {
      return new _MutationObserverScheduler(callback);
    }
    return new _PostMessageScheduler(callback);
  }

  /**
   * Schedules a measurement callback if one has not been scheduled already.
   */
  void maybeSchedule() {
    if (this._nextMeasurementFrameScheduled) {
      return;
    }
    this._nextMeasurementFrameScheduled = true;
    this._schedule();
  }

  /**
   * Does the actual scheduling of the callback.
   */
  void _schedule();

  /**
   * Handles the measurement callback and forwards it if necessary.
   */
  void _onCallback() {
    // Ignore spurious messages.
    if (!_nextMeasurementFrameScheduled) {
      return;
    }
    _nextMeasurementFrameScheduled = false;
    this._callback();
  }
}

/**
 * Scheduler which uses window.postMessage to schedule events.
 */
class _PostMessageScheduler extends _MeasurementScheduler {
  const _MEASUREMENT_MESSAGE = "DART-MEASURE";

  _PostMessageScheduler(_MeasurementCallback callback): super(callback) {
      // Messages from other windows do not cause a security risk as
      // all we care about is that _handleMessage is called
      // after the current event loop is unwound and calling the function is
      // a noop when zero requests are pending.
      window.on.message.add(this._handleMessage);
  }

  void _schedule() {
    window.postMessage(_MEASUREMENT_MESSAGE, "*");
  }

  _handleMessage(e) {
    this._onCallback();
  }
}

/**
 * Scheduler which uses a MutationObserver to schedule events.
 */
class _MutationObserverScheduler extends _MeasurementScheduler {
  MutationObserver _observer;
  Element _dummy;

  _MutationObserverScheduler(_MeasurementCallback callback): super(callback) {
    // Mutation events get fired as soon as the current event stack is unwound
    // so we just make a dummy event and listen for that.
    _observer = new MutationObserver(this._handleMutation);
    _dummy = new DivElement();
    _observer.observe(_dummy, attributes: true);
  }

  void _schedule() {
    // Toggle it to trigger the mutation event.
    _dummy.hidden = !_dummy.hidden;
  }

  _handleMutation(List<MutationRecord> mutations, MutationObserver observer) {
    this._onCallback();
  }
}


List<_MeasurementRequest> _pendingRequests;
List<TimeoutHandler> _pendingMeasurementFrameCallbacks;
_MeasurementScheduler _measurementScheduler = null;

void _maybeScheduleMeasurementFrame() {
  if (_measurementScheduler == null) {
    _measurementScheduler =
      new _MeasurementScheduler.best(_completeMeasurementFutures);
  }
  _measurementScheduler.maybeSchedule();
}

/**
 * Registers a [callback] which is called after the next batch of measurements
 * completes. Even if no measurements completed, the callback is triggered
 * when they would have completed to avoid confusing bugs if it happened that
 * no measurements were actually requested.
 */
void _addMeasurementFrameCallback(TimeoutHandler callback) {
  if (_pendingMeasurementFrameCallbacks == null) {
    _pendingMeasurementFrameCallbacks = <TimeoutHandler>[];
    _maybeScheduleMeasurementFrame();
  }
  _pendingMeasurementFrameCallbacks.add(callback);
}

/**
 * Returns a [Future] whose value will be the result of evaluating
 * [computeValue] during the next safe measurement interval.
 * The next safe measurement interval is after the current event loop has
 * unwound but before the browser has rendered the page.
 * It is important that the [computeValue] function only queries the html
 * layout and html in any way.
 */
Future _createMeasurementFuture(ComputeValue computeValue,
                                Completer completer) {
  if (_pendingRequests == null) {
    _pendingRequests = <_MeasurementRequest>[];
    _maybeScheduleMeasurementFrame();
  }
  _pendingRequests.add(new _MeasurementRequest(computeValue, completer));
  return completer.future;
}

/**
 * Complete all pending measurement futures evaluating them in a single batch
 * so that the the browser is guaranteed to avoid multiple layouts.
 */
void _completeMeasurementFutures() {
  // We must compute all new values before fulfilling the futures as
  // the onComplete callbacks for the futures could modify the DOM making
  // subsequent measurement calculations expensive to compute.
  if (_pendingRequests != null) {
    for (_MeasurementRequest request in _pendingRequests) {
      try {
        request.value = request.computeValue();
      } catch (e) {
        request.value = e;
        request.exception = true;
      }
    }
  }

  final completedRequests = _pendingRequests;
  final readyMeasurementFrameCallbacks = _pendingMeasurementFrameCallbacks;
  _pendingRequests = null;
  _pendingMeasurementFrameCallbacks = null;
  if (completedRequests != null) {
    for (_MeasurementRequest request in completedRequests) {
      if (request.exception) {
        request.completer.completeException(request.value);
      } else {
        request.completer.complete(request.value);
      }
    }
  }

  if (readyMeasurementFrameCallbacks != null) {
    for (TimeoutHandler handler in readyMeasurementFrameCallbacks) {
      // TODO(jacobr): wrap each call to a handler in a try-catch block.
      handler();
    }
  }
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Patch file for the dart:isolate library.


/********************************************************
  Inserted from lib/isolate/serialization.dart
 ********************************************************/

class _MessageTraverserVisitedMap {

  operator[](var object) => null;
  void operator[]=(var object, var info) { }

  void reset() { }
  void cleanup() { }

}

/** Abstract visitor for dart objects that can be sent as isolate messages. */
abstract class _MessageTraverser {

  _MessageTraverserVisitedMap _visited;
  _MessageTraverser() : _visited = new _MessageTraverserVisitedMap();

  /** Visitor's entry point. */
  traverse(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    _visited.reset();
    var result;
    try {
      result = _dispatch(x);
    } finally {
      _visited.cleanup();
    }
    return result;
  }

  _dispatch(var x) {
    if (isPrimitive(x)) return visitPrimitive(x);
    if (x is List) return visitList(x);
    if (x is Map) return visitMap(x);
    if (x is SendPort) return visitSendPort(x);
    if (x is SendPortSync) return visitSendPortSync(x);

    // Overridable fallback.
    return visitObject(x);
  }

  visitPrimitive(x);
  visitList(List x);
  visitMap(Map x);
  visitSendPort(SendPort x);
  visitSendPortSync(SendPortSync x);

  visitObject(Object x) {
    // TODO(floitsch): make this a real exception. (which one)?
    throw "Message serialization: Illegal value $x passed";
  }

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }
}


/** Visitor that serializes a message as a JSON array. */
abstract class _Serializer extends _MessageTraverser {
  int _nextFreeRefId = 0;

  visitPrimitive(x) => x;

  visitList(List list) {
    int copyId = _visited[list];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[list] = id;
    var jsArray = _serializeList(list);
    // TODO(floitsch): we are losing the generic type.
    return ['list', id, jsArray];
  }

  visitMap(Map map) {
    int copyId = _visited[map];
    if (copyId != null) return ['ref', copyId];

    int id = _nextFreeRefId++;
    _visited[map] = id;
    var keys = _serializeList(map.keys);
    var values = _serializeList(map.values);
    // TODO(floitsch): we are losing the generic type.
    return ['map', id, keys, values];
  }

  _serializeList(List list) {
    int len = list.length;
    var result = new List(len);
    for (int i = 0; i < len; i++) {
      result[i] = _dispatch(list[i]);
    }
    return result;
  }
}

/** Deserializes arrays created with [_Serializer]. */
abstract class _Deserializer {
  Map<int, dynamic> _deserialized;

  _Deserializer();

  static bool isPrimitive(x) {
    return (x == null) || (x is String) || (x is num) || (x is bool);
  }

  deserialize(x) {
    if (isPrimitive(x)) return x;
    // TODO(floitsch): this should be new HashMap<int, dynamic>()
    _deserialized = new HashMap();
    return _deserializeHelper(x);
  }

  _deserializeHelper(x) {
    if (isPrimitive(x)) return x;
    assert(x is List);
    switch (x[0]) {
      case 'ref': return _deserializeRef(x);
      case 'list': return _deserializeList(x);
      case 'map': return _deserializeMap(x);
      case 'sendport': return deserializeSendPort(x);
      default: return deserializeObject(x);
    }
  }

  _deserializeRef(List x) {
    int id = x[1];
    var result = _deserialized[id];
    assert(result != null);
    return result;
  }

  List _deserializeList(List x) {
    int id = x[1];
    // We rely on the fact that Dart-lists are directly mapped to Js-arrays.
    List dartList = x[2];
    _deserialized[id] = dartList;
    int len = dartList.length;
    for (int i = 0; i < len; i++) {
      dartList[i] = _deserializeHelper(dartList[i]);
    }
    return dartList;
  }

  Map _deserializeMap(List x) {
    Map result = new Map();
    int id = x[1];
    _deserialized[id] = result;
    List keys = x[2];
    List values = x[3];
    int len = keys.length;
    assert(len == values.length);
    for (int i = 0; i < len; i++) {
      var key = _deserializeHelper(keys[i]);
      var value = _deserializeHelper(values[i]);
      result[key] = value;
    }
    return result;
  }

  deserializeSendPort(List x);

  deserializeObject(List x) {
    // TODO(floitsch): Use real exception (which one?).
    throw "Unexpected serialized object";
  }
}

// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


/**
 * Checks to see if the mutation observer API is supported on the current
 * platform.
 */
bool _isMutationObserverSupported() {
  return true;
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// TODO(rnystrom): add a way to supress public classes from DartDoc output.
// TODO(jacobr): we can remove this class now that we are using the $dom_
// convention for deprecated methods rather than truly private methods.
/**
 * This class is intended for testing purposes only.
 */
class Testing {
  static void addEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
    target.$dom_addEventListener(type, listener, useCapture);
  }
  static void removeEventListener(EventTarget target, String type, EventListener listener, bool useCapture) {
    target.$dom_removeEventListener(type, listener, useCapture);
  }

}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// Iterator for arrays with fixed size.
class FixedSizeListIterator<T> extends _VariableSizeListIterator<T> {
  FixedSizeListIterator(List<T> array)
      : super(array),
        _length = array.length;

  bool get hasNext => _length > _pos;

  final int _length;  // Cache array length for faster access.
}

// Iterator for arrays with variable size.
class _VariableSizeListIterator<T> implements Iterator<T> {
  _VariableSizeListIterator(List<T> array)
      : _array = array,
        _pos = 0;

  bool get hasNext => _array.length > _pos;

  T next() {
    if (!hasNext) {
      throw new StateError("No more elements");
    }
    return _array[_pos++];
  }

  final List<T> _array;
  int _pos;
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


// This API is exploratory.
spawnDomFunction(Function topLevelFunction) => _Utils.spawnDomFunctionImpl(topLevelFunction);

// testRunner implementation.
// FIXME: provide a separate lib for testRunner.

var _testRunner;

TestRunner get testRunner {
  if (_testRunner == null)
    _testRunner = new TestRunner._(_NPObject.retrieve("testRunner"));
  return _testRunner;
}

class TestRunner {
  final _NPObject _npObject;

  TestRunner._(this._npObject);

  display() => _npObject.invoke('display');
  dumpAsText() => _npObject.invoke('dumpAsText');
  notifyDone() => _npObject.invoke('notifyDone');
  setCanOpenWindows() => _npObject.invoke('setCanOpenWindows');
  waitUntilDone() => _npObject.invoke('waitUntilDone');
}
// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.


class _Utils {
  static List convertToList(List list) {
    // FIXME: [possible optimization]: do not copy the array if Dart_IsArray is fine w/ it.
    final length = list.length;
    List result = new List(length);
    result.setRange(0, length, list);
    return result;
  }

  static List convertMapToList(Map map) {
    List result = [];
    map.forEach((k, v) => result.addAll([k, v]));
    return result;
  }

  static void populateMap(Map result, List list) {
    for (int i = 0; i < list.length; i += 2) {
      result[list[i]] = list[i + 1];
    }
  }

  static bool isMap(obj) => obj is Map;

  static Map createMap() => {};

  static makeUnimplementedError(String fileName, int lineNo) {
    return new UnsupportedError('[info: $fileName:$lineNo]');
  }

  static window() native "Utils_window";
  static print(String message) native "Utils_print";
  static SendPort spawnDomFunctionImpl(Function topLevelFunction) native "Utils_spawnDomFunction";
  static int _getNewIsolateId() native "Utils_getNewIsolateId";
  static bool shadowRootSupported(Document document) native "Utils_shadowRootSupported";
}

class _NPObject extends NativeFieldWrapperClass1 {
  _NPObject.internal();
  static _NPObject retrieve(String key) native "NPObject_retrieve";
  property(String propertyName) native "NPObject_property";
  invoke(String methodName, [List args = null]) native "NPObject_invoke";
}

class _DOMWindowCrossFrame extends NativeFieldWrapperClass1 implements Window {
  _DOMWindowCrossFrame.internal();

  // Fields.
  History get history native "DOMWindow_history_cross_frame_Getter";
  Location get location native "DOMWindow_location_cross_frame_Getter";
  bool get closed native "DOMWindow_closed_Getter";
  int get length native "DOMWindow_length_Getter";
  Window get opener native "DOMWindow_opener_Getter";
  Window get parent native "DOMWindow_parent_Getter";
  Window get top native "DOMWindow_top_Getter";

  // Methods.
  void close() native "DOMWindow_close_Callback";
  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) native "DOMWindow_postMessage_Callback";

  // Implementation support.
  String get typeName => "DOMWindow";
}

class _HistoryCrossFrame extends NativeFieldWrapperClass1 implements History {
  _HistoryCrossFrame.internal();

  // Methods.
  void back() native "History_back_Callback";
  void forward() native "History_forward_Callback";
  void go(int distance) native "History_go_Callback";

  // Implementation support.
  String get typeName => "History";
}

class _LocationCrossFrame extends NativeFieldWrapperClass1 implements Location {
  _LocationCrossFrame.internal();

  // Fields.
  void set href(String) native "Location_href_Setter";

  // Implementation support.
  String get typeName => "Location";
}

class _DOMStringMap extends NativeFieldWrapperClass1 implements Map<String, String> {
  _DOMStringMap.internal();

  bool containsValue(String value) => Maps.containsValue(this, value);
  bool containsKey(String key) native "DOMStringMap_containsKey_Callback";
  String operator [](String key) native "DOMStringMap_item_Callback";
  void operator []=(String key, String value) native "DOMStringMap_setItem_Callback";
  String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
  String remove(String key) native "DOMStringMap_remove_Callback";
  void clear() => Maps.clear(this);
  void forEach(void f(String key, String value)) => Maps.forEach(this, f);
  Collection<String> get keys native "DOMStringMap_getKeys_Callback";
  Collection<String> get values => Maps.getValues(this);
  int get length => Maps.length(this);
  bool get isEmpty => Maps.isEmpty(this);
}

get _printClosure => (s) {
  try {
    window.console.log(s);
  } catch (_) {
    _Utils.print(s);
  }
};
