// Signature format: 2.0
package android {

  public final class Manifest {
    ctor public Manifest();
  }

  public static final class Manifest.permission {
    ctor public Manifest.permission();
    field public static final String ACCESS_CHECKIN_PROPERTIES = "android.permission.ACCESS_CHECKIN_PROPERTIES";
    field public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
    field public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
    field public static final String ACCESS_LOCATION_EXTRA_COMMANDS = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS";
    field public static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
    field public static final String ACCESS_NETWORK_STATE = "android.permission.ACCESS_NETWORK_STATE";
    field public static final String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
    field public static final String ACCESS_WIFI_STATE = "android.permission.ACCESS_WIFI_STATE";
    field public static final String ADD_SYSTEM_SERVICE = "android.permission.ADD_SYSTEM_SERVICE";
    field public static final String BATTERY_STATS = "android.permission.BATTERY_STATS";
    field public static final String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET";
    field public static final String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD";
    field public static final String BLUETOOTH = "android.permission.BLUETOOTH";
    field public static final String BLUETOOTH_ADMIN = "android.permission.BLUETOOTH_ADMIN";
    field public static final String BRICK = "android.permission.BRICK";
    field public static final String BROADCAST_PACKAGE_REMOVED = "android.permission.BROADCAST_PACKAGE_REMOVED";
    field public static final String BROADCAST_SMS = "android.permission.BROADCAST_SMS";
    field public static final String BROADCAST_STICKY = "android.permission.BROADCAST_STICKY";
    field public static final String BROADCAST_WAP_PUSH = "android.permission.BROADCAST_WAP_PUSH";
    field public static final String CALL_PHONE = "android.permission.CALL_PHONE";
    field public static final String CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED";
    field public static final String CAMERA = "android.permission.CAMERA";
    field public static final String CHANGE_COMPONENT_ENABLED_STATE = "android.permission.CHANGE_COMPONENT_ENABLED_STATE";
    field public static final String CHANGE_CONFIGURATION = "android.permission.CHANGE_CONFIGURATION";
    field public static final String CHANGE_NETWORK_STATE = "android.permission.CHANGE_NETWORK_STATE";
    field public static final String CHANGE_WIFI_STATE = "android.permission.CHANGE_WIFI_STATE";
    field public static final String CLEAR_APP_CACHE = "android.permission.CLEAR_APP_CACHE";
    field public static final String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
    field public static final String CONTROL_LOCATION_UPDATES = "android.permission.CONTROL_LOCATION_UPDATES";
    field public static final String DELETE_CACHE_FILES = "android.permission.DELETE_CACHE_FILES";
    field public static final String DELETE_PACKAGES = "android.permission.DELETE_PACKAGES";
    field public static final String DEVICE_POWER = "android.permission.DEVICE_POWER";
    field public static final String DIAGNOSTIC = "android.permission.DIAGNOSTIC";
    field public static final String DISABLE_KEYGUARD = "android.permission.DISABLE_KEYGUARD";
    field public static final String DUMP = "android.permission.DUMP";
    field public static final String EXPAND_STATUS_BAR = "android.permission.EXPAND_STATUS_BAR";
    field public static final String FACTORY_TEST = "android.permission.FACTORY_TEST";
    field public static final String FLASHLIGHT = "android.permission.FLASHLIGHT";
    field public static final String FORCE_BACK = "android.permission.FORCE_BACK";
    field public static final String FOTA_UPDATE = "android.permission.FOTA_UPDATE";
    field public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
    field public static final String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
    field public static final String GET_TASKS = "android.permission.GET_TASKS";
    field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
    field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
    field public static final String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES";
    field public static final String INTERNAL_SYSTEM_WINDOW = "android.permission.INTERNAL_SYSTEM_WINDOW";
    field public static final String INTERNET = "android.permission.INTERNET";
    field public static final String MANAGE_APP_TOKENS = "android.permission.MANAGE_APP_TOKENS";
    field public static final String MASTER_CLEAR = "android.permission.MASTER_CLEAR";
    field public static final String MODIFY_AUDIO_SETTINGS = "android.permission.MODIFY_AUDIO_SETTINGS";
    field public static final String MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE";
    field public static final String MOUNT_FORMAT_FILESYSTEMS = "android.permission.MOUNT_FORMAT_FILESYSTEMS";
    field public static final String MOUNT_UNMOUNT_FILESYSTEMS = "android.permission.MOUNT_UNMOUNT_FILESYSTEMS";
    field public static final String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY";
    field public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
    field public static final String READ_CALENDAR = "android.permission.READ_CALENDAR";
    field public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
    field public static final String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER";
    field public static final String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
    field public static final String READ_LOGS = "android.permission.READ_LOGS";
    field public static final String READ_OWNER_DATA = "android.permission.READ_OWNER_DATA";
    field public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
    field public static final String READ_SMS = "android.permission.READ_SMS";
    field public static final String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS";
    field public static final String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS";
    field public static final String REBOOT = "android.permission.REBOOT";
    field public static final String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED";
    field public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
    field public static final String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
    field public static final String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
    field public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
    field public static final String REORDER_TASKS = "android.permission.REORDER_TASKS";
    field public static final String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
    field public static final String SEND_SMS = "android.permission.SEND_SMS";
    field public static final String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
    field public static final String SET_ALWAYS_FINISH = "android.permission.SET_ALWAYS_FINISH";
    field public static final String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE";
    field public static final String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP";
    field public static final String SET_ORIENTATION = "android.permission.SET_ORIENTATION";
    field public static final String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS";
    field public static final String SET_PROCESS_FOREGROUND = "android.permission.SET_PROCESS_FOREGROUND";
    field public static final String SET_PROCESS_LIMIT = "android.permission.SET_PROCESS_LIMIT";
    field public static final String SET_TIME_ZONE = "android.permission.SET_TIME_ZONE";
    field public static final String SET_WALLPAPER = "android.permission.SET_WALLPAPER";
    field public static final String SET_WALLPAPER_HINTS = "android.permission.SET_WALLPAPER_HINTS";
    field public static final String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES";
    field public static final String STATUS_BAR = "android.permission.STATUS_BAR";
    field public static final String SUBSCRIBED_FEEDS_READ = "android.permission.SUBSCRIBED_FEEDS_READ";
    field public static final String SUBSCRIBED_FEEDS_WRITE = "android.permission.SUBSCRIBED_FEEDS_WRITE";
    field public static final String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW";
    field public static final String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
    field public static final String VIBRATE = "android.permission.VIBRATE";
    field public static final String WAKE_LOCK = "android.permission.WAKE_LOCK";
    field public static final String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS";
    field public static final String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
    field public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
    field public static final String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
    field public static final String WRITE_OWNER_DATA = "android.permission.WRITE_OWNER_DATA";
    field public static final String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
    field public static final String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
    field public static final String WRITE_SMS = "android.permission.WRITE_SMS";
    field public static final String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
  }

  public static final class Manifest.permission_group {
    ctor public Manifest.permission_group();
    field public static final String ACCOUNTS = "android.permission-group.ACCOUNTS";
    field public static final String COST_MONEY = "android.permission-group.COST_MONEY";
    field public static final String DEVELOPMENT_TOOLS = "android.permission-group.DEVELOPMENT_TOOLS";
    field public static final String HARDWARE_CONTROLS = "android.permission-group.HARDWARE_CONTROLS";
    field public static final String LOCATION = "android.permission-group.LOCATION";
    field public static final String MESSAGES = "android.permission-group.MESSAGES";
    field public static final String NETWORK = "android.permission-group.NETWORK";
    field public static final String PERSONAL_INFO = "android.permission-group.PERSONAL_INFO";
    field public static final String PHONE_CALLS = "android.permission-group.PHONE_CALLS";
    field public static final String SYSTEM_TOOLS = "android.permission-group.SYSTEM_TOOLS";
  }

  public final class R {
    ctor public R();
  }

  public static final class R.anim {
    ctor public R.anim();
    field public static final int accelerate_decelerate_interpolator = 17432580; // 0x10a0004
    field public static final int accelerate_interpolator = 17432581; // 0x10a0005
    field public static final int decelerate_interpolator = 17432582; // 0x10a0006
    field public static final int fade_in = 17432576; // 0x10a0000
    field public static final int fade_out = 17432577; // 0x10a0001
    field public static final int slide_in_left = 17432578; // 0x10a0002
    field public static final int slide_out_right = 17432579; // 0x10a0003
  }

  public static final class R.array {
    ctor public R.array();
    field public static final int emailAddressTypes = 17235968; // 0x1070000
    field public static final int imProtocols = 17235969; // 0x1070001
    field public static final int organizationTypes = 17235970; // 0x1070002
    field public static final int phoneTypes = 17235971; // 0x1070003
    field public static final int postalAddressTypes = 17235972; // 0x1070004
  }

  public static final class R.attr {
    ctor public R.attr();
    field public static final int absListViewStyle = 16842858; // 0x101006a
    field public static final int action = 16842797; // 0x101002d
    field public static final int activityCloseEnterAnimation = 16842938; // 0x10100ba
    field public static final int activityCloseExitAnimation = 16842939; // 0x10100bb
    field public static final int activityOpenEnterAnimation = 16842936; // 0x10100b8
    field public static final int activityOpenExitAnimation = 16842937; // 0x10100b9
    field public static final int addStatesFromChildren = 16842992; // 0x10100f0
    field public static final int adjustViewBounds = 16843038; // 0x101011e
    field public static final int alertDialogStyle = 16842845; // 0x101005d
    field public static final int allowClearUserData = 16842757; // 0x1010005
    field public static final int allowSingleTap = 16843353; // 0x1010259
    field public static final int allowTaskReparenting = 16843268; // 0x1010204
    field public static final int alphabeticShortcut = 16843235; // 0x10101e3
    field public static final int alwaysDrawnWithCache = 16842991; // 0x10100ef
    field public static final int alwaysRetainTaskState = 16843267; // 0x1010203
    field public static final int angle = 16843168; // 0x10101a0
    field public static final int animateOnClick = 16843356; // 0x101025c
    field public static final int animation = 16843213; // 0x10101cd
    field public static final int animationCache = 16842989; // 0x10100ed
    field public static final int animationDuration = 16843026; // 0x1010112
    field public static final int animationOrder = 16843214; // 0x10101ce
    field public static final int antialias = 16843034; // 0x101011a
    field public static final int apiKey = 16843281; // 0x1010211
    field public static final int authorities = 16842776; // 0x1010018
    field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b
    field public static final int autoLink = 16842928; // 0x10100b0
    field public static final int autoText = 16843114; // 0x101016a
    field public static final int background = 16842964; // 0x10100d4
    field public static final int backgroundDimAmount = 16842802; // 0x1010032
    field public static final int backgroundDimEnabled = 16843295; // 0x101021f
    field public static final int baselineAlignBottom = 16843042; // 0x1010122
    field public static final int baselineAligned = 16843046; // 0x1010126
    field public static final int baselineAlignedChildIndex = 16843047; // 0x1010127
    field public static final int bottom = 16843184; // 0x10101b0
    field public static final int bottomBright = 16842957; // 0x10100cd
    field public static final int bottomDark = 16842953; // 0x10100c9
    field public static final int bottomLeftRadius = 16843179; // 0x10101ab
    field public static final int bottomMedium = 16842958; // 0x10100ce
    field public static final int bottomOffset = 16843351; // 0x1010257
    field public static final int bottomRightRadius = 16843180; // 0x10101ac
    field public static final int bufferType = 16843086; // 0x101014e
    field public static final int button = 16843015; // 0x1010107
    field public static final int buttonStyle = 16842824; // 0x1010048
    field public static final int buttonStyleInset = 16842826; // 0x101004a
    field public static final int buttonStyleSmall = 16842825; // 0x1010049
    field public static final int buttonStyleToggle = 16842827; // 0x101004b
    field public static final int cacheColorHint = 16843009; // 0x1010101
    field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230
    field public static final int capitalize = 16843113; // 0x1010169
    field public static final int centerBright = 16842956; // 0x10100cc
    field public static final int centerColor = 16843275; // 0x101020b
    field public static final int centerDark = 16842952; // 0x10100c8
    field public static final int centerMedium = 16842959; // 0x10100cf
    field public static final int centerX = 16843170; // 0x10101a2
    field public static final int centerY = 16843171; // 0x10101a3
    field public static final int checkBoxPreferenceStyle = 16842895; // 0x101008f
    field public static final int checkMark = 16843016; // 0x1010108
    field public static final int checkable = 16843237; // 0x10101e5
    field public static final int checkableBehavior = 16843232; // 0x10101e0
    field public static final int checkboxStyle = 16842860; // 0x101006c
    field public static final int checked = 16843014; // 0x1010106
    field public static final int checkedButton = 16843080; // 0x1010148
    field public static final int childDivider = 16843025; // 0x1010111
    field public static final int childIndicator = 16843020; // 0x101010c
    field public static final int childIndicatorLeft = 16843023; // 0x101010f
    field public static final int childIndicatorRight = 16843024; // 0x1010110
    field public static final int choiceMode = 16843051; // 0x101012b
    field public static final int clearTaskOnLaunch = 16842773; // 0x1010015
    field public static final int clickable = 16842981; // 0x10100e5
    field public static final int clipChildren = 16842986; // 0x10100ea
    field public static final int clipOrientation = 16843274; // 0x101020a
    field public static final int clipToPadding = 16842987; // 0x10100eb
    field public static final int codes = 16843330; // 0x1010242
    field public static final int collapseColumns = 16843083; // 0x101014b
    field public static final int color = 16843173; // 0x10101a5
    field public static final int colorBackground = 16842801; // 0x1010031
    field public static final int colorForeground = 16842800; // 0x1010030
    field public static final int colorForegroundInverse = 16843270; // 0x1010206
    field public static final int columnDelay = 16843215; // 0x10101cf
    field public static final int columnWidth = 16843031; // 0x1010117
    field public static final int completionHint = 16843122; // 0x1010172
    field public static final int completionHintView = 16843123; // 0x1010173
    field public static final int completionThreshold = 16843124; // 0x1010174
    field public static final int configChanges = 16842783; // 0x101001f
    field public static final int configure = 16843357; // 0x101025d
    field public static final int constantSize = 16843158; // 0x1010196
    field public static final int content = 16843355; // 0x101025b
    field public static final int cropToPadding = 16843043; // 0x1010123
    field public static final int cursorVisible = 16843090; // 0x1010152
    field public static final int cycles = 16843220; // 0x10101d4
    field public static final int dashGap = 16843175; // 0x10101a7
    field public static final int dashWidth = 16843174; // 0x10101a6
    field public static final int data = 16842798; // 0x101002e
    field public static final int debuggable = 16842767; // 0x101000f
    field public static final int defaultValue = 16843245; // 0x10101ed
    field public static final int delay = 16843212; // 0x10101cc
    field public static final int dependency = 16843244; // 0x10101ec
    field public static final int descendantFocusability = 16842993; // 0x10100f1
    field public static final int description = 16842784; // 0x1010020
    field public static final int dial = 16843010; // 0x1010102
    field public static final int dialogIcon = 16843252; // 0x10101f4
    field public static final int dialogLayout = 16843255; // 0x10101f7
    field public static final int dialogMessage = 16843251; // 0x10101f3
    field public static final int dialogPreferenceStyle = 16842897; // 0x1010091
    field public static final int dialogTitle = 16843250; // 0x10101f2
    field public static final int digits = 16843110; // 0x1010166
    field public static final int direction = 16843217; // 0x10101d1
    field public static final int directionPriority = 16843218; // 0x10101d2
    field public static final int disableDependentsState = 16843249; // 0x10101f1
    field public static final int disabledAlpha = 16842803; // 0x1010033
    field public static final int dither = 16843036; // 0x101011c
    field public static final int divider = 16843049; // 0x1010129
    field public static final int dividerHeight = 16843050; // 0x101012a
    field public static final int drawSelectorOnTop = 16843004; // 0x10100fc
    field public static final int drawable = 16843161; // 0x1010199
    field public static final int drawableBottom = 16843118; // 0x101016e
    field public static final int drawableLeft = 16843119; // 0x101016f
    field public static final int drawablePadding = 16843121; // 0x1010171
    field public static final int drawableRight = 16843120; // 0x1010170
    field public static final int drawableTop = 16843117; // 0x101016d
    field public static final int drawingCacheQuality = 16842984; // 0x10100e8
    field public static final int dropDownAnchor = 16843363; // 0x1010263
    field public static final int dropDownHintAppearance = 16842888; // 0x1010088
    field public static final int dropDownItemStyle = 16842886; // 0x1010086
    field public static final int dropDownListViewStyle = 16842861; // 0x101006d
    field public static final int dropDownSelector = 16843125; // 0x1010175
    field public static final int dropDownWidth = 16843362; // 0x1010262
    field public static final int duplicateParentState = 16842985; // 0x10100e9
    field public static final int duration = 16843160; // 0x1010198
    field public static final int editTextPreferenceStyle = 16842898; // 0x1010092
    field public static final int editTextStyle = 16842862; // 0x101006e
    field public static final int editable = 16843115; // 0x101016b
    field public static final int editorExtras = 16843300; // 0x1010224
    field public static final int ellipsize = 16842923; // 0x10100ab
    field public static final int ems = 16843096; // 0x1010158
    field public static final int enabled = 16842766; // 0x101000e
    field public static final int endColor = 16843166; // 0x101019e
    field public static final int endYear = 16843133; // 0x101017d
    field public static final int entries = 16842930; // 0x10100b2
    field public static final int entryValues = 16843256; // 0x10101f8
    field public static final int excludeFromRecents = 16842775; // 0x1010017
    field public static final int expandableListPreferredChildIndicatorLeft = 16842834; // 0x1010052
    field public static final int expandableListPreferredChildIndicatorRight = 16842835; // 0x1010053
    field public static final int expandableListPreferredChildPaddingLeft = 16842831; // 0x101004f
    field public static final int expandableListPreferredItemIndicatorLeft = 16842832; // 0x1010050
    field public static final int expandableListPreferredItemIndicatorRight = 16842833; // 0x1010051
    field public static final int expandableListPreferredItemPaddingLeft = 16842830; // 0x101004e
    field public static final int expandableListViewStyle = 16842863; // 0x101006f
    field public static final int exported = 16842768; // 0x1010010
    field public static final int factor = 16843219; // 0x10101d3
    field public static final int fadingEdge = 16842975; // 0x10100df
    field public static final int fadingEdgeLength = 16842976; // 0x10100e0
    field public static final int fastScrollEnabled = 16843302; // 0x1010226
    field public static final int fillAfter = 16843197; // 0x10101bd
    field public static final int fillBefore = 16843196; // 0x10101bc
    field public static final int fillEnabled = 16843343; // 0x101024f
    field public static final int fillViewport = 16843130; // 0x101017a
    field public static final int filter = 16843035; // 0x101011b
    field public static final int finishOnTaskLaunch = 16842772; // 0x1010014
    field public static final int fitsSystemWindows = 16842973; // 0x10100dd
    field public static final int flipInterval = 16843129; // 0x1010179
    field public static final int focusable = 16842970; // 0x10100da
    field public static final int focusableInTouchMode = 16842971; // 0x10100db
    field public static final int footerDividersEnabled = 16843311; // 0x101022f
    field public static final int foreground = 16843017; // 0x1010109
    field public static final int foregroundGravity = 16843264; // 0x1010200
    field public static final int format = 16843013; // 0x1010105
    field public static final int freezesText = 16843116; // 0x101016c
    field public static final int fromAlpha = 16843210; // 0x10101ca
    field public static final int fromDegrees = 16843187; // 0x10101b3
    field public static final int fromXDelta = 16843206; // 0x10101c6
    field public static final int fromXScale = 16843202; // 0x10101c2
    field public static final int fromYDelta = 16843208; // 0x10101c8
    field public static final int fromYScale = 16843204; // 0x10101c4
    field public static final int fullBright = 16842954; // 0x10100ca
    field public static final int fullDark = 16842950; // 0x10100c6
    field public static final int functionalTest = 16842787; // 0x1010023
    field public static final int galleryItemBackground = 16842828; // 0x101004c
    field public static final int galleryStyle = 16842864; // 0x1010070
    field public static final int gradientRadius = 16843172; // 0x10101a4
    field public static final int grantUriPermissions = 16842779; // 0x101001b
    field public static final int gravity = 16842927; // 0x10100af
    field public static final int gridViewStyle = 16842865; // 0x1010071
    field public static final int groupIndicator = 16843019; // 0x101010b
    field public static final int hand_hour = 16843011; // 0x1010103
    field public static final int hand_minute = 16843012; // 0x1010104
    field public static final int handle = 16843354; // 0x101025a
    field public static final int handleProfiling = 16842786; // 0x1010022
    field public static final int hapticFeedbackEnabled = 16843358; // 0x101025e
    field public static final int hasCode = 16842764; // 0x101000c
    field public static final int headerBackground = 16843055; // 0x101012f
    field public static final int headerDividersEnabled = 16843310; // 0x101022e
    field public static final int height = 16843093; // 0x1010155
    field public static final int hint = 16843088; // 0x1010150
    field public static final int horizontalDivider = 16843053; // 0x101012d
    field public static final int horizontalGap = 16843327; // 0x101023f
    field public static final int horizontalSpacing = 16843028; // 0x1010114
    field public static final int host = 16842792; // 0x1010028
    field public static final int icon = 16842754; // 0x1010002
    field public static final int iconPreview = 16843337; // 0x1010249
    field public static final int id = 16842960; // 0x10100d0
    field public static final int ignoreGravity = 16843263; // 0x10101ff
    field public static final int imageButtonStyle = 16842866; // 0x1010072
    field public static final int imageWellStyle = 16842867; // 0x1010073
    field public static final int imeActionId = 16843366; // 0x1010266
    field public static final int imeActionLabel = 16843365; // 0x1010265
    field public static final int imeExtractEnterAnimation = 16843368; // 0x1010268
    field public static final int imeExtractExitAnimation = 16843369; // 0x1010269
    field public static final int imeFullscreenBackground = 16843308; // 0x101022c
    field public static final int imeOptions = 16843364; // 0x1010264
    field public static final int inAnimation = 16843127; // 0x1010177
    field public static final int includeFontPadding = 16843103; // 0x101015f
    field public static final int indeterminate = 16843065; // 0x1010139
    field public static final int indeterminateBehavior = 16843070; // 0x101013e
    field public static final int indeterminateDrawable = 16843067; // 0x101013b
    field public static final int indeterminateDuration = 16843069; // 0x101013d
    field public static final int indeterminateOnly = 16843066; // 0x101013a
    field public static final int indicatorLeft = 16843021; // 0x101010d
    field public static final int indicatorRight = 16843022; // 0x101010e
    field public static final int inflatedId = 16842995; // 0x10100f3
    field public static final int initOrder = 16842778; // 0x101001a
    field public static final int initialLayout = 16843345; // 0x1010251
    field public static final int innerRadius = 16843359; // 0x101025f
    field public static final int innerRadiusRatio = 16843163; // 0x101019b
    field public static final int inputMethod = 16843112; // 0x1010168
    field public static final int inputType = 16843296; // 0x1010220
    field public static final int insetBottom = 16843194; // 0x10101ba
    field public static final int insetLeft = 16843191; // 0x10101b7
    field public static final int insetRight = 16843192; // 0x10101b8
    field public static final int insetTop = 16843193; // 0x10101b9
    field public static final int interpolator = 16843073; // 0x1010141
    field public static final int isDefault = 16843297; // 0x1010221
    field public static final int isIndicator = 16843079; // 0x1010147
    field public static final int isModifier = 16843334; // 0x1010246
    field public static final int isRepeatable = 16843336; // 0x1010248
    field public static final int isScrollContainer = 16843342; // 0x101024e
    field public static final int isSticky = 16843335; // 0x1010247
    field public static final int itemBackground = 16843056; // 0x1010130
    field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131
    field public static final int itemTextAppearance = 16843052; // 0x101012c
    field public static final int keepScreenOn = 16843286; // 0x1010216
    field public static final int key = 16843240; // 0x10101e8
    field public static final int keyBackground = 16843315; // 0x1010233
    field public static final int keyEdgeFlags = 16843333; // 0x1010245
    field public static final int keyHeight = 16843326; // 0x101023e
    field public static final int keyIcon = 16843340; // 0x101024c
    field public static final int keyLabel = 16843339; // 0x101024b
    field public static final int keyOutputText = 16843338; // 0x101024a
    field public static final int keyPreviewHeight = 16843321; // 0x1010239
    field public static final int keyPreviewLayout = 16843319; // 0x1010237
    field public static final int keyPreviewOffset = 16843320; // 0x1010238
    field public static final int keyTextColor = 16843318; // 0x1010236
    field public static final int keyTextSize = 16843316; // 0x1010234
    field public static final int keyWidth = 16843325; // 0x101023d
    field public static final int keyboardMode = 16843341; // 0x101024d
    field public static final int keycode = 16842949; // 0x10100c5
    field public static final int label = 16842753; // 0x1010001
    field public static final int labelTextSize = 16843317; // 0x1010235
    field public static final int launchMode = 16842781; // 0x101001d
    field public static final int layout = 16842994; // 0x10100f2
    field public static final int layoutAnimation = 16842988; // 0x10100ec
    field public static final int layout_above = 16843140; // 0x1010184
    field public static final int layout_alignBaseline = 16843142; // 0x1010186
    field public static final int layout_alignBottom = 16843146; // 0x101018a
    field public static final int layout_alignLeft = 16843143; // 0x1010187
    field public static final int layout_alignParentBottom = 16843150; // 0x101018e
    field public static final int layout_alignParentLeft = 16843147; // 0x101018b
    field public static final int layout_alignParentRight = 16843149; // 0x101018d
    field public static final int layout_alignParentTop = 16843148; // 0x101018c
    field public static final int layout_alignRight = 16843145; // 0x1010189
    field public static final int layout_alignTop = 16843144; // 0x1010188
    field public static final int layout_alignWithParentIfMissing = 16843154; // 0x1010192
    field public static final int layout_below = 16843141; // 0x1010185
    field public static final int layout_centerHorizontal = 16843152; // 0x1010190
    field public static final int layout_centerInParent = 16843151; // 0x101018f
    field public static final int layout_centerVertical = 16843153; // 0x1010191
    field public static final int layout_column = 16843084; // 0x101014c
    field public static final int layout_gravity = 16842931; // 0x10100b3
    field public static final int layout_height = 16842997; // 0x10100f5
    field public static final int layout_margin = 16842998; // 0x10100f6
    field public static final int layout_marginBottom = 16843002; // 0x10100fa
    field public static final int layout_marginLeft = 16842999; // 0x10100f7
    field public static final int layout_marginRight = 16843001; // 0x10100f9
    field public static final int layout_marginTop = 16843000; // 0x10100f8
    field public static final int layout_scale = 16843155; // 0x1010193
    field public static final int layout_span = 16843085; // 0x101014d
    field public static final int layout_toLeftOf = 16843138; // 0x1010182
    field public static final int layout_toRightOf = 16843139; // 0x1010183
    field public static final int layout_weight = 16843137; // 0x1010181
    field public static final int layout_width = 16842996; // 0x10100f4
    field public static final int layout_x = 16843135; // 0x101017f
    field public static final int layout_y = 16843136; // 0x1010180
    field public static final int left = 16843181; // 0x10101ad
    field public static final int lineSpacingExtra = 16843287; // 0x1010217
    field public static final int lineSpacingMultiplier = 16843288; // 0x1010218
    field public static final int lines = 16843092; // 0x1010154
    field public static final int linksClickable = 16842929; // 0x10100b1
    field public static final int listChoiceIndicatorMultiple = 16843290; // 0x101021a
    field public static final int listChoiceIndicatorSingle = 16843289; // 0x1010219
    field public static final int listDivider = 16843284; // 0x1010214
    field public static final int listPreferredItemHeight = 16842829; // 0x101004d
    field public static final int listSelector = 16843003; // 0x10100fb
    field public static final int listSeparatorTextViewStyle = 16843272; // 0x1010208
    field public static final int listViewStyle = 16842868; // 0x1010074
    field public static final int listViewWhiteStyle = 16842869; // 0x1010075
    field public static final int longClickable = 16842982; // 0x10100e6
    field public static final int manageSpaceActivity = 16842756; // 0x1010004
    field public static final int mapViewStyle = 16842890; // 0x101008a
    field public static final int marqueeRepeatLimit = 16843293; // 0x101021d
    field public static final int max = 16843062; // 0x1010136
    field public static final int maxEms = 16843095; // 0x1010157
    field public static final int maxHeight = 16843040; // 0x1010120
    field public static final int maxItemsPerRow = 16843060; // 0x1010134
    field public static final int maxLength = 16843104; // 0x1010160
    field public static final int maxLevel = 16843186; // 0x10101b2
    field public static final int maxLines = 16843091; // 0x1010153
    field public static final int maxRows = 16843059; // 0x1010133
    field public static final int maxWidth = 16843039; // 0x101011f
    field public static final int measureAllChildren = 16843018; // 0x101010a
    field public static final int menuCategory = 16843230; // 0x10101de
    field public static final int mimeType = 16842790; // 0x1010026
    field public static final int minEms = 16843098; // 0x101015a
    field public static final int minHeight = 16843072; // 0x1010140
    field public static final int minLevel = 16843185; // 0x10101b1
    field public static final int minLines = 16843094; // 0x1010156
    field public static final int minSdkVersion = 16843276; // 0x101020c
    field public static final int minWidth = 16843071; // 0x101013f
    field public static final int mode = 16843134; // 0x101017e
    field public static final int moreIcon = 16843061; // 0x1010135
    field public static final int multiprocess = 16842771; // 0x1010013
    field public static final int name = 16842755; // 0x1010003
    field public static final int negativeButtonText = 16843254; // 0x10101f6
    field public static final int nextFocusDown = 16842980; // 0x10100e4
    field public static final int nextFocusLeft = 16842977; // 0x10100e1
    field public static final int nextFocusRight = 16842978; // 0x10100e2
    field public static final int nextFocusUp = 16842979; // 0x10100e3
    field public static final int noHistory = 16843309; // 0x101022d
    field public static final int numColumns = 16843032; // 0x1010118
    field public static final int numStars = 16843076; // 0x1010144
    field public static final int numeric = 16843109; // 0x1010165
    field public static final int numericShortcut = 16843236; // 0x10101e4
    field public static final int oneshot = 16843159; // 0x1010197
    field public static final int order = 16843242; // 0x10101ea
    field public static final int orderInCategory = 16843231; // 0x10101df
    field public static final int orderingFromXml = 16843239; // 0x10101e7
    field public static final int orientation = 16842948; // 0x10100c4
    field public static final int outAnimation = 16843128; // 0x1010178
    field public static final int padding = 16842965; // 0x10100d5
    field public static final int paddingBottom = 16842969; // 0x10100d9
    field public static final int paddingLeft = 16842966; // 0x10100d6
    field public static final int paddingRight = 16842968; // 0x10100d8
    field public static final int paddingTop = 16842967; // 0x10100d7
    field public static final int panelBackground = 16842846; // 0x101005e
    field public static final int panelColorBackground = 16842849; // 0x1010061
    field public static final int panelColorForeground = 16842848; // 0x1010060
    field public static final int panelFullBackground = 16842847; // 0x101005f
    field public static final int panelTextAppearance = 16842850; // 0x1010062
    field public static final int password = 16843100; // 0x101015c
    field public static final int path = 16842794; // 0x101002a
    field public static final int pathPattern = 16842796; // 0x101002c
    field public static final int pathPrefix = 16842795; // 0x101002b
    field public static final int permission = 16842758; // 0x1010006
    field public static final int permissionGroup = 16842762; // 0x101000a
    field public static final int persistent = 16842765; // 0x101000d
    field public static final int persistentDrawingCache = 16842990; // 0x10100ee
    field public static final int phoneNumber = 16843111; // 0x1010167
    field public static final int pivotX = 16843189; // 0x10101b5
    field public static final int pivotY = 16843190; // 0x10101b6
    field public static final int popupBackground = 16843126; // 0x1010176
    field public static final int popupCharacters = 16843332; // 0x1010244
    field public static final int popupKeyboard = 16843331; // 0x1010243
    field public static final int popupLayout = 16843323; // 0x101023b
    field public static final int popupWindowStyle = 16842870; // 0x1010076
    field public static final int port = 16842793; // 0x1010029
    field public static final int positiveButtonText = 16843253; // 0x10101f5
    field public static final int preferenceCategoryStyle = 16842892; // 0x101008c
    field public static final int preferenceInformationStyle = 16842893; // 0x101008d
    field public static final int preferenceLayoutChild = 16842900; // 0x1010094
    field public static final int preferenceScreenStyle = 16842891; // 0x101008b
    field public static final int preferenceStyle = 16842894; // 0x101008e
    field public static final int priority = 16842780; // 0x101001c
    field public static final int privateImeOptions = 16843299; // 0x1010223
    field public static final int process = 16842769; // 0x1010011
    field public static final int progress = 16843063; // 0x1010137
    field public static final int progressBarStyle = 16842871; // 0x1010077
    field public static final int progressBarStyleHorizontal = 16842872; // 0x1010078
    field public static final int progressBarStyleLarge = 16842874; // 0x101007a
    field public static final int progressBarStyleSmall = 16842873; // 0x1010079
    field public static final int progressBarStyleSmallTitle = 16843279; // 0x101020f
    field public static final int progressDrawable = 16843068; // 0x101013c
    field public static final int prompt = 16843131; // 0x101017b
    field public static final int protectionLevel = 16842761; // 0x1010009
    field public static final int queryActionMsg = 16843227; // 0x10101db
    field public static final int radioButtonStyle = 16842878; // 0x101007e
    field public static final int radius = 16843176; // 0x10101a8
    field public static final int rating = 16843077; // 0x1010145
    field public static final int ratingBarStyle = 16842876; // 0x101007c
    field public static final int ratingBarStyleIndicator = 16843280; // 0x1010210
    field public static final int ratingBarStyleSmall = 16842877; // 0x101007d
    field public static final int readPermission = 16842759; // 0x1010007
    field public static final int repeatCount = 16843199; // 0x10101bf
    field public static final int repeatMode = 16843200; // 0x10101c0
    field public static final int reqFiveWayNav = 16843314; // 0x1010232
    field public static final int reqHardKeyboard = 16843305; // 0x1010229
    field public static final int reqKeyboardType = 16843304; // 0x1010228
    field public static final int reqNavigation = 16843306; // 0x101022a
    field public static final int reqTouchScreen = 16843303; // 0x1010227
    field public static final int resource = 16842789; // 0x1010025
    field public static final int right = 16843183; // 0x10101af
    field public static final int ringtonePreferenceStyle = 16842899; // 0x1010093
    field public static final int ringtoneType = 16843257; // 0x10101f9
    field public static final int rowDelay = 16843216; // 0x10101d0
    field public static final int rowEdgeFlags = 16843329; // 0x1010241
    field public static final int rowHeight = 16843058; // 0x1010132
    field public static final int saveEnabled = 16842983; // 0x10100e7
    field public static final int scaleGravity = 16843262; // 0x10101fe
    field public static final int scaleHeight = 16843261; // 0x10101fd
    field public static final int scaleType = 16843037; // 0x101011d
    field public static final int scaleWidth = 16843260; // 0x10101fc
    field public static final int scheme = 16842791; // 0x1010027
    field public static final int screenOrientation = 16842782; // 0x101001e
    field public static final int scrollHorizontally = 16843099; // 0x101015b
    field public static final int scrollViewStyle = 16842880; // 0x1010080
    field public static final int scrollX = 16842962; // 0x10100d2
    field public static final int scrollY = 16842963; // 0x10100d3
    field public static final int scrollbarAlwaysDrawHorizontalTrack = 16842856; // 0x1010068
    field public static final int scrollbarAlwaysDrawVerticalTrack = 16842857; // 0x1010069
    field public static final int scrollbarSize = 16842851; // 0x1010063
    field public static final int scrollbarStyle = 16842879; // 0x101007f
    field public static final int scrollbarThumbHorizontal = 16842852; // 0x1010064
    field public static final int scrollbarThumbVertical = 16842853; // 0x1010065
    field public static final int scrollbarTrackHorizontal = 16842854; // 0x1010066
    field public static final int scrollbarTrackVertical = 16842855; // 0x1010067
    field public static final int scrollbars = 16842974; // 0x10100de
    field public static final int scrollingCache = 16843006; // 0x10100fe
    field public static final int searchButtonText = 16843269; // 0x1010205
    field public static final int searchMode = 16843221; // 0x10101d5
    field public static final int searchSuggestAuthority = 16843222; // 0x10101d6
    field public static final int searchSuggestIntentAction = 16843225; // 0x10101d9
    field public static final int searchSuggestIntentData = 16843226; // 0x10101da
    field public static final int searchSuggestPath = 16843223; // 0x10101d7
    field public static final int searchSuggestSelection = 16843224; // 0x10101d8
    field public static final int secondaryProgress = 16843064; // 0x1010138
    field public static final int seekBarStyle = 16842875; // 0x101007b
    field public static final int selectAllOnFocus = 16843102; // 0x101015e
    field public static final int selectable = 16843238; // 0x10101e6
    field public static final int settingsActivity = 16843301; // 0x1010225
    field public static final int shadowColor = 16843105; // 0x1010161
    field public static final int shadowDx = 16843106; // 0x1010162
    field public static final int shadowDy = 16843107; // 0x1010163
    field public static final int shadowRadius = 16843108; // 0x1010164
    field public static final int shape = 16843162; // 0x101019a
    field public static final int shareInterpolator = 16843195; // 0x10101bb
    field public static final int sharedUserId = 16842763; // 0x101000b
    field public static final int sharedUserLabel = 16843361; // 0x1010261
    field public static final int shouldDisableView = 16843246; // 0x10101ee
    field public static final int showDefault = 16843258; // 0x10101fa
    field public static final int showSilent = 16843259; // 0x10101fb
    field public static final int shrinkColumns = 16843082; // 0x101014a
    field public static final int singleLine = 16843101; // 0x101015d
    field public static final int smoothScrollbar = 16843313; // 0x1010231
    field public static final int soundEffectsEnabled = 16843285; // 0x1010215
    field public static final int spacing = 16843027; // 0x1010113
    field public static final int spinnerDropDownItemStyle = 16842887; // 0x1010087
    field public static final int spinnerItemStyle = 16842889; // 0x1010089
    field public static final int spinnerStyle = 16842881; // 0x1010081
    field public static final int src = 16843033; // 0x1010119
    field public static final int stackFromBottom = 16843005; // 0x10100fd
    field public static final int starStyle = 16842882; // 0x1010082
    field public static final int startColor = 16843165; // 0x101019d
    field public static final int startOffset = 16843198; // 0x10101be
    field public static final int startYear = 16843132; // 0x101017c
    field public static final int stateNotNeeded = 16842774; // 0x1010016
    field public static final int state_above_anchor = 16842922; // 0x10100aa
    field public static final int state_active = 16842914; // 0x10100a2
    field public static final int state_checkable = 16842911; // 0x101009f
    field public static final int state_checked = 16842912; // 0x10100a0
    field public static final int state_empty = 16842921; // 0x10100a9
    field public static final int state_enabled = 16842910; // 0x101009e
    field public static final int state_expanded = 16842920; // 0x10100a8
    field public static final int state_first = 16842916; // 0x10100a4
    field public static final int state_focused = 16842908; // 0x101009c
    field public static final int state_last = 16842918; // 0x10100a6
    field public static final int state_long_pressable = 16843324; // 0x101023c
    field public static final int state_middle = 16842917; // 0x10100a5
    field public static final int state_pressed = 16842919; // 0x10100a7
    field public static final int state_selected = 16842913; // 0x10100a1
    field public static final int state_single = 16842915; // 0x10100a3
    field public static final int state_window_focused = 16842909; // 0x101009d
    field public static final int stepSize = 16843078; // 0x1010146
    field public static final int streamType = 16843273; // 0x1010209
    field public static final int stretchColumns = 16843081; // 0x1010149
    field public static final int stretchMode = 16843030; // 0x1010116
    field public static final int suggestActionMsg = 16843228; // 0x10101dc
    field public static final int suggestActionMsgColumn = 16843229; // 0x10101dd
    field public static final int summary = 16843241; // 0x10101e9
    field public static final int summaryOff = 16843248; // 0x10101f0
    field public static final int summaryOn = 16843247; // 0x10101ef
    field public static final int syncable = 16842777; // 0x1010019
    field public static final int tabWidgetStyle = 16842883; // 0x1010083
    field public static final int tag = 16842961; // 0x10100d1
    field public static final int targetActivity = 16843266; // 0x1010202
    field public static final int targetClass = 16842799; // 0x101002f
    field public static final int targetPackage = 16842785; // 0x1010021
    field public static final int taskAffinity = 16842770; // 0x1010012
    field public static final int taskCloseEnterAnimation = 16842942; // 0x10100be
    field public static final int taskCloseExitAnimation = 16842943; // 0x10100bf
    field public static final int taskOpenEnterAnimation = 16842940; // 0x10100bc
    field public static final int taskOpenExitAnimation = 16842941; // 0x10100bd
    field public static final int taskToBackEnterAnimation = 16842946; // 0x10100c2
    field public static final int taskToBackExitAnimation = 16842947; // 0x10100c3
    field public static final int taskToFrontEnterAnimation = 16842944; // 0x10100c0
    field public static final int taskToFrontExitAnimation = 16842945; // 0x10100c1
    field public static final int text = 16843087; // 0x101014f
    field public static final int textAppearance = 16842804; // 0x1010034
    field public static final int textAppearanceButton = 16843271; // 0x1010207
    field public static final int textAppearanceInverse = 16842805; // 0x1010035
    field public static final int textAppearanceLarge = 16842816; // 0x1010040
    field public static final int textAppearanceLargeInverse = 16842819; // 0x1010043
    field public static final int textAppearanceMedium = 16842817; // 0x1010041
    field public static final int textAppearanceMediumInverse = 16842820; // 0x1010044
    field public static final int textAppearanceSmall = 16842818; // 0x1010042
    field public static final int textAppearanceSmallInverse = 16842821; // 0x1010045
    field public static final int textCheckMark = 16842822; // 0x1010046
    field public static final int textCheckMarkInverse = 16842823; // 0x1010047
    field public static final int textColor = 16842904; // 0x1010098
    field public static final int textColorHighlight = 16842905; // 0x1010099
    field public static final int textColorHint = 16842906; // 0x101009a
    field public static final int textColorHintInverse = 16842815; // 0x101003f
    field public static final int textColorLink = 16842907; // 0x101009b
    field public static final int textColorPrimary = 16842806; // 0x1010036
    field public static final int textColorPrimaryDisableOnly = 16842807; // 0x1010037
    field public static final int textColorPrimaryInverse = 16842809; // 0x1010039
    field public static final int textColorPrimaryInverseNoDisable = 16842813; // 0x101003d
    field public static final int textColorPrimaryNoDisable = 16842811; // 0x101003b
    field public static final int textColorSecondary = 16842808; // 0x1010038
    field public static final int textColorSecondaryInverse = 16842810; // 0x101003a
    field public static final int textColorSecondaryInverseNoDisable = 16842814; // 0x101003e
    field public static final int textColorSecondaryNoDisable = 16842812; // 0x101003c
    field public static final int textColorTertiary = 16843282; // 0x1010212
    field public static final int textColorTertiaryInverse = 16843283; // 0x1010213
    field public static final int textFilterEnabled = 16843007; // 0x10100ff
    field public static final int textOff = 16843045; // 0x1010125
    field public static final int textOn = 16843044; // 0x1010124
    field public static final int textScaleX = 16843089; // 0x1010151
    field public static final int textSize = 16842901; // 0x1010095
    field public static final int textStyle = 16842903; // 0x1010097
    field public static final int textViewStyle = 16842884; // 0x1010084
    field public static final int theme = 16842752; // 0x1010000
    field public static final int thickness = 16843360; // 0x1010260
    field public static final int thicknessRatio = 16843164; // 0x101019c
    field public static final int thumb = 16843074; // 0x1010142
    field public static final int thumbOffset = 16843075; // 0x1010143
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int tint = 16843041; // 0x1010121
    field public static final int title = 16843233; // 0x10101e1
    field public static final int titleCondensed = 16843234; // 0x10101e2
    field public static final int toAlpha = 16843211; // 0x10101cb
    field public static final int toDegrees = 16843188; // 0x10101b4
    field public static final int toXDelta = 16843207; // 0x10101c7
    field public static final int toXScale = 16843203; // 0x10101c3
    field public static final int toYDelta = 16843209; // 0x10101c9
    field public static final int toYScale = 16843205; // 0x10101c5
    field public static final int top = 16843182; // 0x10101ae
    field public static final int topBright = 16842955; // 0x10100cb
    field public static final int topDark = 16842951; // 0x10100c7
    field public static final int topLeftRadius = 16843177; // 0x10101a9
    field public static final int topOffset = 16843352; // 0x1010258
    field public static final int topRightRadius = 16843178; // 0x10101aa
    field public static final int transcriptMode = 16843008; // 0x1010100
    field public static final int type = 16843169; // 0x10101a1
    field public static final int typeface = 16842902; // 0x1010096
    field public static final int unselectedAlpha = 16843278; // 0x101020e
    field public static final int updatePeriodMillis = 16843344; // 0x1010250
    field public static final int useLevel = 16843167; // 0x101019f
    field public static final int value = 16842788; // 0x1010024
    field public static final int variablePadding = 16843157; // 0x1010195
    field public static final int versionCode = 16843291; // 0x101021b
    field public static final int versionName = 16843292; // 0x101021c
    field public static final int verticalCorrection = 16843322; // 0x101023a
    field public static final int verticalDivider = 16843054; // 0x101012e
    field public static final int verticalGap = 16843328; // 0x1010240
    field public static final int verticalSpacing = 16843029; // 0x1010115
    field public static final int visibility = 16842972; // 0x10100dc
    field public static final int visible = 16843156; // 0x1010194
    field public static final int voiceLanguage = 16843349; // 0x1010255
    field public static final int voiceLanguageModel = 16843347; // 0x1010253
    field public static final int voiceMaxResults = 16843350; // 0x1010256
    field public static final int voicePromptText = 16843348; // 0x1010254
    field public static final int voiceSearchMode = 16843346; // 0x1010252
    field public static final int webViewStyle = 16842885; // 0x1010085
    field public static final int weightSum = 16843048; // 0x1010128
    field public static final int widgetLayout = 16843243; // 0x10101eb
    field public static final int width = 16843097; // 0x1010159
    field public static final int windowAnimationStyle = 16842926; // 0x10100ae
    field public static final int windowBackground = 16842836; // 0x1010054
    field public static final int windowContentOverlay = 16842841; // 0x1010059
    field public static final int windowDisablePreview = 16843298; // 0x1010222
    field public static final int windowEnterAnimation = 16842932; // 0x10100b4
    field public static final int windowExitAnimation = 16842933; // 0x10100b5
    field public static final int windowFrame = 16842837; // 0x1010055
    field public static final int windowFullscreen = 16843277; // 0x101020d
    field public static final int windowHideAnimation = 16842935; // 0x10100b7
    field public static final int windowIsFloating = 16842839; // 0x1010057
    field public static final int windowIsTranslucent = 16842840; // 0x1010058
    field public static final int windowNoDisplay = 16843294; // 0x101021e
    field public static final int windowNoTitle = 16842838; // 0x1010056
    field public static final int windowShowAnimation = 16842934; // 0x10100b6
    field public static final int windowSoftInputMode = 16843307; // 0x101022b
    field public static final int windowTitleBackgroundStyle = 16842844; // 0x101005c
    field public static final int windowTitleSize = 16842842; // 0x101005a
    field public static final int windowTitleStyle = 16842843; // 0x101005b
    field public static final int writePermission = 16842760; // 0x1010008
    field public static final int x = 16842924; // 0x10100ac
    field public static final int y = 16842925; // 0x10100ad
    field public static final int yesNoPreferenceStyle = 16842896; // 0x1010090
    field public static final int zAdjustment = 16843201; // 0x10101c1
  }

  public static final class R.bool {
    ctor public R.bool();
  }

  public static final class R.color {
    ctor public R.color();
    field public static final int background_dark = 17170446; // 0x106000e
    field public static final int background_light = 17170447; // 0x106000f
    field public static final int black = 17170444; // 0x106000c
    field public static final int darker_gray = 17170432; // 0x1060000
    field public static final int primary_text_dark = 17170433; // 0x1060001
    field public static final int primary_text_dark_nodisable = 17170434; // 0x1060002
    field public static final int primary_text_light = 17170435; // 0x1060003
    field public static final int primary_text_light_nodisable = 17170436; // 0x1060004
    field public static final int secondary_text_dark = 17170437; // 0x1060005
    field public static final int secondary_text_dark_nodisable = 17170438; // 0x1060006
    field public static final int secondary_text_light = 17170439; // 0x1060007
    field public static final int secondary_text_light_nodisable = 17170440; // 0x1060008
    field public static final int tab_indicator_text = 17170441; // 0x1060009
    field public static final int tertiary_text_dark = 17170448; // 0x1060010
    field public static final int tertiary_text_light = 17170449; // 0x1060011
    field public static final int transparent = 17170445; // 0x106000d
    field public static final int white = 17170443; // 0x106000b
    field public static final int widget_edittext_dark = 17170442; // 0x106000a
  }

  public static final class R.dimen {
    ctor public R.dimen();
    field public static final int app_icon_size = 17104896; // 0x1050000
    field public static final int thumbnail_height = 17104897; // 0x1050001
    field public static final int thumbnail_width = 17104898; // 0x1050002
  }

  public static final class R.drawable {
    ctor public R.drawable();
    field public static final int alert_dark_frame = 17301504; // 0x1080000
    field public static final int alert_light_frame = 17301505; // 0x1080001
    field public static final int arrow_down_float = 17301506; // 0x1080002
    field public static final int arrow_up_float = 17301507; // 0x1080003
    field public static final int bottom_bar = 17301658; // 0x108009a
    field public static final int btn_default = 17301508; // 0x1080004
    field public static final int btn_default_small = 17301509; // 0x1080005
    field public static final int btn_dialog = 17301527; // 0x1080017
    field public static final int btn_dropdown = 17301510; // 0x1080006
    field public static final int btn_minus = 17301511; // 0x1080007
    field public static final int btn_plus = 17301512; // 0x1080008
    field public static final int btn_radio = 17301513; // 0x1080009
    field public static final int btn_star = 17301514; // 0x108000a
    field public static final int btn_star_big_off = 17301515; // 0x108000b
    field public static final int btn_star_big_on = 17301516; // 0x108000c
    field public static final int button_onoff_indicator_off = 17301518; // 0x108000e
    field public static final int button_onoff_indicator_on = 17301517; // 0x108000d
    field public static final int checkbox_off_background = 17301519; // 0x108000f
    field public static final int checkbox_on_background = 17301520; // 0x1080010
    field public static final int dark_header = 17301669; // 0x10800a5
    field public static final int dialog_frame = 17301521; // 0x1080011
    field public static final int divider_horizontal_bright = 17301522; // 0x1080012
    field public static final int divider_horizontal_dark = 17301524; // 0x1080014
    field public static final int divider_horizontal_dim_dark = 17301525; // 0x1080015
    field public static final int divider_horizontal_textfield = 17301523; // 0x1080013
    field public static final int edit_text = 17301526; // 0x1080016
    field public static final int editbox_background = 17301528; // 0x1080018
    field public static final int editbox_background_normal = 17301529; // 0x1080019
    field public static final int editbox_dropdown_dark_frame = 17301530; // 0x108001a
    field public static final int editbox_dropdown_light_frame = 17301531; // 0x108001b
    field public static final int gallery_thumb = 17301532; // 0x108001c
    field public static final int ic_btn_speak_now = 17301668; // 0x10800a4
    field public static final int ic_delete = 17301533; // 0x108001d
    field public static final int ic_dialog_alert = 17301543; // 0x1080027
    field public static final int ic_dialog_dialer = 17301544; // 0x1080028
    field public static final int ic_dialog_email = 17301545; // 0x1080029
    field public static final int ic_dialog_info = 17301659; // 0x108009b
    field public static final int ic_dialog_map = 17301546; // 0x108002a
    field public static final int ic_input_add = 17301547; // 0x108002b
    field public static final int ic_input_delete = 17301548; // 0x108002c
    field public static final int ic_input_get = 17301549; // 0x108002d
    field public static final int ic_lock_idle_alarm = 17301550; // 0x108002e
    field public static final int ic_lock_idle_charging = 17301534; // 0x108001e
    field public static final int ic_lock_idle_lock = 17301535; // 0x108001f
    field public static final int ic_lock_idle_low_battery = 17301536; // 0x1080020
    field public static final int ic_lock_lock = 17301551; // 0x108002f
    field public static final int ic_lock_power_off = 17301552; // 0x1080030
    field public static final int ic_lock_silent_mode = 17301553; // 0x1080031
    field public static final int ic_lock_silent_mode_off = 17301554; // 0x1080032
    field public static final int ic_media_ff = 17301537; // 0x1080021
    field public static final int ic_media_next = 17301538; // 0x1080022
    field public static final int ic_media_pause = 17301539; // 0x1080023
    field public static final int ic_media_play = 17301540; // 0x1080024
    field public static final int ic_media_previous = 17301541; // 0x1080025
    field public static final int ic_media_rew = 17301542; // 0x1080026
    field public static final int ic_menu_add = 17301555; // 0x1080033
    field public static final int ic_menu_agenda = 17301556; // 0x1080034
    field public static final int ic_menu_always_landscape_portrait = 17301557; // 0x1080035
    field public static final int ic_menu_call = 17301558; // 0x1080036
    field public static final int ic_menu_camera = 17301559; // 0x1080037
    field public static final int ic_menu_close_clear_cancel = 17301560; // 0x1080038
    field public static final int ic_menu_compass = 17301561; // 0x1080039
    field public static final int ic_menu_crop = 17301562; // 0x108003a
    field public static final int ic_menu_day = 17301563; // 0x108003b
    field public static final int ic_menu_delete = 17301564; // 0x108003c
    field public static final int ic_menu_directions = 17301565; // 0x108003d
    field public static final int ic_menu_edit = 17301566; // 0x108003e
    field public static final int ic_menu_gallery = 17301567; // 0x108003f
    field public static final int ic_menu_help = 17301568; // 0x1080040
    field public static final int ic_menu_info_details = 17301569; // 0x1080041
    field public static final int ic_menu_manage = 17301570; // 0x1080042
    field public static final int ic_menu_mapmode = 17301571; // 0x1080043
    field public static final int ic_menu_month = 17301572; // 0x1080044
    field public static final int ic_menu_more = 17301573; // 0x1080045
    field public static final int ic_menu_my_calendar = 17301574; // 0x1080046
    field public static final int ic_menu_mylocation = 17301575; // 0x1080047
    field public static final int ic_menu_myplaces = 17301576; // 0x1080048
    field public static final int ic_menu_preferences = 17301577; // 0x1080049
    field public static final int ic_menu_recent_history = 17301578; // 0x108004a
    field public static final int ic_menu_report_image = 17301579; // 0x108004b
    field public static final int ic_menu_revert = 17301580; // 0x108004c
    field public static final int ic_menu_rotate = 17301581; // 0x108004d
    field public static final int ic_menu_save = 17301582; // 0x108004e
    field public static final int ic_menu_search = 17301583; // 0x108004f
    field public static final int ic_menu_send = 17301584; // 0x1080050
    field public static final int ic_menu_set_as = 17301585; // 0x1080051
    field public static final int ic_menu_share = 17301586; // 0x1080052
    field public static final int ic_menu_slideshow = 17301587; // 0x1080053
    field public static final int ic_menu_sort_alphabetically = 17301660; // 0x108009c
    field public static final int ic_menu_sort_by_size = 17301661; // 0x108009d
    field public static final int ic_menu_today = 17301588; // 0x1080054
    field public static final int ic_menu_upload = 17301589; // 0x1080055
    field public static final int ic_menu_upload_you_tube = 17301590; // 0x1080056
    field public static final int ic_menu_view = 17301591; // 0x1080057
    field public static final int ic_menu_week = 17301592; // 0x1080058
    field public static final int ic_menu_zoom = 17301593; // 0x1080059
    field public static final int ic_notification_clear_all = 17301594; // 0x108005a
    field public static final int ic_notification_overlay = 17301595; // 0x108005b
    field public static final int ic_partial_secure = 17301596; // 0x108005c
    field public static final int ic_popup_disk_full = 17301597; // 0x108005d
    field public static final int ic_popup_reminder = 17301598; // 0x108005e
    field public static final int ic_popup_sync = 17301599; // 0x108005f
    field public static final int ic_search_category_default = 17301600; // 0x1080060
    field public static final int ic_secure = 17301601; // 0x1080061
    field public static final int list_selector_background = 17301602; // 0x1080062
    field public static final int menu_frame = 17301603; // 0x1080063
    field public static final int menu_full_frame = 17301604; // 0x1080064
    field public static final int menuitem_background = 17301605; // 0x1080065
    field public static final int picture_frame = 17301606; // 0x1080066
    field public static final int presence_away = 17301607; // 0x1080067
    field public static final int presence_busy = 17301608; // 0x1080068
    field public static final int presence_invisible = 17301609; // 0x1080069
    field public static final int presence_offline = 17301610; // 0x108006a
    field public static final int presence_online = 17301611; // 0x108006b
    field public static final int progress_horizontal = 17301612; // 0x108006c
    field public static final int progress_indeterminate_horizontal = 17301613; // 0x108006d
    field public static final int radiobutton_off_background = 17301614; // 0x108006e
    field public static final int radiobutton_on_background = 17301615; // 0x108006f
    field public static final int screen_background_dark = 17301656; // 0x1080098
    field public static final int screen_background_light = 17301657; // 0x1080099
    field public static final int spinner_background = 17301616; // 0x1080070
    field public static final int spinner_dropdown_background = 17301617; // 0x1080071
    field public static final int star_big_off = 17301619; // 0x1080073
    field public static final int star_big_on = 17301618; // 0x1080072
    field public static final int star_off = 17301621; // 0x1080075
    field public static final int star_on = 17301620; // 0x1080074
    field public static final int stat_notify_call_mute = 17301622; // 0x1080076
    field public static final int stat_notify_chat = 17301623; // 0x1080077
    field public static final int stat_notify_error = 17301624; // 0x1080078
    field public static final int stat_notify_missed_call = 17301631; // 0x108007f
    field public static final int stat_notify_more = 17301625; // 0x1080079
    field public static final int stat_notify_sdcard = 17301626; // 0x108007a
    field public static final int stat_notify_sdcard_usb = 17301627; // 0x108007b
    field public static final int stat_notify_sync = 17301628; // 0x108007c
    field public static final int stat_notify_sync_noanim = 17301629; // 0x108007d
    field public static final int stat_notify_voicemail = 17301630; // 0x108007e
    field public static final int stat_sys_data_bluetooth = 17301632; // 0x1080080
    field public static final int stat_sys_download = 17301633; // 0x1080081
    field public static final int stat_sys_download_done = 17301634; // 0x1080082
    field public static final int stat_sys_headset = 17301635; // 0x1080083
    field public static final int stat_sys_phone_call = 17301636; // 0x1080084
    field public static final int stat_sys_phone_call_forward = 17301637; // 0x1080085
    field public static final int stat_sys_phone_call_on_hold = 17301638; // 0x1080086
    field public static final int stat_sys_speakerphone = 17301639; // 0x1080087
    field public static final int stat_sys_upload = 17301640; // 0x1080088
    field public static final int stat_sys_upload_done = 17301641; // 0x1080089
    field public static final int stat_sys_warning = 17301642; // 0x108008a
    field public static final int status_bar_item_app_background = 17301643; // 0x108008b
    field public static final int status_bar_item_background = 17301644; // 0x108008c
    field public static final int sym_action_call = 17301645; // 0x108008d
    field public static final int sym_action_chat = 17301646; // 0x108008e
    field public static final int sym_action_email = 17301647; // 0x108008f
    field public static final int sym_call_incoming = 17301648; // 0x1080090
    field public static final int sym_call_missed = 17301649; // 0x1080091
    field public static final int sym_call_outgoing = 17301650; // 0x1080092
    field public static final int sym_contact_card = 17301652; // 0x1080094
    field public static final int sym_def_app_icon = 17301651; // 0x1080093
    field public static final int title_bar = 17301653; // 0x1080095
    field public static final int title_bar_tall = 17301670; // 0x10800a6
    field public static final int toast_frame = 17301654; // 0x1080096
    field public static final int zoom_plate = 17301655; // 0x1080097
  }

  public static final class R.id {
    ctor public R.id();
    field public static final int addToDictionary = 16908330; // 0x102002a
    field public static final int background = 16908288; // 0x1020000
    field public static final int button1 = 16908313; // 0x1020019
    field public static final int button2 = 16908314; // 0x102001a
    field public static final int button3 = 16908315; // 0x102001b
    field public static final int candidatesArea = 16908317; // 0x102001d
    field public static final int checkbox = 16908289; // 0x1020001
    field public static final int closeButton = 16908327; // 0x1020027
    field public static final int content = 16908290; // 0x1020002
    field public static final int copy = 16908321; // 0x1020021
    field public static final int copyUrl = 16908323; // 0x1020023
    field public static final int cut = 16908320; // 0x1020020
    field public static final int edit = 16908291; // 0x1020003
    field public static final int empty = 16908292; // 0x1020004
    field public static final int extractArea = 16908316; // 0x102001c
    field public static final int hint = 16908293; // 0x1020005
    field public static final int icon = 16908294; // 0x1020006
    field public static final int icon1 = 16908295; // 0x1020007
    field public static final int icon2 = 16908296; // 0x1020008
    field public static final int input = 16908297; // 0x1020009
    field public static final int inputArea = 16908318; // 0x102001e
    field public static final int inputExtractEditText = 16908325; // 0x1020025
    field public static final int keyboardView = 16908326; // 0x1020026
    field public static final int list = 16908298; // 0x102000a
    field public static final int message = 16908299; // 0x102000b
    field public static final int paste = 16908322; // 0x1020022
    field public static final int primary = 16908300; // 0x102000c
    field public static final int progress = 16908301; // 0x102000d
    field public static final int secondaryProgress = 16908303; // 0x102000f
    field public static final int selectAll = 16908319; // 0x102001f
    field public static final int selectedIcon = 16908302; // 0x102000e
    field public static final int startSelectingText = 16908328; // 0x1020028
    field public static final int stopSelectingText = 16908329; // 0x1020029
    field public static final int summary = 16908304; // 0x1020010
    field public static final int switchInputMethod = 16908324; // 0x1020024
    field public static final int tabcontent = 16908305; // 0x1020011
    field public static final int tabhost = 16908306; // 0x1020012
    field public static final int tabs = 16908307; // 0x1020013
    field public static final int text1 = 16908308; // 0x1020014
    field public static final int text2 = 16908309; // 0x1020015
    field public static final int title = 16908310; // 0x1020016
    field public static final int toggle = 16908311; // 0x1020017
    field public static final int widget_frame = 16908312; // 0x1020018
  }

  public static final class R.integer {
    ctor public R.integer();
    field public static final int config_longAnimTime = 17694722; // 0x10e0002
    field public static final int config_mediumAnimTime = 17694721; // 0x10e0001
    field public static final int config_shortAnimTime = 17694720; // 0x10e0000
  }

  public static final class R.layout {
    ctor public R.layout();
    field public static final int activity_list_item = 17367040; // 0x1090000
    field public static final int browser_link_context_header = 17367054; // 0x109000e
    field public static final int expandable_list_content = 17367041; // 0x1090001
    field public static final int preference_category = 17367042; // 0x1090002
    field public static final int select_dialog_item = 17367057; // 0x1090011
    field public static final int select_dialog_multichoice = 17367059; // 0x1090013
    field public static final int select_dialog_singlechoice = 17367058; // 0x1090012
    field public static final int simple_dropdown_item_1line = 17367050; // 0x109000a
    field public static final int simple_expandable_list_item_1 = 17367046; // 0x1090006
    field public static final int simple_expandable_list_item_2 = 17367047; // 0x1090007
    field public static final int simple_gallery_item = 17367051; // 0x109000b
    field public static final int simple_list_item_1 = 17367043; // 0x1090003
    field public static final int simple_list_item_2 = 17367044; // 0x1090004
    field public static final int simple_list_item_checked = 17367045; // 0x1090005
    field public static final int simple_list_item_multiple_choice = 17367056; // 0x1090010
    field public static final int simple_list_item_single_choice = 17367055; // 0x109000f
    field public static final int simple_spinner_dropdown_item = 17367049; // 0x1090009
    field public static final int simple_spinner_item = 17367048; // 0x1090008
    field public static final int test_list_item = 17367052; // 0x109000c
    field public static final int two_line_list_item = 17367053; // 0x109000d
  }

  public static final class R.plurals {
    ctor public R.plurals();
  }

  public static final class R.raw {
    ctor public R.raw();
  }

  public static final class R.string {
    ctor public R.string();
    field public static final int VideoView_error_button = 17039376; // 0x1040010
    field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015
    field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011
    field public static final int VideoView_error_title = 17039378; // 0x1040012
    field public static final int cancel = 17039360; // 0x1040000
    field public static final int copy = 17039361; // 0x1040001
    field public static final int copyUrl = 17039362; // 0x1040002
    field public static final int cut = 17039363; // 0x1040003
    field public static final int defaultMsisdnAlphaTag = 17039365; // 0x1040005
    field public static final int defaultVoiceMailAlphaTag = 17039364; // 0x1040004
    field public static final int dialog_alert_title = 17039380; // 0x1040014
    field public static final int emptyPhoneNumber = 17039366; // 0x1040006
    field public static final int httpErrorBadUrl = 17039367; // 0x1040007
    field public static final int httpErrorUnsupportedScheme = 17039368; // 0x1040008
    field public static final int no = 17039369; // 0x1040009
    field public static final int ok = 17039370; // 0x104000a
    field public static final int paste = 17039371; // 0x104000b
    field public static final int search_go = 17039372; // 0x104000c
    field public static final int selectAll = 17039373; // 0x104000d
    field public static final int unknownName = 17039374; // 0x104000e
    field public static final int untitled = 17039375; // 0x104000f
    field public static final int yes = 17039379; // 0x1040013
  }

  public static final class R.style {
    ctor public R.style();
    field public static final int Animation = 16973824; // 0x1030000
    field public static final int Animation_Activity = 16973825; // 0x1030001
    field public static final int Animation_Dialog = 16973826; // 0x1030002
    field public static final int Animation_Toast = 16973828; // 0x1030004
    field public static final int Animation_Translucent = 16973827; // 0x1030003
    field public static final int MediaButton = 16973879; // 0x1030037
    field public static final int MediaButton_Ffwd = 16973883; // 0x103003b
    field public static final int MediaButton_Next = 16973881; // 0x1030039
    field public static final int MediaButton_Pause = 16973885; // 0x103003d
    field public static final int MediaButton_Play = 16973882; // 0x103003a
    field public static final int MediaButton_Previous = 16973880; // 0x1030038
    field public static final int MediaButton_Rew = 16973884; // 0x103003c
    field public static final int TextAppearance = 16973886; // 0x103003e
    field public static final int TextAppearance_DialogWindowTitle = 16973889; // 0x1030041
    field public static final int TextAppearance_Inverse = 16973887; // 0x103003f
    field public static final int TextAppearance_Large = 16973890; // 0x1030042
    field public static final int TextAppearance_Large_Inverse = 16973891; // 0x1030043
    field public static final int TextAppearance_Medium = 16973892; // 0x1030044
    field public static final int TextAppearance_Medium_Inverse = 16973893; // 0x1030045
    field public static final int TextAppearance_Small = 16973894; // 0x1030046
    field public static final int TextAppearance_Small_Inverse = 16973895; // 0x1030047
    field public static final int TextAppearance_Theme = 16973888; // 0x1030040
    field public static final int TextAppearance_Theme_Dialog = 16973896; // 0x1030048
    field public static final int TextAppearance_Widget = 16973897; // 0x1030049
    field public static final int TextAppearance_Widget_Button = 16973898; // 0x103004a
    field public static final int TextAppearance_Widget_DropDownHint = 16973904; // 0x1030050
    field public static final int TextAppearance_Widget_DropDownItem = 16973905; // 0x1030051
    field public static final int TextAppearance_Widget_EditText = 16973900; // 0x103004c
    field public static final int TextAppearance_Widget_IconMenu_Item = 16973899; // 0x103004b
    field public static final int TextAppearance_Widget_TabWidget = 16973901; // 0x103004d
    field public static final int TextAppearance_Widget_TextView = 16973902; // 0x103004e
    field public static final int TextAppearance_Widget_TextView_PopupMenu = 16973903; // 0x103004f
    field public static final int TextAppearance_Widget_TextView_SpinnerItem = 16973906; // 0x1030052
    field public static final int TextAppearance_WindowTitle = 16973907; // 0x1030053
    field public static final int Theme = 16973829; // 0x1030005
    field public static final int Theme_Black = 16973832; // 0x1030008
    field public static final int Theme_Black_NoTitleBar = 16973833; // 0x1030009
    field public static final int Theme_Black_NoTitleBar_Fullscreen = 16973834; // 0x103000a
    field public static final int Theme_Dialog = 16973835; // 0x103000b
    field public static final int Theme_InputMethod = 16973908; // 0x1030054
    field public static final int Theme_Light = 16973836; // 0x103000c
    field public static final int Theme_Light_NoTitleBar = 16973837; // 0x103000d
    field public static final int Theme_Light_NoTitleBar_Fullscreen = 16973838; // 0x103000e
    field public static final int Theme_Light_Panel = 16973914; // 0x103005a
    field public static final int Theme_NoDisplay = 16973909; // 0x1030055
    field public static final int Theme_NoTitleBar = 16973830; // 0x1030006
    field public static final int Theme_NoTitleBar_Fullscreen = 16973831; // 0x1030007
    field public static final int Theme_Panel = 16973913; // 0x1030059
    field public static final int Theme_Translucent = 16973839; // 0x103000f
    field public static final int Theme_Translucent_NoTitleBar = 16973840; // 0x1030010
    field public static final int Theme_Translucent_NoTitleBar_Fullscreen = 16973841; // 0x1030011
    field public static final int Widget = 16973842; // 0x1030012
    field public static final int Widget_AbsListView = 16973843; // 0x1030013
    field public static final int Widget_AutoCompleteTextView = 16973863; // 0x1030027
    field public static final int Widget_Button = 16973844; // 0x1030014
    field public static final int Widget_Button_Inset = 16973845; // 0x1030015
    field public static final int Widget_Button_Small = 16973846; // 0x1030016
    field public static final int Widget_Button_Toggle = 16973847; // 0x1030017
    field public static final int Widget_CompoundButton = 16973848; // 0x1030018
    field public static final int Widget_CompoundButton_CheckBox = 16973849; // 0x1030019
    field public static final int Widget_CompoundButton_RadioButton = 16973850; // 0x103001a
    field public static final int Widget_CompoundButton_Star = 16973851; // 0x103001b
    field public static final int Widget_DropDownItem = 16973867; // 0x103002b
    field public static final int Widget_DropDownItem_Spinner = 16973868; // 0x103002c
    field public static final int Widget_EditText = 16973859; // 0x1030023
    field public static final int Widget_ExpandableListView = 16973860; // 0x1030024
    field public static final int Widget_Gallery = 16973877; // 0x1030035
    field public static final int Widget_GridView = 16973874; // 0x1030032
    field public static final int Widget_ImageButton = 16973862; // 0x1030026
    field public static final int Widget_ImageWell = 16973861; // 0x1030025
    field public static final int Widget_KeyboardView = 16973911; // 0x1030057
    field public static final int Widget_ListView = 16973870; // 0x103002e
    field public static final int Widget_ListView_DropDown = 16973872; // 0x1030030
    field public static final int Widget_ListView_Menu = 16973873; // 0x1030031
    field public static final int Widget_ListView_White = 16973871; // 0x103002f
    field public static final int Widget_PopupWindow = 16973878; // 0x1030036
    field public static final int Widget_ProgressBar = 16973852; // 0x103001c
    field public static final int Widget_ProgressBar_Horizontal = 16973855; // 0x103001f
    field public static final int Widget_ProgressBar_Large = 16973853; // 0x103001d
    field public static final int Widget_ProgressBar_Small = 16973854; // 0x103001e
    field public static final int Widget_RatingBar = 16973857; // 0x1030021
    field public static final int Widget_ScrollView = 16973869; // 0x103002d
    field public static final int Widget_SeekBar = 16973856; // 0x1030020
    field public static final int Widget_Spinner = 16973864; // 0x1030028
    field public static final int Widget_TabWidget = 16973876; // 0x1030034
    field public static final int Widget_TextView = 16973858; // 0x1030022
    field public static final int Widget_TextView_PopupMenu = 16973865; // 0x1030029
    field public static final int Widget_TextView_SpinnerItem = 16973866; // 0x103002a
    field public static final int Widget_WebView = 16973875; // 0x1030033
  }

  public static final class R.xml {
    ctor public R.xml();
  }

}

package android.app {

  public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks android.view.KeyEvent.Callback android.view.LayoutInflater.Factory android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
    ctor public Activity();
    method public void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void closeContextMenu();
    method public void closeOptionsMenu();
    method public android.app.PendingIntent createPendingResult(int, android.content.Intent, int);
    method public final void dismissDialog(int);
    method public boolean dispatchKeyEvent(android.view.KeyEvent);
    method public boolean dispatchTouchEvent(android.view.MotionEvent);
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public android.view.View findViewById(int);
    method public void finish();
    method public void finishActivity(int);
    method public void finishActivityFromChild(android.app.Activity, int);
    method public void finishFromChild(android.app.Activity);
    method public final android.app.Application getApplication();
    method public android.content.ComponentName getCallingActivity();
    method public String getCallingPackage();
    method public int getChangingConfigurations();
    method public android.content.ComponentName getComponentName();
    method public android.view.View getCurrentFocus();
    method public static long getInstanceCount();
    method public android.content.Intent getIntent();
    method public Object getLastNonConfigurationInstance();
    method public android.view.LayoutInflater getLayoutInflater();
    method public String getLocalClassName();
    method public android.view.MenuInflater getMenuInflater();
    method public final android.app.Activity getParent();
    method public android.content.SharedPreferences getPreferences(int);
    method public int getRequestedOrientation();
    method public int getTaskId();
    method public final CharSequence getTitle();
    method public final int getTitleColor();
    method public final int getVolumeControlStream();
    method public android.view.Window getWindow();
    method public android.view.WindowManager getWindowManager();
    method public boolean hasWindowFocus();
    method public final boolean isChild();
    method public boolean isFinishing();
    method public boolean isTaskRoot();
    method public final android.database.Cursor managedQuery(android.net.Uri, String[], String, String[], String);
    method public boolean moveTaskToBack(boolean);
    method protected void onActivityResult(int, int, android.content.Intent);
    method protected void onChildTitleChanged(android.app.Activity, CharSequence);
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onContentChanged();
    method public boolean onContextItemSelected(android.view.MenuItem);
    method public void onContextMenuClosed(android.view.Menu);
    method protected void onCreate(android.os.Bundle);
    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
    method public CharSequence onCreateDescription();
    method protected android.app.Dialog onCreateDialog(int);
    method public boolean onCreateOptionsMenu(android.view.Menu);
    method public boolean onCreatePanelMenu(int, android.view.Menu);
    method public android.view.View onCreatePanelView(int);
    method public boolean onCreateThumbnail(android.graphics.Bitmap, android.graphics.Canvas);
    method public android.view.View onCreateView(String, android.content.Context, android.util.AttributeSet);
    method protected void onDestroy();
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
    method public void onLowMemory();
    method public boolean onMenuItemSelected(int, android.view.MenuItem);
    method public boolean onMenuOpened(int, android.view.Menu);
    method protected void onNewIntent(android.content.Intent);
    method public boolean onOptionsItemSelected(android.view.MenuItem);
    method public void onOptionsMenuClosed(android.view.Menu);
    method public void onPanelClosed(int, android.view.Menu);
    method protected void onPause();
    method protected void onPostCreate(android.os.Bundle);
    method protected void onPostResume();
    method protected void onPrepareDialog(int, android.app.Dialog);
    method public boolean onPrepareOptionsMenu(android.view.Menu);
    method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    method protected void onRestart();
    method protected void onRestoreInstanceState(android.os.Bundle);
    method protected void onResume();
    method public Object onRetainNonConfigurationInstance();
    method protected void onSaveInstanceState(android.os.Bundle);
    method public boolean onSearchRequested();
    method protected void onStart();
    method protected void onStop();
    method protected void onTitleChanged(CharSequence, int);
    method public boolean onTouchEvent(android.view.MotionEvent);
    method public boolean onTrackballEvent(android.view.MotionEvent);
    method public void onUserInteraction();
    method protected void onUserLeaveHint();
    method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
    method public void onWindowFocusChanged(boolean);
    method public void openContextMenu(android.view.View);
    method public void openOptionsMenu();
    method public void registerForContextMenu(android.view.View);
    method public final void removeDialog(int);
    method public final boolean requestWindowFeature(int);
    method public final void runOnUiThread(Runnable);
    method public void setContentView(int);
    method public void setContentView(android.view.View);
    method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public final void setDefaultKeyMode(int);
    method public final void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    method public final void setFeatureDrawableAlpha(int, int);
    method public final void setFeatureDrawableResource(int, int);
    method public final void setFeatureDrawableUri(int, android.net.Uri);
    method public void setIntent(android.content.Intent);
    method public void setPersistent(boolean);
    method public final void setProgress(int);
    method public final void setProgressBarIndeterminate(boolean);
    method public final void setProgressBarIndeterminateVisibility(boolean);
    method public final void setProgressBarVisibility(boolean);
    method public void setRequestedOrientation(int);
    method public final void setResult(int);
    method public final void setResult(int, android.content.Intent);
    method public final void setSecondaryProgress(int);
    method public void setTitle(CharSequence);
    method public void setTitle(int);
    method public void setTitleColor(int);
    method public void setVisible(boolean);
    method public final void setVolumeControlStream(int);
    method public final void showDialog(int);
    method public void startActivityForResult(android.content.Intent, int);
    method public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
    method public boolean startActivityIfNeeded(android.content.Intent, int);
    method public void startManagingCursor(android.database.Cursor);
    method public boolean startNextMatchingActivity(android.content.Intent);
    method public void startSearch(String, boolean, android.os.Bundle, boolean);
    method public void stopManagingCursor(android.database.Cursor);
    method public void takeKeyEvents(boolean);
    method public void unregisterForContextMenu(android.view.View);
    field public static final int DEFAULT_KEYS_DIALER = 1; // 0x1
    field public static final int DEFAULT_KEYS_DISABLE = 0; // 0x0
    field public static final int DEFAULT_KEYS_SEARCH_GLOBAL = 4; // 0x4
    field public static final int DEFAULT_KEYS_SEARCH_LOCAL = 3; // 0x3
    field public static final int DEFAULT_KEYS_SHORTCUT = 2; // 0x2
    field protected static final int[] FOCUSED_STATE_SET;
    field public static final int RESULT_CANCELED = 0; // 0x0
    field public static final int RESULT_FIRST_USER = 1; // 0x1
    field public static final int RESULT_OK = -1; // 0xffffffff
  }

  public class ActivityGroup extends android.app.Activity {
    ctor public ActivityGroup();
    ctor public ActivityGroup(boolean);
    method public android.app.Activity getCurrentActivity();
    method public final android.app.LocalActivityManager getLocalActivityManager();
  }

  public class ActivityManager {
    method public android.content.pm.ConfigurationInfo getDeviceConfigurationInfo();
    method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
    method public java.util.List<android.app.ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
    method public java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
    method public java.util.List<android.app.ActivityManager.RunningAppProcessInfo> getRunningAppProcesses();
    method public java.util.List<android.app.ActivityManager.RunningServiceInfo> getRunningServices(int) throws java.lang.SecurityException;
    method public java.util.List<android.app.ActivityManager.RunningTaskInfo> getRunningTasks(int) throws java.lang.SecurityException;
    method public void restartPackage(String);
    field public static final int RECENT_WITH_EXCLUDED = 1; // 0x1
  }

  public static class ActivityManager.MemoryInfo implements android.os.Parcelable {
    ctor public ActivityManager.MemoryInfo();
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.MemoryInfo> CREATOR;
    field public long availMem;
    field public boolean lowMemory;
    field public long threshold;
  }

  public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
    ctor public ActivityManager.ProcessErrorStateInfo();
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CRASHED = 1; // 0x1
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.ProcessErrorStateInfo> CREATOR;
    field public static final int NOT_RESPONDING = 2; // 0x2
    field public static final int NO_ERROR = 0; // 0x0
    field public int condition;
    field public byte[] crashData;
    field public String longMsg;
    field public int pid;
    field public String processName;
    field public String shortMsg;
    field public String tag;
    field public int uid;
  }

  public static class ActivityManager.RecentTaskInfo implements android.os.Parcelable {
    ctor public ActivityManager.RecentTaskInfo();
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RecentTaskInfo> CREATOR;
    field public android.content.Intent baseIntent;
    field public int id;
    field public android.content.ComponentName origActivity;
  }

  public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable {
    ctor public ActivityManager.RunningAppProcessInfo();
    ctor public ActivityManager.RunningAppProcessInfo(String, int, String[]);
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningAppProcessInfo> CREATOR;
    field public static final int IMPORTANCE_BACKGROUND = 400; // 0x190
    field public static final int IMPORTANCE_EMPTY = 500; // 0x1f4
    field public static final int IMPORTANCE_FOREGROUND = 100; // 0x64
    field public static final int IMPORTANCE_SERVICE = 300; // 0x12c
    field public static final int IMPORTANCE_VISIBLE = 200; // 0xc8
    field public int importance;
    field public int lru;
    field public int pid;
    field public String[] pkgList;
    field public String processName;
  }

  public static class ActivityManager.RunningServiceInfo implements android.os.Parcelable {
    ctor public ActivityManager.RunningServiceInfo();
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningServiceInfo> CREATOR;
    field public long activeSince;
    field public int clientCount;
    field public int crashCount;
    field public boolean foreground;
    field public long lastActivityTime;
    field public int pid;
    field public String process;
    field public long restarting;
    field public android.content.ComponentName service;
    field public boolean started;
  }

  public static class ActivityManager.RunningTaskInfo implements android.os.Parcelable {
    ctor public ActivityManager.RunningTaskInfo();
    method public int describeContents();
    method public void readFromParcel(android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.ActivityManager.RunningTaskInfo> CREATOR;
    field public android.content.ComponentName baseActivity;
    field public CharSequence description;
    field public int id;
    field public int numActivities;
    field public int numRunning;
    field public android.graphics.Bitmap thumbnail;
    field public android.content.ComponentName topActivity;
  }

  public class AlarmManager {
    method public void cancel(android.app.PendingIntent);
    method public void set(int, long, android.app.PendingIntent);
    method public void setInexactRepeating(int, long, long, android.app.PendingIntent);
    method public void setRepeating(int, long, long, android.app.PendingIntent);
    method public void setTimeZone(String);
    field public static final int ELAPSED_REALTIME = 3; // 0x3
    field public static final int ELAPSED_REALTIME_WAKEUP = 2; // 0x2
    field public static final long INTERVAL_DAY = 86400000L; // 0x5265c00L
    field public static final long INTERVAL_FIFTEEN_MINUTES = 900000L; // 0xdbba0L
    field public static final long INTERVAL_HALF_DAY = 43200000L; // 0x2932e00L
    field public static final long INTERVAL_HALF_HOUR = 1800000L; // 0x1b7740L
    field public static final long INTERVAL_HOUR = 3600000L; // 0x36ee80L
    field public static final int RTC = 1; // 0x1
    field public static final int RTC_WAKEUP = 0; // 0x0
  }

  public class AlertDialog extends android.app.Dialog implements android.content.DialogInterface {
    ctor protected AlertDialog(android.content.Context);
    ctor protected AlertDialog(android.content.Context, int);
    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
    method public android.widget.Button getButton(int);
    method public android.widget.ListView getListView();
    method public void setButton(int, CharSequence, android.os.Message);
    method public void setButton(int, CharSequence, android.content.DialogInterface.OnClickListener);
    method public void setButton(CharSequence, android.os.Message);
    method public void setButton(CharSequence, android.content.DialogInterface.OnClickListener);
    method public void setButton2(CharSequence, android.os.Message);
    method public void setButton2(CharSequence, android.content.DialogInterface.OnClickListener);
    method public void setButton3(CharSequence, android.os.Message);
    method public void setButton3(CharSequence, android.content.DialogInterface.OnClickListener);
    method public void setCustomTitle(android.view.View);
    method public void setIcon(int);
    method public void setIcon(android.graphics.drawable.Drawable);
    method public void setInverseBackgroundForced(boolean);
    method public void setMessage(CharSequence);
    method public void setView(android.view.View);
    method public void setView(android.view.View, int, int, int, int);
  }

  public static class AlertDialog.Builder {
    ctor public AlertDialog.Builder(android.content.Context);
    method public android.app.AlertDialog create();
    method public android.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setCancelable(boolean);
    method public android.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, String);
    method public android.app.AlertDialog.Builder setCustomTitle(android.view.View);
    method public android.app.AlertDialog.Builder setIcon(int);
    method public android.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
    method public android.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
    method public android.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setItems(CharSequence[], android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setMessage(int);
    method public android.app.AlertDialog.Builder setMessage(CharSequence);
    method public android.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
    method public android.app.AlertDialog.Builder setMultiChoiceItems(CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
    method public android.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, String, String, android.content.DialogInterface.OnMultiChoiceClickListener);
    method public android.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setNegativeButton(CharSequence, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setNeutralButton(CharSequence, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
    method public android.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
    method public android.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
    method public android.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setPositiveButton(CharSequence, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, String, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setSingleChoiceItems(CharSequence[], int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
    method public android.app.AlertDialog.Builder setTitle(int);
    method public android.app.AlertDialog.Builder setTitle(CharSequence);
    method public android.app.AlertDialog.Builder setView(android.view.View);
    method public android.app.AlertDialog show();
  }

  public class AliasActivity extends android.app.Activity {
    ctor public AliasActivity();
  }

  public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks {
    ctor public Application();
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onCreate();
    method public void onLowMemory();
    method public void onTerminate();
  }

  public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {
    ctor public DatePickerDialog(android.content.Context, android.app.DatePickerDialog.OnDateSetListener, int, int, int);
    ctor public DatePickerDialog(android.content.Context, int, android.app.DatePickerDialog.OnDateSetListener, int, int, int);
    method public void onClick(android.content.DialogInterface, int);
    method public void onDateChanged(android.widget.DatePicker, int, int, int);
    method public void updateDate(int, int, int);
  }

  public static interface DatePickerDialog.OnDateSetListener {
    method public void onDateSet(android.widget.DatePicker, int, int, int);
  }

  public class Dialog implements android.content.DialogInterface android.view.KeyEvent.Callback android.view.View.OnCreateContextMenuListener android.view.Window.Callback {
    ctor public Dialog(android.content.Context);
    ctor public Dialog(android.content.Context, int);
    ctor protected Dialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
    method public void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void cancel();
    method public void closeOptionsMenu();
    method public void dismiss();
    method public boolean dispatchKeyEvent(android.view.KeyEvent);
    method public boolean dispatchTouchEvent(android.view.MotionEvent);
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public android.view.View findViewById(int);
    method public final android.content.Context getContext();
    method public android.view.View getCurrentFocus();
    method public android.view.LayoutInflater getLayoutInflater();
    method public final android.app.Activity getOwnerActivity();
    method public final int getVolumeControlStream();
    method public android.view.Window getWindow();
    method public void hide();
    method public boolean isShowing();
    method public void onContentChanged();
    method public boolean onContextItemSelected(android.view.MenuItem);
    method public void onContextMenuClosed(android.view.Menu);
    method protected void onCreate(android.os.Bundle);
    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
    method public boolean onCreateOptionsMenu(android.view.Menu);
    method public boolean onCreatePanelMenu(int, android.view.Menu);
    method public android.view.View onCreatePanelView(int);
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
    method public boolean onMenuItemSelected(int, android.view.MenuItem);
    method public boolean onMenuOpened(int, android.view.Menu);
    method public boolean onOptionsItemSelected(android.view.MenuItem);
    method public void onOptionsMenuClosed(android.view.Menu);
    method public void onPanelClosed(int, android.view.Menu);
    method public boolean onPrepareOptionsMenu(android.view.Menu);
    method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    method public void onRestoreInstanceState(android.os.Bundle);
    method public android.os.Bundle onSaveInstanceState();
    method public boolean onSearchRequested();
    method protected void onStart();
    method protected void onStop();
    method public boolean onTouchEvent(android.view.MotionEvent);
    method public boolean onTrackballEvent(android.view.MotionEvent);
    method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
    method public void onWindowFocusChanged(boolean);
    method public void openContextMenu(android.view.View);
    method public void openOptionsMenu();
    method public void registerForContextMenu(android.view.View);
    method public final boolean requestWindowFeature(int);
    method public void setCancelMessage(android.os.Message);
    method public void setCancelable(boolean);
    method public void setCanceledOnTouchOutside(boolean);
    method public void setContentView(int);
    method public void setContentView(android.view.View);
    method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void setDismissMessage(android.os.Message);
    method public final void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    method public final void setFeatureDrawableAlpha(int, int);
    method public final void setFeatureDrawableResource(int, int);
    method public final void setFeatureDrawableUri(int, android.net.Uri);
    method public void setOnCancelListener(android.content.DialogInterface.OnCancelListener);
    method public void setOnDismissListener(android.content.DialogInterface.OnDismissListener);
    method public void setOnKeyListener(android.content.DialogInterface.OnKeyListener);
    method public final void setOwnerActivity(android.app.Activity);
    method public void setTitle(CharSequence);
    method public void setTitle(int);
    method public final void setVolumeControlStream(int);
    method public void show();
    method public void takeKeyEvents(boolean);
    method public void unregisterForContextMenu(android.view.View);
  }

  public class ExpandableListActivity extends android.app.Activity implements android.widget.ExpandableListView.OnChildClickListener android.widget.ExpandableListView.OnGroupCollapseListener android.widget.ExpandableListView.OnGroupExpandListener android.view.View.OnCreateContextMenuListener {
    ctor public ExpandableListActivity();
    method public android.widget.ExpandableListAdapter getExpandableListAdapter();
    method public android.widget.ExpandableListView getExpandableListView();
    method public long getSelectedId();
    method public long getSelectedPosition();
    method public boolean onChildClick(android.widget.ExpandableListView, android.view.View, int, int, long);
    method public void onGroupCollapse(int);
    method public void onGroupExpand(int);
    method public void setListAdapter(android.widget.ExpandableListAdapter);
    method public boolean setSelectedChild(int, int, boolean);
    method public void setSelectedGroup(int);
  }

  public class Instrumentation {
    ctor public Instrumentation();
    method public void addMonitor(android.app.Instrumentation.ActivityMonitor);
    method public android.app.Instrumentation.ActivityMonitor addMonitor(android.content.IntentFilter, android.app.Instrumentation.ActivityResult, boolean);
    method public android.app.Instrumentation.ActivityMonitor addMonitor(String, android.app.Instrumentation.ActivityResult, boolean);
    method public void callActivityOnCreate(android.app.Activity, android.os.Bundle);
    method public void callActivityOnDestroy(android.app.Activity);
    method public void callActivityOnNewIntent(android.app.Activity, android.content.Intent);
    method public void callActivityOnPause(android.app.Activity);
    method public void callActivityOnPostCreate(android.app.Activity, android.os.Bundle);
    method public void callActivityOnRestart(android.app.Activity);
    method public void callActivityOnRestoreInstanceState(android.app.Activity, android.os.Bundle);
    method public void callActivityOnResume(android.app.Activity);
    method public void callActivityOnSaveInstanceState(android.app.Activity, android.os.Bundle);
    method public void callActivityOnStart(android.app.Activity);
    method public void callActivityOnStop(android.app.Activity);
    method public void callActivityOnUserLeaving(android.app.Activity);
    method public void callApplicationOnCreate(android.app.Application);
    method public boolean checkMonitorHit(android.app.Instrumentation.ActivityMonitor, int);
    method public void endPerformanceSnapshot();
    method public void finish(int, android.os.Bundle);
    method public android.os.Bundle getAllocCounts();
    method public android.os.Bundle getBinderCounts();
    method public android.content.ComponentName getComponentName();
    method public android.content.Context getContext();
    method public android.content.Context getTargetContext();
    method public boolean invokeContextMenuAction(android.app.Activity, int, int);
    method public boolean invokeMenuActionSync(android.app.Activity, int, int);
    method public boolean isProfiling();
    method public android.app.Activity newActivity(Class<?>, android.content.Context, android.os.IBinder, android.app.Application, android.content.Intent, android.content.pm.ActivityInfo, CharSequence, android.app.Activity, String, Object) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.app.Activity newActivity(ClassLoader, String, android.content.Intent) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.app.Application newApplication(ClassLoader, String, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public static android.app.Application newApplication(Class<?>, android.content.Context) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public void onCreate(android.os.Bundle);
    method public void onDestroy();
    method public boolean onException(Object, Throwable);
    method public void onStart();
    method public void removeMonitor(android.app.Instrumentation.ActivityMonitor);
    method public void runOnMainSync(Runnable);
    method public void sendCharacterSync(int);
    method public void sendKeyDownUpSync(int);
    method public void sendKeySync(android.view.KeyEvent);
    method public void sendPointerSync(android.view.MotionEvent);
    method public void sendStatus(int, android.os.Bundle);
    method public void sendStringSync(String);
    method public void sendTrackballEventSync(android.view.MotionEvent);
    method public void setAutomaticPerformanceSnapshots();
    method public void setInTouchMode(boolean);
    method public void start();
    method public android.app.Activity startActivitySync(android.content.Intent);
    method public void startAllocCounting();
    method public void startPerformanceSnapshot();
    method public void startProfiling();
    method public void stopAllocCounting();
    method public void stopProfiling();
    method public void waitForIdle(Runnable);
    method public void waitForIdleSync();
    method public android.app.Activity waitForMonitor(android.app.Instrumentation.ActivityMonitor);
    method public android.app.Activity waitForMonitorWithTimeout(android.app.Instrumentation.ActivityMonitor, long);
    field public static final String REPORT_KEY_IDENTIFIER = "id";
    field public static final String REPORT_KEY_STREAMRESULT = "stream";
  }

  public static class Instrumentation.ActivityMonitor {
    ctor public Instrumentation.ActivityMonitor(android.content.IntentFilter, android.app.Instrumentation.ActivityResult, boolean);
    ctor public Instrumentation.ActivityMonitor(String, android.app.Instrumentation.ActivityResult, boolean);
    method public final android.content.IntentFilter getFilter();
    method public final int getHits();
    method public final android.app.Activity getLastActivity();
    method public final android.app.Instrumentation.ActivityResult getResult();
    method public final boolean isBlocking();
    method public final android.app.Activity waitForActivity();
    method public final android.app.Activity waitForActivityWithTimeout(long);
  }

  public static final class Instrumentation.ActivityResult {
    ctor public Instrumentation.ActivityResult(int, android.content.Intent);
    method public int getResultCode();
    method public android.content.Intent getResultData();
  }

  public abstract class IntentService extends android.app.Service {
    ctor public IntentService(String);
    method public android.os.IBinder onBind(android.content.Intent);
    method protected abstract void onHandleIntent(android.content.Intent);
  }

  public class KeyguardManager {
    method public void exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult);
    method public boolean inKeyguardRestrictedInputMode();
    method public android.app.KeyguardManager.KeyguardLock newKeyguardLock(String);
  }

  public class KeyguardManager.KeyguardLock {
    method public void disableKeyguard();
    method public void reenableKeyguard();
  }

  public static interface KeyguardManager.OnKeyguardExitResult {
    method public void onKeyguardExitResult(boolean);
  }

  public abstract class LauncherActivity extends android.app.ListActivity {
    ctor public LauncherActivity();
    method protected android.content.Intent getTargetIntent();
    method protected android.content.Intent intentForPosition(int);
    method public java.util.List<android.app.LauncherActivity.ListItem> makeListItems();
  }

  public class LauncherActivity.IconResizer {
    ctor public LauncherActivity.IconResizer();
    method public android.graphics.drawable.Drawable createIconThumbnail(android.graphics.drawable.Drawable);
  }

  public static class LauncherActivity.ListItem {
    ctor public LauncherActivity.ListItem();
    field public String className;
    field public android.os.Bundle extras;
    field public android.graphics.drawable.Drawable icon;
    field public CharSequence label;
    field public String packageName;
  }

  public class ListActivity extends android.app.Activity {
    ctor public ListActivity();
    method public android.widget.ListAdapter getListAdapter();
    method public android.widget.ListView getListView();
    method public long getSelectedItemId();
    method public int getSelectedItemPosition();
    method protected void onListItemClick(android.widget.ListView, android.view.View, int, long);
    method public void setListAdapter(android.widget.ListAdapter);
    method public void setSelection(int);
  }

  public class LocalActivityManager {
    ctor public LocalActivityManager(android.app.Activity, boolean);
    method public android.view.Window destroyActivity(String, boolean);
    method public void dispatchCreate(android.os.Bundle);
    method public void dispatchDestroy(boolean);
    method public void dispatchPause(boolean);
    method public void dispatchResume();
    method public void dispatchStop();
    method public android.app.Activity getActivity(String);
    method public android.app.Activity getCurrentActivity();
    method public String getCurrentId();
    method public void removeAllActivities();
    method public android.os.Bundle saveInstanceState();
    method public android.view.Window startActivity(String, android.content.Intent);
  }

  public class Notification implements android.os.Parcelable {
    ctor public Notification();
    ctor public Notification(int, CharSequence, long);
    ctor public Notification(android.os.Parcel);
    method public int describeContents();
    method public void setLatestEventInfo(android.content.Context, CharSequence, CharSequence, android.app.PendingIntent);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.Notification> CREATOR;
    field public static final int DEFAULT_ALL = -1; // 0xffffffff
    field public static final int DEFAULT_LIGHTS = 4; // 0x4
    field public static final int DEFAULT_SOUND = 1; // 0x1
    field public static final int DEFAULT_VIBRATE = 2; // 0x2
    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
    field public static final int FLAG_INSISTENT = 4; // 0x4
    field public static final int FLAG_NO_CLEAR = 32; // 0x20
    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
    field public int audioStreamType;
    field public android.app.PendingIntent contentIntent;
    field public android.widget.RemoteViews contentView;
    field public int defaults;
    field public android.app.PendingIntent deleteIntent;
    field public int flags;
    field public int icon;
    field public int iconLevel;
    field public int ledARGB;
    field public int ledOffMS;
    field public int ledOnMS;
    field public int number;
    field public android.net.Uri sound;
    field public CharSequence tickerText;
    field public long[] vibrate;
    field public long when;
  }

  public class NotificationManager {
    method public void cancel(int);
    method public void cancelAll();
    method public void notify(int, android.app.Notification);
  }

  public final class PendingIntent implements android.os.Parcelable {
    method public void cancel();
    method public int describeContents();
    method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
    method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
    method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
    method public String getTargetPackage();
    method public static android.app.PendingIntent readPendingIntentOrNullFromParcel(android.os.Parcel);
    method public void send() throws android.app.PendingIntent.CanceledException;
    method public void send(int) throws android.app.PendingIntent.CanceledException;
    method public void send(android.content.Context, int, android.content.Intent) throws android.app.PendingIntent.CanceledException;
    method public void send(int, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
    method public void send(android.content.Context, int, android.content.Intent, android.app.PendingIntent.OnFinished, android.os.Handler) throws android.app.PendingIntent.CanceledException;
    method public static void writePendingIntentOrNullToParcel(android.app.PendingIntent, android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.PendingIntent> CREATOR;
    field public static final int FLAG_CANCEL_CURRENT = 268435456; // 0x10000000
    field public static final int FLAG_NO_CREATE = 536870912; // 0x20000000
    field public static final int FLAG_ONE_SHOT = 1073741824; // 0x40000000
    field public static final int FLAG_UPDATE_CURRENT = 134217728; // 0x8000000
  }

  public static class PendingIntent.CanceledException extends android.util.AndroidException {
    ctor public PendingIntent.CanceledException();
    ctor public PendingIntent.CanceledException(String);
    ctor public PendingIntent.CanceledException(Exception);
  }

  public static interface PendingIntent.OnFinished {
    method public void onSendFinished(android.app.PendingIntent, android.content.Intent, int, String, android.os.Bundle);
  }

  public class ProgressDialog extends android.app.AlertDialog {
    ctor public ProgressDialog(android.content.Context);
    ctor public ProgressDialog(android.content.Context, int);
    method public int getMax();
    method public int getProgress();
    method public int getSecondaryProgress();
    method public void incrementProgressBy(int);
    method public void incrementSecondaryProgressBy(int);
    method public boolean isIndeterminate();
    method public void onStart();
    method public void setIndeterminate(boolean);
    method public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
    method public void setMax(int);
    method public void setProgress(int);
    method public void setProgressDrawable(android.graphics.drawable.Drawable);
    method public void setProgressStyle(int);
    method public void setSecondaryProgress(int);
    method public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence);
    method public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean);
    method public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean, boolean);
    method public static android.app.ProgressDialog show(android.content.Context, CharSequence, CharSequence, boolean, boolean, android.content.DialogInterface.OnCancelListener);
    field public static final int STYLE_HORIZONTAL = 1; // 0x1
    field public static final int STYLE_SPINNER = 0; // 0x0
  }

  public class SearchManager implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
    method public void onCancel(android.content.DialogInterface);
    method public void onDismiss(android.content.DialogInterface);
    method public void setOnCancelListener(android.app.SearchManager.OnCancelListener);
    method public void setOnDismissListener(android.app.SearchManager.OnDismissListener);
    method public void startSearch(String, boolean, android.content.ComponentName, android.os.Bundle, boolean);
    method public void stopSearch();
    field public static final String ACTION_KEY = "action_key";
    field public static final String ACTION_MSG = "action_msg";
    field public static final String APP_DATA = "app_data";
    field public static final char MENU_KEY = 115; // 0x0073 's'
    field public static final int MENU_KEYCODE = 47; // 0x2f
    field public static final String QUERY = "query";
    field public static final String SUGGEST_COLUMN_FORMAT = "suggest_format";
    field public static final String SUGGEST_COLUMN_ICON_1 = "suggest_icon_1";
    field public static final String SUGGEST_COLUMN_ICON_2 = "suggest_icon_2";
    field public static final String SUGGEST_COLUMN_INTENT_ACTION = "suggest_intent_action";
    field public static final String SUGGEST_COLUMN_INTENT_DATA = "suggest_intent_data";
    field public static final String SUGGEST_COLUMN_INTENT_DATA_ID = "suggest_intent_data_id";
    field public static final String SUGGEST_COLUMN_QUERY = "suggest_intent_query";
    field public static final String SUGGEST_COLUMN_TEXT_1 = "suggest_text_1";
    field public static final String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
    field public static final String SUGGEST_MIME_TYPE = "vnd.android.cursor.dir/vnd.android.search.suggest";
    field public static final String SUGGEST_URI_PATH_QUERY = "search_suggest_query";
  }

  public static interface SearchManager.OnCancelListener {
    method public void onCancel();
  }

  public static interface SearchManager.OnDismissListener {
    method public void onDismiss();
  }

  public abstract class Service extends android.content.ContextWrapper implements android.content.ComponentCallbacks {
    ctor public Service();
    method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
    method public final android.app.Application getApplication();
    method public abstract android.os.IBinder onBind(android.content.Intent);
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onCreate();
    method public void onDestroy();
    method public void onLowMemory();
    method public void onRebind(android.content.Intent);
    method public void onStart(android.content.Intent, int);
    method public boolean onUnbind(android.content.Intent);
    method public final void setForeground(boolean);
    method public final void stopSelf();
    method public final void stopSelf(int);
    method public final boolean stopSelfResult(int);
  }

  public class TabActivity extends android.app.ActivityGroup {
    ctor public TabActivity();
    method public android.widget.TabHost getTabHost();
    method public android.widget.TabWidget getTabWidget();
    method public void setDefaultTab(String);
    method public void setDefaultTab(int);
  }

  public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
    ctor public TimePickerDialog(android.content.Context, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean);
    ctor public TimePickerDialog(android.content.Context, int, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean);
    method public void onClick(android.content.DialogInterface, int);
    method public void onTimeChanged(android.widget.TimePicker, int, int);
    method public void updateTime(int, int);
  }

  public static interface TimePickerDialog.OnTimeSetListener {
    method public void onTimeSet(android.widget.TimePicker, int, int);
  }

}

package android.appwidget {

  public class AppWidgetHost {
    ctor public AppWidgetHost(android.content.Context, int);
    method public int allocateAppWidgetId();
    method public final android.appwidget.AppWidgetHostView createView(android.content.Context, int, android.appwidget.AppWidgetProviderInfo);
    method public static void deleteAllHosts();
    method public void deleteAppWidgetId(int);
    method public void deleteHost();
    method protected android.appwidget.AppWidgetHostView onCreateView(android.content.Context, int, android.appwidget.AppWidgetProviderInfo);
    method protected void onProviderChanged(int, android.appwidget.AppWidgetProviderInfo);
    method public void startListening();
    method public void stopListening();
  }

  public class AppWidgetHostView extends android.widget.FrameLayout {
    ctor public AppWidgetHostView(android.content.Context);
    ctor public AppWidgetHostView(android.content.Context, int, int);
    method public int getAppWidgetId();
    method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo();
    method protected android.view.View getDefaultView();
    method protected android.view.View getErrorView();
    method protected void prepareView(android.view.View);
    method public void setAppWidget(int, android.appwidget.AppWidgetProviderInfo);
    method public void updateAppWidget(android.widget.RemoteViews);
  }

  public class AppWidgetManager {
    method public void bindAppWidgetId(int, android.content.ComponentName);
    method public int[] getAppWidgetIds(android.content.ComponentName);
    method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int);
    method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders();
    method public static android.appwidget.AppWidgetManager getInstance(android.content.Context);
    method public void updateAppWidget(int[], android.widget.RemoteViews);
    method public void updateAppWidget(int, android.widget.RemoteViews);
    method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
    field public static final String ACTION_APPWIDGET_CONFIGURE = "android.appwidget.action.APPWIDGET_CONFIGURE";
    field public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
    field public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
    field public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
    field public static final String ACTION_APPWIDGET_PICK = "android.appwidget.action.APPWIDGET_PICK";
    field public static final String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
    field public static final String EXTRA_APPWIDGET_ID = "appWidgetId";
    field public static final String EXTRA_APPWIDGET_IDS = "appWidgetIds";
    field public static final String EXTRA_CUSTOM_EXTRAS = "customExtras";
    field public static final String EXTRA_CUSTOM_INFO = "customInfo";
    field public static final int INVALID_APPWIDGET_ID = 0; // 0x0
    field public static final String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider";
  }

  public class AppWidgetProvider extends android.content.BroadcastReceiver {
    ctor public AppWidgetProvider();
    method public void onDeleted(android.content.Context, int[]);
    method public void onDisabled(android.content.Context);
    method public void onEnabled(android.content.Context);
    method public void onReceive(android.content.Context, android.content.Intent);
    method public void onUpdate(android.content.Context, android.appwidget.AppWidgetManager, int[]);
  }

  public class AppWidgetProviderInfo implements android.os.Parcelable {
    ctor public AppWidgetProviderInfo();
    ctor public AppWidgetProviderInfo(android.os.Parcel);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.appwidget.AppWidgetProviderInfo> CREATOR;
    field public android.content.ComponentName configure;
    field public int icon;
    field public int initialLayout;
    field public String label;
    field public int minHeight;
    field public int minWidth;
    field public android.content.ComponentName provider;
    field public int updatePeriodMillis;
  }

}

package android.content {

  public class ActivityNotFoundException extends java.lang.RuntimeException {
    ctor public ActivityNotFoundException();
    ctor public ActivityNotFoundException(String);
  }

  public abstract class AsyncQueryHandler extends android.os.Handler {
    ctor public AsyncQueryHandler(android.content.ContentResolver);
    method public final void cancelOperation(int);
    method protected android.os.Handler createHandler(android.os.Looper);
    method protected void onDeleteComplete(int, Object, int);
    method protected void onInsertComplete(int, Object, android.net.Uri);
    method protected void onQueryComplete(int, Object, android.database.Cursor);
    method protected void onUpdateComplete(int, Object, int);
    method public final void startDelete(int, Object, android.net.Uri, String, String[]);
    method public final void startInsert(int, Object, android.net.Uri, android.content.ContentValues);
    method public void startQuery(int, Object, android.net.Uri, String[], String, String[], String);
    method public final void startUpdate(int, Object, android.net.Uri, android.content.ContentValues, String, String[]);
  }

  protected static final class AsyncQueryHandler.WorkerArgs {
    ctor protected AsyncQueryHandler.WorkerArgs();
    field public Object cookie;
    field public android.os.Handler handler;
    field public String orderBy;
    field public String[] projection;
    field public Object result;
    field public String selection;
    field public String[] selectionArgs;
    field public android.net.Uri uri;
    field public android.content.ContentValues values;
  }

  protected class AsyncQueryHandler.WorkerHandler extends android.os.Handler {
    ctor public AsyncQueryHandler.WorkerHandler(android.os.Looper);
  }

  public abstract class BroadcastReceiver {
    ctor public BroadcastReceiver();
    method public final void abortBroadcast();
    method public final void clearAbortBroadcast();
    method public final boolean getAbortBroadcast();
    method public final boolean getDebugUnregister();
    method public final int getResultCode();
    method public final String getResultData();
    method public final android.os.Bundle getResultExtras(boolean);
    method public abstract void onReceive(android.content.Context, android.content.Intent);
    method public android.os.IBinder peekService(android.content.Context, android.content.Intent);
    method public final void setDebugUnregister(boolean);
    method public final void setOrderedHint(boolean);
    method public final void setResult(int, String, android.os.Bundle);
    method public final void setResultCode(int);
    method public final void setResultData(String);
    method public final void setResultExtras(android.os.Bundle);
  }

  public interface ComponentCallbacks {
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public void onLowMemory();
  }

  public final class ComponentName implements android.os.Parcelable {
    ctor public ComponentName(String, String);
    ctor public ComponentName(android.content.Context, String);
    ctor public ComponentName(android.content.Context, Class<?>);
    ctor public ComponentName(android.os.Parcel);
    method public int describeContents();
    method public String flattenToShortString();
    method public String flattenToString();
    method public String getClassName();
    method public String getPackageName();
    method public String getShortClassName();
    method public static android.content.ComponentName readFromParcel(android.os.Parcel);
    method public String toShortString();
    method public static android.content.ComponentName unflattenFromString(String);
    method public void writeToParcel(android.os.Parcel, int);
    method public static void writeToParcel(android.content.ComponentName, android.os.Parcel);
    field public static final android.os.Parcelable.Creator<android.content.ComponentName> CREATOR;
  }

  public abstract class ContentProvider implements android.content.ComponentCallbacks {
    ctor public ContentProvider();
    method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo);
    method public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    method public abstract int delete(android.net.Uri, String, String[]);
    method public final android.content.Context getContext();
    method public final String getReadPermission();
    method public abstract String getType(android.net.Uri);
    method public final String getWritePermission();
    method public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    method protected boolean isTemporary();
    method public void onConfigurationChanged(android.content.res.Configuration);
    method public abstract boolean onCreate();
    method public void onLowMemory();
    method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, String) throws java.io.FileNotFoundException;
    method public android.os.ParcelFileDescriptor openFile(android.net.Uri, String) throws java.io.FileNotFoundException;
    method protected final android.os.ParcelFileDescriptor openFileHelper(android.net.Uri, String) throws java.io.FileNotFoundException;
    method public abstract android.database.Cursor query(android.net.Uri, String[], String, String[], String);
    method protected final void setReadPermission(String);
    method protected final void setWritePermission(String);
    method public abstract int update(android.net.Uri, android.content.ContentValues, String, String[]);
  }

  public class ContentQueryMap extends java.util.Observable {
    ctor public ContentQueryMap(android.database.Cursor, String, boolean, android.os.Handler);
    method public void close();
    method public java.util.Map<java.lang.String,android.content.ContentValues> getRows();
    method public android.content.ContentValues getValues(String);
    method public void requery();
    method public void setKeepUpdated(boolean);
  }

  public abstract class ContentResolver {
    ctor public ContentResolver(android.content.Context);
    method public final int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    method public void cancelSync(android.net.Uri);
    method public final int delete(android.net.Uri, String, String[]);
    method public final String getType(android.net.Uri);
    method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    method public void notifyChange(android.net.Uri, android.database.ContentObserver);
    method public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean);
    method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, String) throws java.io.FileNotFoundException;
    method public final android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, String) throws java.io.FileNotFoundException;
    method public final java.io.InputStream openInputStream(android.net.Uri) throws java.io.FileNotFoundException;
    method public final java.io.OutputStream openOutputStream(android.net.Uri) throws java.io.FileNotFoundException;
    method public final java.io.OutputStream openOutputStream(android.net.Uri, String) throws java.io.FileNotFoundException;
    method public final android.database.Cursor query(android.net.Uri, String[], String, String[], String);
    method public final void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    method public void startSync(android.net.Uri, android.os.Bundle);
    method public final void unregisterContentObserver(android.database.ContentObserver);
    method public final int update(android.net.Uri, android.content.ContentValues, String, String[]);
    method public static void validateSyncExtrasBundle(android.os.Bundle);
    field public static final String CURSOR_DIR_BASE_TYPE = "vnd.android.cursor.dir";
    field public static final String CURSOR_ITEM_BASE_TYPE = "vnd.android.cursor.item";
    field public static final String SCHEME_ANDROID_RESOURCE = "android.resource";
    field public static final String SCHEME_CONTENT = "content";
    field public static final String SCHEME_FILE = "file";
    field public static final String SYNC_EXTRAS_ACCOUNT = "account";
    field public static final String SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS = "discard_deletions";
    field public static final String SYNC_EXTRAS_EXPEDITED = "expedited";
    field public static final String SYNC_EXTRAS_FORCE = "force";
    field public static final String SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS = "deletions_override";
    field public static final String SYNC_EXTRAS_UPLOAD = "upload";
  }

  public class ContentUris {
    ctor public ContentUris();
    method public static android.net.Uri.Builder appendId(android.net.Uri.Builder, long);
    method public static long parseId(android.net.Uri);
    method public static android.net.Uri withAppendedId(android.net.Uri, long);
  }

  public final class ContentValues implements android.os.Parcelable {
    ctor public ContentValues();
    ctor public ContentValues(int);
    ctor public ContentValues(android.content.ContentValues);
    method public void clear();
    method public boolean containsKey(String);
    method public int describeContents();
    method public Object get(String);
    method public Boolean getAsBoolean(String);
    method public Byte getAsByte(String);
    method public byte[] getAsByteArray(String);
    method public Double getAsDouble(String);
    method public Float getAsFloat(String);
    method public Integer getAsInteger(String);
    method public Long getAsLong(String);
    method public Short getAsShort(String);
    method public String getAsString(String);
    method public void put(String, String);
    method public void put(String, Byte);
    method public void put(String, Short);
    method public void put(String, Integer);
    method public void put(String, Long);
    method public void put(String, Float);
    method public void put(String, Double);
    method public void put(String, Boolean);
    method public void put(String, byte[]);
    method public void putAll(android.content.ContentValues);
    method public void putNull(String);
    method public void remove(String);
    method public int size();
    method public java.util.Set<java.util.Map.Entry<java.lang.String,java.lang.Object>> valueSet();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.ContentValues> CREATOR;
    field public static final String TAG = "ContentValues";
  }

  public abstract class Context {
    ctor public Context();
    method public abstract boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    method public abstract int checkCallingOrSelfPermission(String);
    method public abstract int checkCallingOrSelfUriPermission(android.net.Uri, int);
    method public abstract int checkCallingPermission(String);
    method public abstract int checkCallingUriPermission(android.net.Uri, int);
    method public abstract int checkPermission(String, int, int);
    method public abstract int checkUriPermission(android.net.Uri, int, int, int);
    method public abstract int checkUriPermission(android.net.Uri, String, String, int, int, int);
    method public abstract void clearWallpaper() throws java.io.IOException;
    method public abstract android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract String[] databaseList();
    method public abstract boolean deleteDatabase(String);
    method public abstract boolean deleteFile(String);
    method public abstract void enforceCallingOrSelfPermission(String, String);
    method public abstract void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
    method public abstract void enforceCallingPermission(String, String);
    method public abstract void enforceCallingUriPermission(android.net.Uri, int, String);
    method public abstract void enforcePermission(String, int, int, String);
    method public abstract void enforceUriPermission(android.net.Uri, int, int, int, String);
    method public abstract void enforceUriPermission(android.net.Uri, String, String, int, int, int, String);
    method public abstract String[] fileList();
    method public abstract android.content.Context getApplicationContext();
    method public abstract android.content.res.AssetManager getAssets();
    method public abstract java.io.File getCacheDir();
    method public abstract ClassLoader getClassLoader();
    method public abstract android.content.ContentResolver getContentResolver();
    method public abstract java.io.File getDatabasePath(String);
    method public abstract java.io.File getDir(String, int);
    method public abstract java.io.File getFileStreamPath(String);
    method public abstract java.io.File getFilesDir();
    method public abstract android.os.Looper getMainLooper();
    method public abstract android.content.pm.PackageManager getPackageManager();
    method public abstract String getPackageName();
    method public abstract android.content.res.Resources getResources();
    method public abstract android.content.SharedPreferences getSharedPreferences(String, int);
    method public final String getString(int);
    method public final String getString(int, java.lang.Object...);
    method public abstract Object getSystemService(String);
    method public final CharSequence getText(int);
    method public abstract android.content.res.Resources.Theme getTheme();
    method public abstract android.graphics.drawable.Drawable getWallpaper();
    method public abstract int getWallpaperDesiredMinimumHeight();
    method public abstract int getWallpaperDesiredMinimumWidth();
    method public abstract void grantUriPermission(String, android.net.Uri, int);
    method public final android.content.res.TypedArray obtainStyledAttributes(int[]);
    method public final android.content.res.TypedArray obtainStyledAttributes(int, int[]) throws android.content.res.Resources.NotFoundException;
    method public final android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[]);
    method public final android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    method public abstract java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
    method public abstract java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
    method public abstract android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public abstract android.graphics.drawable.Drawable peekWallpaper();
    method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    method public abstract android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler);
    method public abstract void removeStickyBroadcast(android.content.Intent);
    method public abstract void revokeUriPermission(android.net.Uri, int);
    method public abstract void sendBroadcast(android.content.Intent);
    method public abstract void sendBroadcast(android.content.Intent, String);
    method public abstract void sendOrderedBroadcast(android.content.Intent, String);
    method public abstract void sendOrderedBroadcast(android.content.Intent, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
    method public abstract void sendStickyBroadcast(android.content.Intent);
    method public abstract void setTheme(int);
    method public abstract void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
    method public abstract void setWallpaper(java.io.InputStream) throws java.io.IOException;
    method public abstract void startActivity(android.content.Intent);
    method public abstract boolean startInstrumentation(android.content.ComponentName, String, android.os.Bundle);
    method public abstract android.content.ComponentName startService(android.content.Intent);
    method public abstract boolean stopService(android.content.Intent);
    method public abstract void unbindService(android.content.ServiceConnection);
    method public abstract void unregisterReceiver(android.content.BroadcastReceiver);
    field public static final String ACTIVITY_SERVICE = "activity";
    field public static final String ALARM_SERVICE = "alarm";
    field public static final String AUDIO_SERVICE = "audio";
    field public static final int BIND_AUTO_CREATE = 1; // 0x1
    field public static final int BIND_DEBUG_UNBIND = 2; // 0x2
    field public static final String CLIPBOARD_SERVICE = "clipboard";
    field public static final String CONNECTIVITY_SERVICE = "connectivity";
    field public static final int CONTEXT_IGNORE_SECURITY = 2; // 0x2
    field public static final int CONTEXT_INCLUDE_CODE = 1; // 0x1
    field public static final String INPUT_METHOD_SERVICE = "input_method";
    field public static final String KEYGUARD_SERVICE = "keyguard";
    field public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
    field public static final String LOCATION_SERVICE = "location";
    field public static final int MODE_APPEND = 32768; // 0x8000
    field public static final int MODE_PRIVATE = 0; // 0x0
    field public static final int MODE_WORLD_READABLE = 1; // 0x1
    field public static final int MODE_WORLD_WRITEABLE = 2; // 0x2
    field public static final String NOTIFICATION_SERVICE = "notification";
    field public static final String POWER_SERVICE = "power";
    field public static final String SEARCH_SERVICE = "search";
    field public static final String SENSOR_SERVICE = "sensor";
    field public static final String TELEPHONY_SERVICE = "phone";
    field public static final String VIBRATOR_SERVICE = "vibrator";
    field public static final String WALLPAPER_SERVICE = "wallpaper";
    field public static final String WIFI_SERVICE = "wifi";
    field public static final String WINDOW_SERVICE = "window";
  }

  public class ContextWrapper extends android.content.Context {
    ctor public ContextWrapper(android.content.Context);
    method protected void attachBaseContext(android.content.Context);
    method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    method public int checkCallingOrSelfPermission(String);
    method public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    method public int checkCallingPermission(String);
    method public int checkCallingUriPermission(android.net.Uri, int);
    method public int checkPermission(String, int, int);
    method public int checkUriPermission(android.net.Uri, int, int, int);
    method public int checkUriPermission(android.net.Uri, String, String, int, int, int);
    method public void clearWallpaper() throws java.io.IOException;
    method public android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public String[] databaseList();
    method public boolean deleteDatabase(String);
    method public boolean deleteFile(String);
    method public void enforceCallingOrSelfPermission(String, String);
    method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
    method public void enforceCallingPermission(String, String);
    method public void enforceCallingUriPermission(android.net.Uri, int, String);
    method public void enforcePermission(String, int, int, String);
    method public void enforceUriPermission(android.net.Uri, int, int, int, String);
    method public void enforceUriPermission(android.net.Uri, String, String, int, int, int, String);
    method public String[] fileList();
    method public android.content.Context getApplicationContext();
    method public android.content.res.AssetManager getAssets();
    method public android.content.Context getBaseContext();
    method public java.io.File getCacheDir();
    method public ClassLoader getClassLoader();
    method public android.content.ContentResolver getContentResolver();
    method public java.io.File getDatabasePath(String);
    method public java.io.File getDir(String, int);
    method public java.io.File getFileStreamPath(String);
    method public java.io.File getFilesDir();
    method public android.os.Looper getMainLooper();
    method public String getPackageCodePath();
    method public android.content.pm.PackageManager getPackageManager();
    method public String getPackageName();
    method public String getPackageResourcePath();
    method public android.content.res.Resources getResources();
    method public android.content.SharedPreferences getSharedPreferences(String, int);
    method public Object getSystemService(String);
    method public android.content.res.Resources.Theme getTheme();
    method public android.graphics.drawable.Drawable getWallpaper();
    method public int getWallpaperDesiredMinimumHeight();
    method public int getWallpaperDesiredMinimumWidth();
    method public void grantUriPermission(String, android.net.Uri, int);
    method public java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
    method public java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
    method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public android.graphics.drawable.Drawable peekWallpaper();
    method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler);
    method public void removeStickyBroadcast(android.content.Intent);
    method public void revokeUriPermission(android.net.Uri, int);
    method public void sendBroadcast(android.content.Intent);
    method public void sendBroadcast(android.content.Intent, String);
    method public void sendOrderedBroadcast(android.content.Intent, String);
    method public void sendOrderedBroadcast(android.content.Intent, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
    method public void sendStickyBroadcast(android.content.Intent);
    method public void setTheme(int);
    method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
    method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
    method public void startActivity(android.content.Intent);
    method public boolean startInstrumentation(android.content.ComponentName, String, android.os.Bundle);
    method public android.content.ComponentName startService(android.content.Intent);
    method public boolean stopService(android.content.Intent);
    method public void unbindService(android.content.ServiceConnection);
    method public void unregisterReceiver(android.content.BroadcastReceiver);
  }

  public interface DialogInterface {
    method public void cancel();
    method public void dismiss();
    field public static final int BUTTON1 = -1; // 0xffffffff
    field public static final int BUTTON2 = -2; // 0xfffffffe
    field public static final int BUTTON3 = -3; // 0xfffffffd
    field public static final int BUTTON_NEGATIVE = -2; // 0xfffffffe
    field public static final int BUTTON_NEUTRAL = -3; // 0xfffffffd
    field public static final int BUTTON_POSITIVE = -1; // 0xffffffff
  }

  public static interface DialogInterface.OnCancelListener {
    method public void onCancel(android.content.DialogInterface);
  }

  public static interface DialogInterface.OnClickListener {
    method public void onClick(android.content.DialogInterface, int);
  }

  public static interface DialogInterface.OnDismissListener {
    method public void onDismiss(android.content.DialogInterface);
  }

  public static interface DialogInterface.OnKeyListener {
    method public boolean onKey(android.content.DialogInterface, int, android.view.KeyEvent);
  }

  public static interface DialogInterface.OnMultiChoiceClickListener {
    method public void onClick(android.content.DialogInterface, int, boolean);
  }

  public class Intent implements android.os.Parcelable {
    ctor public Intent();
    ctor public Intent(android.content.Intent);
    ctor public Intent(String);
    ctor public Intent(String, android.net.Uri);
    ctor public Intent(android.content.Context, Class<?>);
    ctor public Intent(String, android.net.Uri, android.content.Context, Class<?>);
    method public android.content.Intent addCategory(String);
    method public android.content.Intent addFlags(int);
    method public Object clone();
    method public android.content.Intent cloneFilter();
    method public static android.content.Intent createChooser(android.content.Intent, CharSequence);
    method public int describeContents();
    method public int fillIn(android.content.Intent, int);
    method public boolean filterEquals(android.content.Intent);
    method public int filterHashCode();
    method public String getAction();
    method public boolean[] getBooleanArrayExtra(String);
    method public boolean getBooleanExtra(String, boolean);
    method public android.os.Bundle getBundleExtra(String);
    method public byte[] getByteArrayExtra(String);
    method public byte getByteExtra(String, byte);
    method public java.util.Set<java.lang.String> getCategories();
    method public char[] getCharArrayExtra(String);
    method public char getCharExtra(String, char);
    method public CharSequence getCharSequenceExtra(String);
    method public android.content.ComponentName getComponent();
    method public android.net.Uri getData();
    method public String getDataString();
    method public double[] getDoubleArrayExtra(String);
    method public double getDoubleExtra(String, double);
    method public android.os.Bundle getExtras();
    method public int getFlags();
    method public float[] getFloatArrayExtra(String);
    method public float getFloatExtra(String, float);
    method public int[] getIntArrayExtra(String);
    method public int getIntExtra(String, int);
    method public java.util.ArrayList<java.lang.Integer> getIntegerArrayListExtra(String);
    method public static android.content.Intent getIntent(String) throws java.net.URISyntaxException;
    method public static android.content.Intent getIntentOld(String) throws java.net.URISyntaxException;
    method public long[] getLongArrayExtra(String);
    method public long getLongExtra(String, long);
    method public android.os.Parcelable[] getParcelableArrayExtra(String);
    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayListExtra(String);
    method public <T extends android.os.Parcelable> T getParcelableExtra(String);
    method public String getScheme();
    method public java.io.Serializable getSerializableExtra(String);
    method public short[] getShortArrayExtra(String);
    method public short getShortExtra(String, short);
    method public String[] getStringArrayExtra(String);
    method public java.util.ArrayList<java.lang.String> getStringArrayListExtra(String);
    method public String getStringExtra(String);
    method public String getType();
    method public boolean hasCategory(String);
    method public boolean hasExtra(String);
    method public boolean hasFileDescriptors();
    method public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public android.content.Intent putExtra(String, boolean);
    method public android.content.Intent putExtra(String, byte);
    method public android.content.Intent putExtra(String, char);
    method public android.content.Intent putExtra(String, short);
    method public android.content.Intent putExtra(String, int);
    method public android.content.Intent putExtra(String, long);
    method public android.content.Intent putExtra(String, float);
    method public android.content.Intent putExtra(String, double);
    method public android.content.Intent putExtra(String, String);
    method public android.content.Intent putExtra(String, CharSequence);
    method public android.content.Intent putExtra(String, android.os.Parcelable);
    method public android.content.Intent putExtra(String, android.os.Parcelable[]);
    method public android.content.Intent putExtra(String, java.io.Serializable);
    method public android.content.Intent putExtra(String, boolean[]);
    method public android.content.Intent putExtra(String, byte[]);
    method public android.content.Intent putExtra(String, short[]);
    method public android.content.Intent putExtra(String, char[]);
    method public android.content.Intent putExtra(String, int[]);
    method public android.content.Intent putExtra(String, long[]);
    method public android.content.Intent putExtra(String, float[]);
    method public android.content.Intent putExtra(String, double[]);
    method public android.content.Intent putExtra(String, String[]);
    method public android.content.Intent putExtra(String, android.os.Bundle);
    method public android.content.Intent putExtras(android.content.Intent);
    method public android.content.Intent putExtras(android.os.Bundle);
    method public android.content.Intent putIntegerArrayListExtra(String, java.util.ArrayList<java.lang.Integer>);
    method public android.content.Intent putParcelableArrayListExtra(String, java.util.ArrayList<? extends android.os.Parcelable>);
    method public android.content.Intent putStringArrayListExtra(String, java.util.ArrayList<java.lang.String>);
    method public void readFromParcel(android.os.Parcel);
    method public void removeCategory(String);
    method public void removeExtra(String);
    method public android.content.Intent replaceExtras(android.content.Intent);
    method public android.content.Intent replaceExtras(android.os.Bundle);
    method public android.content.ComponentName resolveActivity(android.content.pm.PackageManager);
    method public android.content.pm.ActivityInfo resolveActivityInfo(android.content.pm.PackageManager, int);
    method public String resolveType(android.content.Context);
    method public String resolveType(android.content.ContentResolver);
    method public String resolveTypeIfNeeded(android.content.ContentResolver);
    method public android.content.Intent setAction(String);
    method public android.content.Intent setClass(android.content.Context, Class<?>);
    method public android.content.Intent setClassName(android.content.Context, String);
    method public android.content.Intent setClassName(String, String);
    method public android.content.Intent setComponent(android.content.ComponentName);
    method public android.content.Intent setData(android.net.Uri);
    method public android.content.Intent setDataAndType(android.net.Uri, String);
    method public void setExtrasClassLoader(ClassLoader);
    method public android.content.Intent setFlags(int);
    method public android.content.Intent setType(String);
    method public String toURI();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
    field public static final String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
    field public static final String ACTION_ANSWER = "android.intent.action.ANSWER";
    field public static final String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
    field public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
    field public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
    field public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
    field public static final String ACTION_BUG_REPORT = "android.intent.action.BUG_REPORT";
    field public static final String ACTION_CALL = "android.intent.action.CALL";
    field public static final String ACTION_CALL_BUTTON = "android.intent.action.CALL_BUTTON";
    field public static final String ACTION_CAMERA_BUTTON = "android.intent.action.CAMERA_BUTTON";
    field public static final String ACTION_CHOOSER = "android.intent.action.CHOOSER";
    field public static final String ACTION_CLOSE_SYSTEM_DIALOGS = "android.intent.action.CLOSE_SYSTEM_DIALOGS";
    field public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED";
    field public static final String ACTION_CREATE_SHORTCUT = "android.intent.action.CREATE_SHORTCUT";
    field public static final String ACTION_DATE_CHANGED = "android.intent.action.DATE_CHANGED";
    field public static final String ACTION_DEFAULT = "android.intent.action.VIEW";
    field public static final String ACTION_DELETE = "android.intent.action.DELETE";
    field public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
    field public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
    field public static final String ACTION_DIAL = "android.intent.action.DIAL";
    field public static final String ACTION_EDIT = "android.intent.action.EDIT";
    field public static final String ACTION_FACTORY_TEST = "android.intent.action.FACTORY_TEST";
    field public static final String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";
    field public static final String ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED";
    field public static final String ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED";
    field public static final String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG";
    field public static final String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED";
    field public static final String ACTION_INSERT = "android.intent.action.INSERT";
    field public static final String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT";
    field public static final String ACTION_MAIN = "android.intent.action.MAIN";
    field public static final String ACTION_MANAGE_PACKAGE_STORAGE = "android.intent.action.MANAGE_PACKAGE_STORAGE";
    field public static final String ACTION_MEDIA_BAD_REMOVAL = "android.intent.action.MEDIA_BAD_REMOVAL";
    field public static final String ACTION_MEDIA_BUTTON = "android.intent.action.MEDIA_BUTTON";
    field public static final String ACTION_MEDIA_CHECKING = "android.intent.action.MEDIA_CHECKING";
    field public static final String ACTION_MEDIA_EJECT = "android.intent.action.MEDIA_EJECT";
    field public static final String ACTION_MEDIA_MOUNTED = "android.intent.action.MEDIA_MOUNTED";
    field public static final String ACTION_MEDIA_NOFS = "android.intent.action.MEDIA_NOFS";
    field public static final String ACTION_MEDIA_REMOVED = "android.intent.action.MEDIA_REMOVED";
    field public static final String ACTION_MEDIA_SCANNER_FINISHED = "android.intent.action.MEDIA_SCANNER_FINISHED";
    field public static final String ACTION_MEDIA_SCANNER_SCAN_FILE = "android.intent.action.MEDIA_SCANNER_SCAN_FILE";
    field public static final String ACTION_MEDIA_SCANNER_STARTED = "android.intent.action.MEDIA_SCANNER_STARTED";
    field public static final String ACTION_MEDIA_SHARED = "android.intent.action.MEDIA_SHARED";
    field public static final String ACTION_MEDIA_UNMOUNTABLE = "android.intent.action.MEDIA_UNMOUNTABLE";
    field public static final String ACTION_MEDIA_UNMOUNTED = "android.intent.action.MEDIA_UNMOUNTED";
    field public static final String ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";
    field public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
    field public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
    field public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
    field public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
    field public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
    field public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
    field public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
    field public static final String ACTION_PICK = "android.intent.action.PICK";
    field public static final String ACTION_PICK_ACTIVITY = "android.intent.action.PICK_ACTIVITY";
    field public static final String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED";
    field public static final String ACTION_REBOOT = "android.intent.action.REBOOT";
    field public static final String ACTION_RUN = "android.intent.action.RUN";
    field public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
    field public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
    field public static final String ACTION_SEARCH = "android.intent.action.SEARCH";
    field public static final String ACTION_SEARCH_LONG_PRESS = "android.intent.action.SEARCH_LONG_PRESS";
    field public static final String ACTION_SEND = "android.intent.action.SEND";
    field public static final String ACTION_SENDTO = "android.intent.action.SENDTO";
    field public static final String ACTION_SET_WALLPAPER = "android.intent.action.SET_WALLPAPER";
    field public static final String ACTION_SYNC = "android.intent.action.SYNC";
    field public static final String ACTION_SYSTEM_TUTORIAL = "android.intent.action.SYSTEM_TUTORIAL";
    field public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
    field public static final String ACTION_TIME_CHANGED = "android.intent.action.TIME_SET";
    field public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
    field public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
    field public static final String ACTION_UMS_CONNECTED = "android.intent.action.UMS_CONNECTED";
    field public static final String ACTION_UMS_DISCONNECTED = "android.intent.action.UMS_DISCONNECTED";
    field public static final String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
    field public static final String ACTION_VIEW = "android.intent.action.VIEW";
    field public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
    field public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
    field public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
    field public static final String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
    field public static final String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
    field public static final String CATEGORY_DEFAULT = "android.intent.category.DEFAULT";
    field public static final String CATEGORY_DEVELOPMENT_PREFERENCE = "android.intent.category.DEVELOPMENT_PREFERENCE";
    field public static final String CATEGORY_EMBED = "android.intent.category.EMBED";
    field public static final String CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST = "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST";
    field public static final String CATEGORY_HOME = "android.intent.category.HOME";
    field public static final String CATEGORY_INFO = "android.intent.category.INFO";
    field public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";
    field public static final String CATEGORY_MONKEY = "android.intent.category.MONKEY";
    field public static final String CATEGORY_OPENABLE = "android.intent.category.OPENABLE";
    field public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";
    field public static final String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";
    field public static final String CATEGORY_SELECTED_ALTERNATIVE = "android.intent.category.SELECTED_ALTERNATIVE";
    field public static final String CATEGORY_TAB = "android.intent.category.TAB";
    field public static final String CATEGORY_TEST = "android.intent.category.TEST";
    field public static final String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
    field public static final android.os.Parcelable.Creator<android.content.Intent> CREATOR;
    field public static final String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
    field public static final String EXTRA_BCC = "android.intent.extra.BCC";
    field public static final String EXTRA_CC = "android.intent.extra.CC";
    field public static final String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
    field public static final String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
    field public static final String EXTRA_EMAIL = "android.intent.extra.EMAIL";
    field public static final String EXTRA_INTENT = "android.intent.extra.INTENT";
    field public static final String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
    field public static final String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
    field public static final String EXTRA_REPLACING = "android.intent.extra.REPLACING";
    field public static final String EXTRA_SHORTCUT_ICON = "android.intent.extra.shortcut.ICON";
    field public static final String EXTRA_SHORTCUT_ICON_RESOURCE = "android.intent.extra.shortcut.ICON_RESOURCE";
    field public static final String EXTRA_SHORTCUT_INTENT = "android.intent.extra.shortcut.INTENT";
    field public static final String EXTRA_SHORTCUT_NAME = "android.intent.extra.shortcut.NAME";
    field public static final String EXTRA_STREAM = "android.intent.extra.STREAM";
    field public static final String EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
    field public static final String EXTRA_TEMPLATE = "android.intent.extra.TEMPLATE";
    field public static final String EXTRA_TEXT = "android.intent.extra.TEXT";
    field public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
    field public static final String EXTRA_UID = "android.intent.extra.UID";
    field public static final int FILL_IN_ACTION = 1; // 0x1
    field public static final int FILL_IN_CATEGORIES = 4; // 0x4
    field public static final int FILL_IN_COMPONENT = 8; // 0x8
    field public static final int FILL_IN_DATA = 2; // 0x2
    field public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; // 0x400000
    field public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864; // 0x4000000
    field public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000
    field public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; // 0x800000
    field public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; // 0x2000000
    field public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; // 0x100000
    field public static final int FLAG_ACTIVITY_MULTIPLE_TASK = 134217728; // 0x8000000
    field public static final int FLAG_ACTIVITY_NEW_TASK = 268435456; // 0x10000000
    field public static final int FLAG_ACTIVITY_NO_HISTORY = 1073741824; // 0x40000000
    field public static final int FLAG_ACTIVITY_NO_USER_ACTION = 262144; // 0x40000
    field public static final int FLAG_ACTIVITY_PREVIOUS_IS_TOP = 16777216; // 0x1000000
    field public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 131072; // 0x20000
    field public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 2097152; // 0x200000
    field public static final int FLAG_ACTIVITY_SINGLE_TOP = 536870912; // 0x20000000
    field public static final int FLAG_DEBUG_LOG_RESOLUTION = 8; // 0x8
    field public static final int FLAG_FROM_BACKGROUND = 4; // 0x4
    field public static final int FLAG_GRANT_READ_URI_PERMISSION = 1; // 0x1
    field public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 2; // 0x2
    field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
  }

  public static final class Intent.FilterComparison {
    ctor public Intent.FilterComparison(android.content.Intent);
    method public android.content.Intent getIntent();
  }

  public static class Intent.ShortcutIconResource implements android.os.Parcelable {
    ctor public Intent.ShortcutIconResource();
    method public int describeContents();
    method public static android.content.Intent.ShortcutIconResource fromContext(android.content.Context, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.Intent.ShortcutIconResource> CREATOR;
    field public String packageName;
    field public String resourceName;
  }

  public class IntentFilter implements android.os.Parcelable {
    ctor public IntentFilter();
    ctor public IntentFilter(String);
    ctor public IntentFilter(String, String) throws android.content.IntentFilter.MalformedMimeTypeException;
    ctor public IntentFilter(android.content.IntentFilter);
    method public final java.util.Iterator<java.lang.String> actionsIterator();
    method public final void addAction(String);
    method public final void addCategory(String);
    method public final void addDataAuthority(String, String);
    method public final void addDataPath(String, int);
    method public final void addDataScheme(String);
    method public final void addDataType(String) throws android.content.IntentFilter.MalformedMimeTypeException;
    method public final java.util.Iterator<android.content.IntentFilter.AuthorityEntry> authoritiesIterator();
    method public final java.util.Iterator<java.lang.String> categoriesIterator();
    method public final int countActions();
    method public final int countCategories();
    method public final int countDataAuthorities();
    method public final int countDataPaths();
    method public final int countDataSchemes();
    method public final int countDataTypes();
    method public static android.content.IntentFilter create(String, String);
    method public final int describeContents();
    method public void dump(android.util.Printer, String);
    method public final String getAction(int);
    method public final String getCategory(int);
    method public final android.content.IntentFilter.AuthorityEntry getDataAuthority(int);
    method public final android.os.PatternMatcher getDataPath(int);
    method public final String getDataScheme(int);
    method public final String getDataType(int);
    method public final int getPriority();
    method public final boolean hasAction(String);
    method public final boolean hasCategory(String);
    method public final boolean hasDataAuthority(android.net.Uri);
    method public final boolean hasDataPath(String);
    method public final boolean hasDataScheme(String);
    method public final boolean hasDataType(String);
    method public final int match(android.content.ContentResolver, android.content.Intent, boolean, String);
    method public final int match(String, String, String, android.net.Uri, java.util.Set<java.lang.String>, String);
    method public final boolean matchAction(String);
    method public final String matchCategories(java.util.Set<java.lang.String>);
    method public final int matchData(String, String, android.net.Uri);
    method public final int matchDataAuthority(android.net.Uri);
    method public final java.util.Iterator<android.os.PatternMatcher> pathsIterator();
    method public void readFromXml(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public final java.util.Iterator<java.lang.String> schemesIterator();
    method public final void setPriority(int);
    method public final java.util.Iterator<java.lang.String> typesIterator();
    method public final void writeToParcel(android.os.Parcel, int);
    method public void writeToXml(org.xmlpull.v1.XmlSerializer) throws java.io.IOException;
    field public static final android.os.Parcelable.Creator<android.content.IntentFilter> CREATOR;
    field public static final int MATCH_ADJUSTMENT_MASK = 65535; // 0xffff
    field public static final int MATCH_ADJUSTMENT_NORMAL = 32768; // 0x8000
    field public static final int MATCH_CATEGORY_EMPTY = 1048576; // 0x100000
    field public static final int MATCH_CATEGORY_HOST = 3145728; // 0x300000
    field public static final int MATCH_CATEGORY_MASK = 268369920; // 0xfff0000
    field public static final int MATCH_CATEGORY_PATH = 5242880; // 0x500000
    field public static final int MATCH_CATEGORY_PORT = 4194304; // 0x400000
    field public static final int MATCH_CATEGORY_SCHEME = 2097152; // 0x200000
    field public static final int MATCH_CATEGORY_TYPE = 6291456; // 0x600000
    field public static final int NO_MATCH_ACTION = -3; // 0xfffffffd
    field public static final int NO_MATCH_CATEGORY = -4; // 0xfffffffc
    field public static final int NO_MATCH_DATA = -2; // 0xfffffffe
    field public static final int NO_MATCH_TYPE = -1; // 0xffffffff
    field public static final int SYSTEM_HIGH_PRIORITY = 1000; // 0x3e8
    field public static final int SYSTEM_LOW_PRIORITY = -1000; // 0xfffffc18
  }

  public static final class IntentFilter.AuthorityEntry {
    ctor public IntentFilter.AuthorityEntry(String, String);
    method public String getHost();
    method public int getPort();
    method public int match(android.net.Uri);
  }

  public static class IntentFilter.MalformedMimeTypeException extends android.util.AndroidException {
    ctor public IntentFilter.MalformedMimeTypeException();
    ctor public IntentFilter.MalformedMimeTypeException(String);
  }

  public class MutableContextWrapper extends android.content.ContextWrapper {
    ctor public MutableContextWrapper(android.content.Context);
    method public void setBaseContext(android.content.Context);
  }

  public class ReceiverCallNotAllowedException extends android.util.AndroidRuntimeException {
    ctor public ReceiverCallNotAllowedException(String);
  }

  public class SearchRecentSuggestionsProvider extends android.content.ContentProvider {
    ctor public SearchRecentSuggestionsProvider();
    method public int delete(android.net.Uri, String, String[]);
    method public String getType(android.net.Uri);
    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
    method public boolean onCreate();
    method public android.database.Cursor query(android.net.Uri, String[], String, String[], String);
    method protected void setupSuggestions(String, int);
    method public int update(android.net.Uri, android.content.ContentValues, String, String[]);
    field public static final int DATABASE_MODE_2LINES = 2; // 0x2
    field public static final int DATABASE_MODE_QUERIES = 1; // 0x1
  }

  public interface ServiceConnection {
    method public void onServiceConnected(android.content.ComponentName, android.os.IBinder);
    method public void onServiceDisconnected(android.content.ComponentName);
  }

  public interface SharedPreferences {
    method public boolean contains(String);
    method public android.content.SharedPreferences.Editor edit();
    method public java.util.Map<java.lang.String,?> getAll();
    method public boolean getBoolean(String, boolean);
    method public float getFloat(String, float);
    method public int getInt(String, int);
    method public long getLong(String, long);
    method public String getString(String, String);
    method public void registerOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
    method public void unregisterOnSharedPreferenceChangeListener(android.content.SharedPreferences.OnSharedPreferenceChangeListener);
  }

  public static interface SharedPreferences.Editor {
    method public android.content.SharedPreferences.Editor clear();
    method public boolean commit();
    method public android.content.SharedPreferences.Editor putBoolean(String, boolean);
    method public android.content.SharedPreferences.Editor putFloat(String, float);
    method public android.content.SharedPreferences.Editor putInt(String, int);
    method public android.content.SharedPreferences.Editor putLong(String, long);
    method public android.content.SharedPreferences.Editor putString(String, String);
    method public android.content.SharedPreferences.Editor remove(String);
  }

  public static interface SharedPreferences.OnSharedPreferenceChangeListener {
    method public void onSharedPreferenceChanged(android.content.SharedPreferences, String);
  }

  public class UriMatcher {
    ctor public UriMatcher(int);
    method public void addURI(String, String, int);
    method public int match(android.net.Uri);
    field public static final int NO_MATCH = -1; // 0xffffffff
  }

}

package android.content.pm {

  public class ActivityInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
    ctor public ActivityInfo();
    ctor public ActivityInfo(android.content.pm.ActivityInfo);
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public final int getThemeResource();
    field public static final int CONFIG_FONT_SCALE = 1073741824; // 0x40000000
    field public static final int CONFIG_KEYBOARD = 16; // 0x10
    field public static final int CONFIG_KEYBOARD_HIDDEN = 32; // 0x20
    field public static final int CONFIG_LOCALE = 4; // 0x4
    field public static final int CONFIG_MCC = 1; // 0x1
    field public static final int CONFIG_MNC = 2; // 0x2
    field public static final int CONFIG_NAVIGATION = 64; // 0x40
    field public static final int CONFIG_ORIENTATION = 128; // 0x80
    field public static final int CONFIG_TOUCHSCREEN = 8; // 0x8
    field public static final android.os.Parcelable.Creator<android.content.pm.ActivityInfo> CREATOR;
    field public static final int FLAG_ALLOW_TASK_REPARENTING = 64; // 0x40
    field public static final int FLAG_ALWAYS_RETAIN_TASK_STATE = 8; // 0x8
    field public static final int FLAG_CLEAR_TASK_ON_LAUNCH = 4; // 0x4
    field public static final int FLAG_EXCLUDE_FROM_RECENTS = 32; // 0x20
    field public static final int FLAG_FINISH_ON_TASK_LAUNCH = 2; // 0x2
    field public static final int FLAG_MULTIPROCESS = 1; // 0x1
    field public static final int FLAG_NO_HISTORY = 128; // 0x80
    field public static final int FLAG_STATE_NOT_NEEDED = 16; // 0x10
    field public static final int LAUNCH_MULTIPLE = 0; // 0x0
    field public static final int LAUNCH_SINGLE_INSTANCE = 3; // 0x3
    field public static final int LAUNCH_SINGLE_TASK = 2; // 0x2
    field public static final int LAUNCH_SINGLE_TOP = 1; // 0x1
    field public static final int SCREEN_ORIENTATION_BEHIND = 3; // 0x3
    field public static final int SCREEN_ORIENTATION_LANDSCAPE = 0; // 0x0
    field public static final int SCREEN_ORIENTATION_NOSENSOR = 5; // 0x5
    field public static final int SCREEN_ORIENTATION_PORTRAIT = 1; // 0x1
    field public static final int SCREEN_ORIENTATION_SENSOR = 4; // 0x4
    field public static final int SCREEN_ORIENTATION_UNSPECIFIED = -1; // 0xffffffff
    field public static final int SCREEN_ORIENTATION_USER = 2; // 0x2
    field public int configChanges;
    field public int flags;
    field public int launchMode;
    field public String permission;
    field public int screenOrientation;
    field public int softInputMode;
    field public String targetActivity;
    field public String taskAffinity;
    field public int theme;
  }

  public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public ApplicationInfo();
    ctor public ApplicationInfo(android.content.pm.ApplicationInfo);
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public CharSequence loadDescription(android.content.pm.PackageManager);
    field public static final android.os.Parcelable.Creator<android.content.pm.ApplicationInfo> CREATOR;
    field public static final int FLAG_ALLOW_CLEAR_USER_DATA = 64; // 0x40
    field public static final int FLAG_ALLOW_TASK_REPARENTING = 32; // 0x20
    field public static final int FLAG_DEBUGGABLE = 2; // 0x2
    field public static final int FLAG_FACTORY_TEST = 16; // 0x10
    field public static final int FLAG_HAS_CODE = 4; // 0x4
    field public static final int FLAG_PERSISTENT = 8; // 0x8
    field public static final int FLAG_SYSTEM = 1; // 0x1
    field public String className;
    field public String dataDir;
    field public int descriptionRes;
    field public boolean enabled;
    field public int flags;
    field public String manageSpaceActivityName;
    field public String permission;
    field public String processName;
    field public String publicSourceDir;
    field public String[] sharedLibraryFiles;
    field public String sourceDir;
    field public String taskAffinity;
    field public int theme;
    field public int uid;
  }

  public static class ApplicationInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.ApplicationInfo> {
    ctor public ApplicationInfo.DisplayNameComparator(android.content.pm.PackageManager);
    method public final int compare(android.content.pm.ApplicationInfo, android.content.pm.ApplicationInfo);
  }

  public class ComponentInfo extends android.content.pm.PackageItemInfo {
    ctor public ComponentInfo();
    ctor public ComponentInfo(android.content.pm.ComponentInfo);
    ctor protected ComponentInfo(android.os.Parcel);
    method public final int getIconResource();
    field public android.content.pm.ApplicationInfo applicationInfo;
    field public boolean enabled;
    field public boolean exported;
    field public String processName;
  }

  public class ConfigurationInfo implements android.os.Parcelable {
    ctor public ConfigurationInfo();
    ctor public ConfigurationInfo(android.content.pm.ConfigurationInfo);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.ConfigurationInfo> CREATOR;
    field public static final int INPUT_FEATURE_FIVE_WAY_NAV = 2; // 0x2
    field public static final int INPUT_FEATURE_HARD_KEYBOARD = 1; // 0x1
    field public int reqInputFeatures;
    field public int reqKeyboardType;
    field public int reqNavigation;
    field public int reqTouchScreen;
  }

  public interface IPackageInstallObserver extends android.os.IInterface {
    method public void packageInstalled(String, int) throws android.os.RemoteException;
  }

  public abstract static class IPackageInstallObserver.Stub extends android.os.Binder implements android.content.pm.IPackageInstallObserver {
    ctor public IPackageInstallObserver.Stub();
    method public android.os.IBinder asBinder();
    method public static android.content.pm.IPackageInstallObserver asInterface(android.os.IBinder);
    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
  }

  public class InstrumentationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public InstrumentationInfo();
    ctor public InstrumentationInfo(android.content.pm.InstrumentationInfo);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.content.pm.InstrumentationInfo> CREATOR;
    field public String dataDir;
    field public boolean functionalTest;
    field public boolean handleProfiling;
    field public String publicSourceDir;
    field public String sourceDir;
    field public String targetPackage;
  }

  public class PackageInfo implements android.os.Parcelable {
    ctor public PackageInfo();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.PackageInfo> CREATOR;
    field public android.content.pm.ActivityInfo[] activities;
    field public android.content.pm.ApplicationInfo applicationInfo;
    field public android.content.pm.ConfigurationInfo[] configPreferences;
    field public int[] gids;
    field public android.content.pm.InstrumentationInfo[] instrumentation;
    field public String packageName;
    field public android.content.pm.PermissionInfo[] permissions;
    field public android.content.pm.ProviderInfo[] providers;
    field public android.content.pm.ActivityInfo[] receivers;
    field public String[] requestedPermissions;
    field public android.content.pm.ServiceInfo[] services;
    field public String sharedUserId;
    field public int sharedUserLabel;
    field public android.content.pm.Signature[] signatures;
    field public int versionCode;
    field public String versionName;
  }

  public class PackageItemInfo {
    ctor public PackageItemInfo();
    ctor public PackageItemInfo(android.content.pm.PackageItemInfo);
    ctor protected PackageItemInfo(android.os.Parcel);
    method protected void dumpBack(android.util.Printer, String);
    method protected void dumpFront(android.util.Printer, String);
    method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    method public CharSequence loadLabel(android.content.pm.PackageManager);
    method public android.content.res.XmlResourceParser loadXmlMetaData(android.content.pm.PackageManager, String);
    method public void writeToParcel(android.os.Parcel, int);
    field public int icon;
    field public int labelRes;
    field public android.os.Bundle metaData;
    field public String name;
    field public CharSequence nonLocalizedLabel;
    field public String packageName;
  }

  public static class PackageItemInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.PackageItemInfo> {
    ctor public PackageItemInfo.DisplayNameComparator(android.content.pm.PackageManager);
    method public final int compare(android.content.pm.PackageItemInfo, android.content.pm.PackageItemInfo);
  }

  public abstract class PackageManager {
    ctor public PackageManager();
    method public abstract void addPackageToPreferred(String);
    method public abstract boolean addPermission(android.content.pm.PermissionInfo);
    method public abstract void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    method public abstract int checkPermission(String, String);
    method public abstract int checkSignatures(String, String);
    method public abstract void clearPackagePreferredActivities(String);
    method public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.graphics.drawable.Drawable getActivityIcon(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
    method public abstract int getApplicationEnabledSetting(String);
    method public abstract android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
    method public abstract android.graphics.drawable.Drawable getApplicationIcon(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.ApplicationInfo getApplicationInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
    method public abstract int getComponentEnabledSetting(android.content.ComponentName);
    method public abstract android.graphics.drawable.Drawable getDefaultActivityIcon();
    method public abstract android.graphics.drawable.Drawable getDrawable(String, int, android.content.pm.ApplicationInfo);
    method public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.Intent getLaunchIntentForPackage(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract String getNameForUid(int);
    method public android.content.pm.PackageInfo getPackageArchiveInfo(String, int);
    method public abstract int[] getPackageGids(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.PackageInfo getPackageInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract String[] getPackagesForUid(int);
    method public abstract android.content.pm.PermissionGroupInfo getPermissionGroupInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.PermissionInfo getPermissionInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, String);
    method public abstract java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
    method public abstract android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.res.Resources getResourcesForApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract String[] getSystemSharedLibraryNames();
    method public abstract CharSequence getText(String, int, android.content.pm.ApplicationInfo);
    method public abstract android.content.res.XmlResourceParser getXml(String, int, android.content.pm.ApplicationInfo);
    method public abstract void installPackage(android.net.Uri, android.content.pm.IPackageInstallObserver, int);
    method public void installPackage(android.net.Uri);
    method public abstract boolean isSafeMode();
    method public abstract java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
    method public abstract java.util.List<android.content.pm.ProviderInfo> queryContentProviders(String, int, int);
    method public abstract java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(String, int);
    method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
    method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
    method public abstract java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
    method public abstract java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public abstract void removePackageFromPreferred(String);
    method public abstract void removePermission(String);
    method public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
    method public abstract android.content.pm.ProviderInfo resolveContentProvider(String, int);
    method public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
    method public abstract void setApplicationEnabledSetting(String, int, int);
    method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
    field public static final int COMPONENT_ENABLED_STATE_DEFAULT = 0; // 0x0
    field public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; // 0x2
    field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
    field public static final int DONT_KILL_APP = 1; // 0x1
    field public static final int FORWARD_LOCK_PACKAGE = 1; // 0x1
    field public static final int GET_ACTIVITIES = 1; // 0x1
    field public static final int GET_CONFIGURATIONS = 16384; // 0x4000
    field public static final int GET_DISABLED_COMPONENTS = 512; // 0x200
    field public static final int GET_GIDS = 256; // 0x100
    field public static final int GET_INSTRUMENTATION = 16; // 0x10
    field public static final int GET_INTENT_FILTERS = 32; // 0x20
    field public static final int GET_META_DATA = 128; // 0x80
    field public static final int GET_PERMISSIONS = 4096; // 0x1000
    field public static final int GET_PROVIDERS = 8; // 0x8
    field public static final int GET_RECEIVERS = 2; // 0x2
    field public static final int GET_RESOLVED_FILTER = 64; // 0x40
    field public static final int GET_SERVICES = 4; // 0x4
    field public static final int GET_SHARED_LIBRARY_FILES = 1024; // 0x400
    field public static final int GET_SIGNATURES = 64; // 0x40
    field public static final int GET_UNINSTALLED_PACKAGES = 8192; // 0x2000
    field public static final int GET_URI_PERMISSION_PATTERNS = 2048; // 0x800
    field public static final int INSTALL_FAILED_ALREADY_EXISTS = -1; // 0xffffffff
    field public static final int INSTALL_FAILED_CONFLICTING_PROVIDER = -13; // 0xfffffff3
    field public static final int INSTALL_FAILED_DEXOPT = -11; // 0xfffffff5
    field public static final int INSTALL_FAILED_DUPLICATE_PACKAGE = -5; // 0xfffffffb
    field public static final int INSTALL_FAILED_INSUFFICIENT_STORAGE = -4; // 0xfffffffc
    field public static final int INSTALL_FAILED_INVALID_APK = -2; // 0xfffffffe
    field public static final int INSTALL_FAILED_INVALID_URI = -3; // 0xfffffffd
    field public static final int INSTALL_FAILED_MISSING_SHARED_LIBRARY = -9; // 0xfffffff7
    field public static final int INSTALL_FAILED_NO_SHARED_USER = -6; // 0xfffffffa
    field public static final int INSTALL_FAILED_OLDER_SDK = -12; // 0xfffffff4
    field public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; // 0xfffffff6
    field public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; // 0xfffffff8
    field public static final int INSTALL_FAILED_UPDATE_INCOMPATIBLE = -7; // 0xfffffff9
    field public static final int INSTALL_PARSE_FAILED_BAD_MANIFEST = -101; // 0xffffff9b
    field public static final int INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME = -106; // 0xffffff96
    field public static final int INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID = -107; // 0xffffff95
    field public static final int INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING = -105; // 0xffffff97
    field public static final int INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES = -104; // 0xffffff98
    field public static final int INSTALL_PARSE_FAILED_MANIFEST_EMPTY = -109; // 0xffffff93
    field public static final int INSTALL_PARSE_FAILED_MANIFEST_MALFORMED = -108; // 0xffffff94
    field public static final int INSTALL_PARSE_FAILED_NOT_APK = -100; // 0xffffff9c
    field public static final int INSTALL_PARSE_FAILED_NO_CERTIFICATES = -103; // 0xffffff99
    field public static final int INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION = -102; // 0xffffff9a
    field public static final int INSTALL_SUCCEEDED = 1; // 0x1
    field public static final int MATCH_DEFAULT_ONLY = 65536; // 0x10000
    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
    field public static final int PERMISSION_GRANTED = 0; // 0x0
    field public static final int PKG_INSTALL_COMPLETE = 1; // 0x1
    field public static final int PKG_INSTALL_INCOMPLETE = 0; // 0x0
    field public static final int REPLACE_EXISTING_PACKAGE = 2; // 0x2
    field public static final int SIGNATURE_FIRST_NOT_SIGNED = -1; // 0xffffffff
    field public static final int SIGNATURE_MATCH = 0; // 0x0
    field public static final int SIGNATURE_NEITHER_SIGNED = 1; // 0x1
    field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
    field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
    field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
  }

  public static class PackageManager.NameNotFoundException extends android.util.AndroidException {
    ctor public PackageManager.NameNotFoundException();
    ctor public PackageManager.NameNotFoundException(String);
  }

  public class PackageStats implements android.os.Parcelable {
    ctor public PackageStats(String);
    ctor public PackageStats(android.os.Parcel);
    ctor public PackageStats(android.content.pm.PackageStats);
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.PackageStats> CREATOR;
    field public long cacheSize;
    field public long codeSize;
    field public long dataSize;
    field public String packageName;
  }

  public class PermissionGroupInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public PermissionGroupInfo();
    ctor public PermissionGroupInfo(android.content.pm.PermissionGroupInfo);
    method public int describeContents();
    method public CharSequence loadDescription(android.content.pm.PackageManager);
    field public static final android.os.Parcelable.Creator<android.content.pm.PermissionGroupInfo> CREATOR;
    field public int descriptionRes;
    field public CharSequence nonLocalizedDescription;
  }

  public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
    ctor public PermissionInfo();
    ctor public PermissionInfo(android.content.pm.PermissionInfo);
    method public int describeContents();
    method public CharSequence loadDescription(android.content.pm.PackageManager);
    field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
    field public static final int PROTECTION_DANGEROUS = 1; // 0x1
    field public static final int PROTECTION_NORMAL = 0; // 0x0
    field public static final int PROTECTION_SIGNATURE = 2; // 0x2
    field public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3
    field public int descriptionRes;
    field public String group;
    field public CharSequence nonLocalizedDescription;
    field public int protectionLevel;
  }

  public final class ProviderInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
    ctor public ProviderInfo();
    ctor public ProviderInfo(android.content.pm.ProviderInfo);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.content.pm.ProviderInfo> CREATOR;
    field public String authority;
    field public boolean grantUriPermissions;
    field public int initOrder;
    field public boolean isSyncable;
    field public boolean multiprocess;
    field public String readPermission;
    field public android.os.PatternMatcher[] uriPermissionPatterns;
    field public String writePermission;
  }

  public class ResolveInfo implements android.os.Parcelable {
    ctor public ResolveInfo();
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public final int getIconResource();
    method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    method public CharSequence loadLabel(android.content.pm.PackageManager);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.ResolveInfo> CREATOR;
    field public android.content.pm.ActivityInfo activityInfo;
    field public android.content.IntentFilter filter;
    field public int icon;
    field public boolean isDefault;
    field public int labelRes;
    field public int match;
    field public CharSequence nonLocalizedLabel;
    field public int preferredOrder;
    field public int priority;
    field public android.content.pm.ServiceInfo serviceInfo;
    field public int specificIndex;
  }

  public static class ResolveInfo.DisplayNameComparator implements java.util.Comparator<android.content.pm.ResolveInfo> {
    ctor public ResolveInfo.DisplayNameComparator(android.content.pm.PackageManager);
    method public final int compare(android.content.pm.ResolveInfo, android.content.pm.ResolveInfo);
  }

  public class ServiceInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
    ctor public ServiceInfo();
    ctor public ServiceInfo(android.content.pm.ServiceInfo);
    method public int describeContents();
    field public static final android.os.Parcelable.Creator<android.content.pm.ServiceInfo> CREATOR;
    field public String permission;
  }

  public class Signature implements android.os.Parcelable {
    ctor public Signature(byte[]);
    ctor public Signature(String);
    method public int describeContents();
    method public byte[] toByteArray();
    method public char[] toChars();
    method public char[] toChars(char[], int[]);
    method public String toCharsString();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.pm.Signature> CREATOR;
  }

}

package android.content.res {

  public class AssetFileDescriptor implements android.os.Parcelable {
    ctor public AssetFileDescriptor(android.os.ParcelFileDescriptor, long, long);
    method public void close() throws java.io.IOException;
    method public java.io.FileInputStream createInputStream() throws java.io.IOException;
    method public java.io.FileOutputStream createOutputStream() throws java.io.IOException;
    method public int describeContents();
    method public long getDeclaredLength();
    method public java.io.FileDescriptor getFileDescriptor();
    method public long getLength();
    method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
    method public long getStartOffset();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.res.AssetFileDescriptor> CREATOR;
    field public static final long UNKNOWN_LENGTH = -1L; // 0xffffffffffffffffL
  }

  public static class AssetFileDescriptor.AutoCloseInputStream extends android.os.ParcelFileDescriptor.AutoCloseInputStream {
    ctor public AssetFileDescriptor.AutoCloseInputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
  }

  public static class AssetFileDescriptor.AutoCloseOutputStream extends android.os.ParcelFileDescriptor.AutoCloseOutputStream {
    ctor public AssetFileDescriptor.AutoCloseOutputStream(android.content.res.AssetFileDescriptor) throws java.io.IOException;
  }

  public final class AssetManager {
    method public void close();
    method public String[] getLocales();
    method public String[] list(String) throws java.io.IOException;
    method public java.io.InputStream open(String) throws java.io.IOException;
    method public java.io.InputStream open(String, int) throws java.io.IOException;
    method public android.content.res.AssetFileDescriptor openFd(String) throws java.io.IOException;
    method public android.content.res.AssetFileDescriptor openNonAssetFd(String) throws java.io.IOException;
    method public android.content.res.AssetFileDescriptor openNonAssetFd(int, String) throws java.io.IOException;
    method public android.content.res.XmlResourceParser openXmlResourceParser(String) throws java.io.IOException;
    method public android.content.res.XmlResourceParser openXmlResourceParser(int, String) throws java.io.IOException;
    field public static final int ACCESS_BUFFER = 3; // 0x3
    field public static final int ACCESS_RANDOM = 1; // 0x1
    field public static final int ACCESS_STREAMING = 2; // 0x2
    field public static final int ACCESS_UNKNOWN = 0; // 0x0
  }

  public final class AssetManager.AssetInputStream extends java.io.InputStream {
    method public int getAssetInt();
    method public int read() throws java.io.IOException;
  }

  public class ColorStateList implements android.os.Parcelable {
    ctor public ColorStateList(int[][], int[]);
    method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public int describeContents();
    method public int getColorForState(int[], int);
    method public int getDefaultColor();
    method public boolean isStateful();
    method public static android.content.res.ColorStateList valueOf(int);
    method public android.content.res.ColorStateList withAlpha(int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.res.ColorStateList> CREATOR;
  }

  public final class Configuration implements java.lang.Comparable<android.content.res.Configuration> android.os.Parcelable {
    ctor public Configuration();
    ctor public Configuration(android.content.res.Configuration);
    method public int compareTo(android.content.res.Configuration);
    method public int describeContents();
    method public int diff(android.content.res.Configuration);
    method public boolean equals(android.content.res.Configuration);
    method public static boolean needNewResources(int, int);
    method public void setToDefaults();
    method public int updateFrom(android.content.res.Configuration);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.res.Configuration> CREATOR;
    field public static final int HARDKEYBOARDHIDDEN_NO = 1; // 0x1
    field public static final int HARDKEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
    field public static final int HARDKEYBOARDHIDDEN_YES = 2; // 0x2
    field public static final int KEYBOARDHIDDEN_NO = 1; // 0x1
    field public static final int KEYBOARDHIDDEN_UNDEFINED = 0; // 0x0
    field public static final int KEYBOARDHIDDEN_YES = 2; // 0x2
    field public static final int KEYBOARD_12KEY = 3; // 0x3
    field public static final int KEYBOARD_NOKEYS = 1; // 0x1
    field public static final int KEYBOARD_QWERTY = 2; // 0x2
    field public static final int KEYBOARD_UNDEFINED = 0; // 0x0
    field public static final int NAVIGATION_DPAD = 2; // 0x2
    field public static final int NAVIGATION_NONAV = 1; // 0x1
    field public static final int NAVIGATION_TRACKBALL = 3; // 0x3
    field public static final int NAVIGATION_UNDEFINED = 0; // 0x0
    field public static final int NAVIGATION_WHEEL = 4; // 0x4
    field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2
    field public static final int ORIENTATION_PORTRAIT = 1; // 0x1
    field public static final int ORIENTATION_SQUARE = 3; // 0x3
    field public static final int ORIENTATION_UNDEFINED = 0; // 0x0
    field public static final int TOUCHSCREEN_FINGER = 3; // 0x3
    field public static final int TOUCHSCREEN_NOTOUCH = 1; // 0x1
    field public static final int TOUCHSCREEN_STYLUS = 2; // 0x2
    field public static final int TOUCHSCREEN_UNDEFINED = 0; // 0x0
    field public float fontScale;
    field public int hardKeyboardHidden;
    field public int keyboard;
    field public int keyboardHidden;
    field public java.util.Locale locale;
    field public int mcc;
    field public int mnc;
    field public int navigation;
    field public int orientation;
    field public int touchscreen;
  }

  public class Resources {
    ctor public Resources(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
    method public final void finishPreloading();
    method public final void flushLayoutCache();
    method public android.content.res.XmlResourceParser getAnimation(int) throws android.content.res.Resources.NotFoundException;
    method public final android.content.res.AssetManager getAssets();
    method public boolean getBoolean(int) throws android.content.res.Resources.NotFoundException;
    method public int getColor(int) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.ColorStateList getColorStateList(int) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.Configuration getConfiguration();
    method public float getDimension(int) throws android.content.res.Resources.NotFoundException;
    method public int getDimensionPixelOffset(int) throws android.content.res.Resources.NotFoundException;
    method public int getDimensionPixelSize(int) throws android.content.res.Resources.NotFoundException;
    method public android.util.DisplayMetrics getDisplayMetrics();
    method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
    method public float getFraction(int, int, int);
    method public int getIdentifier(String, String, String);
    method public int[] getIntArray(int) throws android.content.res.Resources.NotFoundException;
    method public int getInteger(int) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.XmlResourceParser getLayout(int) throws android.content.res.Resources.NotFoundException;
    method public android.graphics.Movie getMovie(int) throws android.content.res.Resources.NotFoundException;
    method public String getQuantityString(int, int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
    method public String getQuantityString(int, int) throws android.content.res.Resources.NotFoundException;
    method public CharSequence getQuantityText(int, int) throws android.content.res.Resources.NotFoundException;
    method public String getResourceEntryName(int) throws android.content.res.Resources.NotFoundException;
    method public String getResourceName(int) throws android.content.res.Resources.NotFoundException;
    method public String getResourcePackageName(int) throws android.content.res.Resources.NotFoundException;
    method public String getResourceTypeName(int) throws android.content.res.Resources.NotFoundException;
    method public String getString(int) throws android.content.res.Resources.NotFoundException;
    method public String getString(int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
    method public String[] getStringArray(int) throws android.content.res.Resources.NotFoundException;
    method public static android.content.res.Resources getSystem();
    method public CharSequence getText(int) throws android.content.res.Resources.NotFoundException;
    method public CharSequence getText(int, CharSequence);
    method public CharSequence[] getTextArray(int) throws android.content.res.Resources.NotFoundException;
    method public void getValue(int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
    method public void getValue(String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.XmlResourceParser getXml(int) throws android.content.res.Resources.NotFoundException;
    method public final android.content.res.Resources.Theme newTheme();
    method public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
    method public android.content.res.TypedArray obtainTypedArray(int) throws android.content.res.Resources.NotFoundException;
    method public java.io.InputStream openRawResource(int) throws android.content.res.Resources.NotFoundException;
    method public java.io.InputStream openRawResource(int, android.util.TypedValue) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.AssetFileDescriptor openRawResourceFd(int) throws android.content.res.Resources.NotFoundException;
    method public void parseBundleExtra(String, android.util.AttributeSet, android.os.Bundle) throws org.xmlpull.v1.XmlPullParserException;
    method public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
  }

  public static class Resources.NotFoundException extends java.lang.RuntimeException {
    ctor public Resources.NotFoundException();
    ctor public Resources.NotFoundException(String);
  }

  public final class Resources.Theme {
    method public void applyStyle(int, boolean);
    method public void dump(int, String, String);
    method public android.content.res.TypedArray obtainStyledAttributes(int[]);
    method public android.content.res.TypedArray obtainStyledAttributes(int, int[]) throws android.content.res.Resources.NotFoundException;
    method public android.content.res.TypedArray obtainStyledAttributes(android.util.AttributeSet, int[], int, int);
    method public boolean resolveAttribute(int, android.util.TypedValue, boolean);
    method public void setTo(android.content.res.Resources.Theme);
  }

  public class TypedArray {
    method public boolean getBoolean(int, boolean);
    method public int getColor(int, int);
    method public android.content.res.ColorStateList getColorStateList(int);
    method public float getDimension(int, float);
    method public int getDimensionPixelOffset(int, int);
    method public int getDimensionPixelSize(int, int);
    method public android.graphics.drawable.Drawable getDrawable(int);
    method public float getFloat(int, float);
    method public float getFraction(int, int, int, float);
    method public int getIndex(int);
    method public int getIndexCount();
    method public int getInt(int, int);
    method public int getInteger(int, int);
    method public int getLayoutDimension(int, String);
    method public int getLayoutDimension(int, int);
    method public String getNonResourceString(int);
    method public String getPositionDescription();
    method public int getResourceId(int, int);
    method public android.content.res.Resources getResources();
    method public String getString(int);
    method public CharSequence getText(int);
    method public CharSequence[] getTextArray(int);
    method public boolean getValue(int, android.util.TypedValue);
    method public boolean hasValue(int);
    method public int length();
    method public android.util.TypedValue peekValue(int);
    method public void recycle();
  }

  public interface XmlResourceParser extends org.xmlpull.v1.XmlPullParser android.util.AttributeSet {
    method public void close();
  }

}

package android.database {

  public abstract class AbstractCursor implements android.database.CrossProcessCursor {
    ctor public AbstractCursor();
    method protected void checkPosition();
    method public void close();
    method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
    method public void deactivate();
    method public void fillWindow(int, android.database.CursorWindow);
    method protected void finalize();
    method public byte[] getBlob(int);
    method public int getColumnCount();
    method public int getColumnIndex(String);
    method public int getColumnIndexOrThrow(String);
    method public String getColumnName(int);
    method public android.os.Bundle getExtras();
    method public final int getPosition();
    method protected Object getUpdatedField(int);
    method public boolean getWantsAllOnMoveCalls();
    method public android.database.CursorWindow getWindow();
    method public final boolean isAfterLast();
    method public final boolean isBeforeFirst();
    method public boolean isClosed();
    method protected boolean isFieldUpdated(int);
    method public final boolean isFirst();
    method public final boolean isLast();
    method public final boolean move(int);
    method public final boolean moveToFirst();
    method public final boolean moveToLast();
    method public final boolean moveToNext();
    method public final boolean moveToPosition(int);
    method public final boolean moveToPrevious();
    method protected void onChange(boolean);
    method public boolean onMove(int, int);
    method public void registerContentObserver(android.database.ContentObserver);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public boolean requery();
    method public android.os.Bundle respond(android.os.Bundle);
    method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
    method public void unregisterContentObserver(android.database.ContentObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
    field protected boolean mClosed;
    field protected android.content.ContentResolver mContentResolver;
    field protected Long mCurrentRowID;
    field protected int mPos;
    field protected int mRowIdColumnIndex;
    field protected java.util.HashMap<java.lang.Long,java.util.Map<java.lang.String,java.lang.Object>> mUpdatedRows;
  }

  protected static class AbstractCursor.SelfContentObserver extends android.database.ContentObserver {
    ctor public AbstractCursor.SelfContentObserver(android.database.AbstractCursor);
  }

  public abstract class AbstractWindowedCursor extends android.database.AbstractCursor {
    ctor public AbstractWindowedCursor();
    method public double getDouble(int);
    method public float getFloat(int);
    method public int getInt(int);
    method public long getLong(int);
    method public short getShort(int);
    method public String getString(int);
    method public boolean hasWindow();
    method public boolean isBlob(int);
    method public boolean isNull(int);
    method public void setWindow(android.database.CursorWindow);
    field protected android.database.CursorWindow mWindow;
  }

  public final class CharArrayBuffer {
    ctor public CharArrayBuffer(int);
    ctor public CharArrayBuffer(char[]);
    field public char[] data;
    field public int sizeCopied;
  }

  public class ContentObservable extends android.database.Observable<android.database.ContentObserver> {
    ctor public ContentObservable();
    method public void dispatchChange(boolean);
    method public void notifyChange(boolean);
    method public void registerObserver(android.database.ContentObserver);
  }

  public abstract class ContentObserver {
    ctor public ContentObserver(android.os.Handler);
    method public boolean deliverSelfNotifications();
    method public final void dispatchChange(boolean);
    method public void onChange(boolean);
  }

  public interface CrossProcessCursor extends android.database.Cursor {
    method public void fillWindow(int, android.database.CursorWindow);
    method public android.database.CursorWindow getWindow();
    method public boolean onMove(int, int);
  }

  public interface Cursor {
    method public void close();
    method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
    method public void deactivate();
    method public byte[] getBlob(int);
    method public int getColumnCount();
    method public int getColumnIndex(String);
    method public int getColumnIndexOrThrow(String) throws java.lang.IllegalArgumentException;
    method public String getColumnName(int);
    method public String[] getColumnNames();
    method public int getCount();
    method public double getDouble(int);
    method public android.os.Bundle getExtras();
    method public float getFloat(int);
    method public int getInt(int);
    method public long getLong(int);
    method public int getPosition();
    method public short getShort(int);
    method public String getString(int);
    method public boolean getWantsAllOnMoveCalls();
    method public boolean isAfterLast();
    method public boolean isBeforeFirst();
    method public boolean isClosed();
    method public boolean isFirst();
    method public boolean isLast();
    method public boolean isNull(int);
    method public boolean move(int);
    method public boolean moveToFirst();
    method public boolean moveToLast();
    method public boolean moveToNext();
    method public boolean moveToPosition(int);
    method public boolean moveToPrevious();
    method public void registerContentObserver(android.database.ContentObserver);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public boolean requery();
    method public android.os.Bundle respond(android.os.Bundle);
    method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
    method public void unregisterContentObserver(android.database.ContentObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  public class CursorIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
    ctor public CursorIndexOutOfBoundsException(int, int);
    ctor public CursorIndexOutOfBoundsException(String);
  }

  public final class CursorJoiner implements java.lang.Iterable<android.database.CursorJoiner.Result> java.util.Iterator<android.database.CursorJoiner.Result> {
    ctor public CursorJoiner(android.database.Cursor, String[], android.database.Cursor, String[]);
    method public boolean hasNext();
    method public java.util.Iterator<android.database.CursorJoiner.Result> iterator();
    method public android.database.CursorJoiner.Result next();
    method public void remove();
  }

  public enum CursorJoiner.Result {
    enum_constant public static final android.database.CursorJoiner.Result BOTH;
    enum_constant public static final android.database.CursorJoiner.Result LEFT;
    enum_constant public static final android.database.CursorJoiner.Result RIGHT;
  }

  public class CursorWindow extends android.database.sqlite.SQLiteClosable implements android.os.Parcelable {
    ctor public CursorWindow(boolean);
    method public boolean allocRow();
    method public void clear();
    method public void close();
    method public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
    method public int describeContents();
    method protected void finalize();
    method public void freeLastRow();
    method public byte[] getBlob(int, int);
    method public double getDouble(int, int);
    method public float getFloat(int, int);
    method public int getInt(int, int);
    method public long getLong(int, int);
    method public int getNumRows();
    method public short getShort(int, int);
    method public int getStartPosition();
    method public String getString(int, int);
    method public boolean isBlob(int, int);
    method public boolean isNull(int, int);
    method public static android.database.CursorWindow newFromParcel(android.os.Parcel);
    method protected void onAllReferencesReleased();
    method public boolean putBlob(byte[], int, int);
    method public boolean putDouble(double, int, int);
    method public boolean putLong(long, int, int);
    method public boolean putNull(int, int);
    method public boolean putString(String, int, int);
    method public boolean setNumColumns(int);
    method public void setStartPosition(int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.database.CursorWindow> CREATOR;
  }

  public class CursorWrapper implements android.database.Cursor {
    ctor public CursorWrapper(android.database.Cursor);
    method public void close();
    method public void copyStringToBuffer(int, android.database.CharArrayBuffer);
    method public void deactivate();
    method public byte[] getBlob(int);
    method public int getColumnCount();
    method public int getColumnIndex(String);
    method public int getColumnIndexOrThrow(String) throws java.lang.IllegalArgumentException;
    method public String getColumnName(int);
    method public String[] getColumnNames();
    method public int getCount();
    method public double getDouble(int);
    method public android.os.Bundle getExtras();
    method public float getFloat(int);
    method public int getInt(int);
    method public long getLong(int);
    method public int getPosition();
    method public short getShort(int);
    method public String getString(int);
    method public boolean getWantsAllOnMoveCalls();
    method public boolean isAfterLast();
    method public boolean isBeforeFirst();
    method public boolean isClosed();
    method public boolean isFirst();
    method public boolean isLast();
    method public boolean isNull(int);
    method public boolean move(int);
    method public boolean moveToFirst();
    method public boolean moveToLast();
    method public boolean moveToNext();
    method public boolean moveToPosition(int);
    method public boolean moveToPrevious();
    method public void registerContentObserver(android.database.ContentObserver);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public boolean requery();
    method public android.os.Bundle respond(android.os.Bundle);
    method public void setNotificationUri(android.content.ContentResolver, android.net.Uri);
    method public void unregisterContentObserver(android.database.ContentObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  public class DataSetObservable extends android.database.Observable<android.database.DataSetObserver> {
    ctor public DataSetObservable();
    method public void notifyChanged();
    method public void notifyInvalidated();
  }

  public abstract class DataSetObserver {
    ctor public DataSetObserver();
    method public void onChanged();
    method public void onInvalidated();
  }

  public class DatabaseUtils {
    ctor public DatabaseUtils();
    method public static void appendEscapedSQLString(StringBuilder, String);
    method public static final void appendValueToSql(StringBuilder, Object);
    method public static void bindObjectToProgram(android.database.sqlite.SQLiteProgram, int, Object);
    method public static void createDbFromSqlStatements(android.content.Context, String, int, String);
    method public static void cursorDoubleToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
    method public static void cursorDoubleToCursorValues(android.database.Cursor, String, android.content.ContentValues);
    method public static void cursorIntToContentValues(android.database.Cursor, String, android.content.ContentValues);
    method public static void cursorIntToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
    method public static void cursorLongToContentValues(android.database.Cursor, String, android.content.ContentValues);
    method public static void cursorLongToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
    method public static void cursorRowToContentValues(android.database.Cursor, android.content.ContentValues);
    method public static void cursorStringToContentValues(android.database.Cursor, String, android.content.ContentValues);
    method public static void cursorStringToContentValues(android.database.Cursor, String, android.content.ContentValues, String);
    method public static void cursorStringToInsertHelper(android.database.Cursor, String, android.database.DatabaseUtils.InsertHelper, int);
    method public static void dumpCurrentRow(android.database.Cursor);
    method public static void dumpCurrentRow(android.database.Cursor, java.io.PrintStream);
    method public static void dumpCurrentRow(android.database.Cursor, StringBuilder);
    method public static String dumpCurrentRowToString(android.database.Cursor);
    method public static void dumpCursor(android.database.Cursor);
    method public static void dumpCursor(android.database.Cursor, java.io.PrintStream);
    method public static void dumpCursor(android.database.Cursor, StringBuilder);
    method public static String dumpCursorToString(android.database.Cursor);
    method public static String getCollationKey(String);
    method public static String getHexCollationKey(String);
    method public static long longForQuery(android.database.sqlite.SQLiteDatabase, String, String[]);
    method public static long longForQuery(android.database.sqlite.SQLiteStatement, String[]);
    method public static long queryNumEntries(android.database.sqlite.SQLiteDatabase, String);
    method public static final void readExceptionFromParcel(android.os.Parcel);
    method public static void readExceptionWithFileNotFoundExceptionFromParcel(android.os.Parcel) throws java.io.FileNotFoundException;
    method public static String sqlEscapeString(String);
    method public static String stringForQuery(android.database.sqlite.SQLiteDatabase, String, String[]);
    method public static String stringForQuery(android.database.sqlite.SQLiteStatement, String[]);
    method public static final void writeExceptionToParcel(android.os.Parcel, Exception);
  }

  public static class DatabaseUtils.InsertHelper {
    ctor public DatabaseUtils.InsertHelper(android.database.sqlite.SQLiteDatabase, String);
    method public void bind(int, double);
    method public void bind(int, float);
    method public void bind(int, long);
    method public void bind(int, int);
    method public void bind(int, boolean);
    method public void bind(int, byte[]);
    method public void bind(int, String);
    method public void bindNull(int);
    method public void close();
    method public long execute();
    method public int getColumnIndex(String);
    method public long insert(android.content.ContentValues);
    method public void prepareForInsert();
    method public void prepareForReplace();
    method public long replace(android.content.ContentValues);
    field public static final int TABLE_INFO_PRAGMA_DEFAULT_INDEX = 4; // 0x4
  }

  public class MatrixCursor extends android.database.AbstractCursor {
    ctor public MatrixCursor(String[], int);
    ctor public MatrixCursor(String[]);
    method public void addRow(Object[]);
    method public void addRow(Iterable<?>);
    method public String[] getColumnNames();
    method public int getCount();
    method public double getDouble(int);
    method public float getFloat(int);
    method public int getInt(int);
    method public long getLong(int);
    method public short getShort(int);
    method public String getString(int);
    method public boolean isNull(int);
    method public android.database.MatrixCursor.RowBuilder newRow();
  }

  public class MatrixCursor.RowBuilder {
    method public android.database.MatrixCursor.RowBuilder add(Object);
  }

  public class MergeCursor extends android.database.AbstractCursor {
    ctor public MergeCursor(android.database.Cursor[]);
    method public String[] getColumnNames();
    method public int getCount();
    method public double getDouble(int);
    method public float getFloat(int);
    method public int getInt(int);
    method public long getLong(int);
    method public short getShort(int);
    method public String getString(int);
    method public boolean isNull(int);
  }

  public abstract class Observable<T> {
    ctor public Observable();
    method public void registerObserver(T);
    method public void unregisterAll();
    method public void unregisterObserver(T);
    field protected final java.util.ArrayList<T> mObservers;
  }

  public class SQLException extends java.lang.RuntimeException {
    ctor public SQLException();
    ctor public SQLException(String);
  }

  public class StaleDataException extends java.lang.RuntimeException {
    ctor public StaleDataException();
    ctor public StaleDataException(String);
  }

}

package android.database.sqlite {

  public class SQLiteAbortException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteAbortException();
    ctor public SQLiteAbortException(String);
  }

  public abstract class SQLiteClosable {
    ctor public SQLiteClosable();
    method public void acquireReference();
    method protected abstract void onAllReferencesReleased();
    method protected void onAllReferencesReleasedFromContainer();
    method public void releaseReference();
    method public void releaseReferenceFromContainer();
  }

  public class SQLiteConstraintException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteConstraintException();
    ctor public SQLiteConstraintException(String);
  }

  public class SQLiteCursor extends android.database.AbstractWindowedCursor {
    ctor public SQLiteCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, String, android.database.sqlite.SQLiteQuery);
    method public String[] getColumnNames();
    method public int getCount();
    method public android.database.sqlite.SQLiteDatabase getDatabase();
    method public void setSelectionArguments(String[]);
  }

  public interface SQLiteCursorDriver {
    method public void cursorClosed();
    method public void cursorDeactivated();
    method public void cursorRequeried(android.database.Cursor);
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase.CursorFactory, String[]);
    method public void setBindArguments(String[]);
  }

  public class SQLiteDatabase extends android.database.sqlite.SQLiteClosable {
    method public void beginTransaction();
    method public void close();
    method public android.database.sqlite.SQLiteStatement compileStatement(String) throws android.database.SQLException;
    method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public int delete(String, String, String[]);
    method public void endTransaction();
    method public void execSQL(String) throws android.database.SQLException;
    method public void execSQL(String, Object[]) throws android.database.SQLException;
    method protected void finalize();
    method public static String findEditTable(String);
    method public long getMaximumSize();
    method public long getPageSize();
    method public final String getPath();
    method public java.util.Map<java.lang.String,java.lang.String> getSyncedTables();
    method public int getVersion();
    method public boolean inTransaction();
    method public long insert(String, String, android.content.ContentValues);
    method public long insertOrThrow(String, String, android.content.ContentValues) throws android.database.SQLException;
    method public boolean isDbLockedByCurrentThread();
    method public boolean isDbLockedByOtherThreads();
    method public boolean isOpen();
    method public boolean isReadOnly();
    method public void markTableSyncable(String, String);
    method public void markTableSyncable(String, String, String);
    method public boolean needUpgrade(int);
    method protected void onAllReferencesReleased();
    method public static android.database.sqlite.SQLiteDatabase openDatabase(String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
    method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.io.File, android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public android.database.Cursor query(boolean, String, String[], String, String[], String, String, String, String);
    method public android.database.Cursor query(String, String[], String, String[], String, String, String);
    method public android.database.Cursor query(String, String[], String, String[], String, String, String, String);
    method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, String, String[], String, String[], String, String, String, String);
    method public android.database.Cursor rawQuery(String, String[]);
    method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, String, String[], String);
    method public static int releaseMemory();
    method public long replace(String, String, android.content.ContentValues);
    method public long replaceOrThrow(String, String, android.content.ContentValues) throws android.database.SQLException;
    method public void setLocale(java.util.Locale);
    method public void setLockingEnabled(boolean);
    method public long setMaximumSize(long);
    method public void setPageSize(long);
    method public void setTransactionSuccessful();
    method public void setVersion(int);
    method public int update(String, android.content.ContentValues, String, String[]);
    method public boolean yieldIfContended();
    method public boolean yieldIfContendedSafely();
    field public static final int CREATE_IF_NECESSARY = 268435456; // 0x10000000
    field public static final int NO_LOCALIZED_COLLATORS = 16; // 0x10
    field public static final int OPEN_READONLY = 1; // 0x1
    field public static final int OPEN_READWRITE = 0; // 0x0
    field public static final int SQLITE_MAX_LIKE_PATTERN_LENGTH = 50000; // 0xc350
  }

  public static interface SQLiteDatabase.CursorFactory {
    method public android.database.Cursor newCursor(android.database.sqlite.SQLiteDatabase, android.database.sqlite.SQLiteCursorDriver, String, android.database.sqlite.SQLiteQuery);
  }

  public class SQLiteDatabaseCorruptException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteDatabaseCorruptException();
    ctor public SQLiteDatabaseCorruptException(String);
  }

  public class SQLiteDiskIOException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteDiskIOException();
    ctor public SQLiteDiskIOException(String);
  }

  public class SQLiteDoneException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteDoneException();
    ctor public SQLiteDoneException(String);
  }

  public class SQLiteException extends android.database.SQLException {
    ctor public SQLiteException();
    ctor public SQLiteException(String);
  }

  public class SQLiteFullException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteFullException();
    ctor public SQLiteFullException(String);
  }

  public class SQLiteMisuseException extends android.database.sqlite.SQLiteException {
    ctor public SQLiteMisuseException();
    ctor public SQLiteMisuseException(String);
  }

  public abstract class SQLiteOpenHelper {
    ctor public SQLiteOpenHelper(android.content.Context, String, android.database.sqlite.SQLiteDatabase.CursorFactory, int);
    method public void close();
    method public android.database.sqlite.SQLiteDatabase getReadableDatabase();
    method public android.database.sqlite.SQLiteDatabase getWritableDatabase();
    method public abstract void onCreate(android.database.sqlite.SQLiteDatabase);
    method public void onOpen(android.database.sqlite.SQLiteDatabase);
    method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
  }

  public abstract class SQLiteProgram extends android.database.sqlite.SQLiteClosable {
    method public void bindBlob(int, byte[]);
    method public void bindDouble(int, double);
    method public void bindLong(int, long);
    method public void bindNull(int);
    method public void bindString(int, String);
    method public void clearBindings();
    method public void close();
    method protected void compile(String, boolean);
    method protected void finalize();
    method public final int getUniqueId();
    method protected final void native_bind_blob(int, byte[]);
    method protected final void native_bind_double(int, double);
    method protected final void native_bind_long(int, long);
    method protected final void native_bind_null(int);
    method protected final void native_bind_string(int, String);
    method protected final void native_compile(String);
    method protected final void native_finalize();
    method protected void onAllReferencesReleased();
    field protected android.database.sqlite.SQLiteDatabase mDatabase;
    field protected int nHandle;
    field protected int nStatement;
  }

  public class SQLiteQuery extends android.database.sqlite.SQLiteProgram {
  }

  public class SQLiteQueryBuilder {
    ctor public SQLiteQueryBuilder();
    method public static void appendColumns(StringBuilder, String[]);
    method public void appendWhere(CharSequence);
    method public void appendWhereEscapeString(String);
    method public String buildQuery(String[], String, String[], String, String, String, String);
    method public static String buildQueryString(boolean, String, String[], String, String, String, String, String);
    method public String buildUnionQuery(String[], String, String);
    method public String buildUnionSubQuery(String, String[], java.util.Set<java.lang.String>, int, String, String, String[], String, String);
    method public String getTables();
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, String[], String, String[], String, String, String);
    method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, String[], String, String[], String, String, String, String);
    method public void setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public void setDistinct(boolean);
    method public void setProjectionMap(java.util.Map<java.lang.String,java.lang.String>);
    method public void setTables(String);
  }

  public class SQLiteStatement extends android.database.sqlite.SQLiteProgram {
    method public void execute();
    method public long executeInsert();
    method public long simpleQueryForLong();
    method public String simpleQueryForString();
  }

}

package android.graphics {

  public class AvoidXfermode extends android.graphics.Xfermode {
    ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode);
  }

  public enum AvoidXfermode.Mode {
    enum_constant public static final android.graphics.AvoidXfermode.Mode AVOID;
    enum_constant public static final android.graphics.AvoidXfermode.Mode TARGET;
  }

  public final class Bitmap implements android.os.Parcelable {
    method public boolean compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream);
    method public android.graphics.Bitmap copy(android.graphics.Bitmap.Config, boolean);
    method public void copyPixelsFromBuffer(java.nio.Buffer);
    method public void copyPixelsToBuffer(java.nio.Buffer);
    method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap);
    method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int);
    method public static android.graphics.Bitmap createBitmap(android.graphics.Bitmap, int, int, int, int, android.graphics.Matrix, boolean);
    method public static android.graphics.Bitmap createBitmap(int, int, android.graphics.Bitmap.Config);
    method public static android.graphics.Bitmap createBitmap(int[], int, int, int, int, android.graphics.Bitmap.Config);
    method public static android.graphics.Bitmap createBitmap(int[], int, int, android.graphics.Bitmap.Config);
    method public static android.graphics.Bitmap createScaledBitmap(android.graphics.Bitmap, int, int, boolean);
    method public int describeContents();
    method public void eraseColor(int);
    method public android.graphics.Bitmap extractAlpha();
    method public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]);
    method public android.graphics.Bitmap.Config getConfig();
    method public int getHeight();
    method public byte[] getNinePatchChunk();
    method public int getPixel(int, int);
    method public void getPixels(int[], int, int, int, int, int, int);
    method public int getRowBytes();
    method public int getWidth();
    method public boolean hasAlpha();
    method public boolean isMutable();
    method public boolean isRecycled();
    method public void recycle();
    method public void setPixel(int, int, int);
    method public void setPixels(int[], int, int, int, int, int, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.graphics.Bitmap> CREATOR;
  }

  public enum Bitmap.CompressFormat {
    enum_constant public static final android.graphics.Bitmap.CompressFormat JPEG;
    enum_constant public static final android.graphics.Bitmap.CompressFormat PNG;
  }

  public enum Bitmap.Config {
    enum_constant public static final android.graphics.Bitmap.Config ALPHA_8;
    enum_constant public static final android.graphics.Bitmap.Config ARGB_4444;
    enum_constant public static final android.graphics.Bitmap.Config ARGB_8888;
    enum_constant public static final android.graphics.Bitmap.Config RGB_565;
  }

  public class BitmapFactory {
    ctor public BitmapFactory();
    method public static android.graphics.Bitmap decodeByteArray(byte[], int, int, android.graphics.BitmapFactory.Options);
    method public static android.graphics.Bitmap decodeByteArray(byte[], int, int);
    method public static android.graphics.Bitmap decodeFile(String, android.graphics.BitmapFactory.Options);
    method public static android.graphics.Bitmap decodeFile(String);
    method public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor, android.graphics.Rect, android.graphics.BitmapFactory.Options);
    method public static android.graphics.Bitmap decodeFileDescriptor(java.io.FileDescriptor);
    method public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int, android.graphics.BitmapFactory.Options);
    method public static android.graphics.Bitmap decodeResource(android.content.res.Resources, int);
    method public static android.graphics.Bitmap decodeStream(java.io.InputStream, android.graphics.Rect, android.graphics.BitmapFactory.Options);
    method public static android.graphics.Bitmap decodeStream(java.io.InputStream);
  }

  public static class BitmapFactory.Options {
    ctor public BitmapFactory.Options();
    method public void requestCancelDecode();
    field public boolean inDither;
    field public boolean inJustDecodeBounds;
    field public android.graphics.Bitmap.Config inPreferredConfig;
    field public int inSampleSize;
    field public byte[] inTempStorage;
    field public boolean mCancel;
    field public int outHeight;
    field public String outMimeType;
    field public int outWidth;
  }

  public class BitmapShader extends android.graphics.Shader {
    ctor public BitmapShader(android.graphics.Bitmap, android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
  }

  public class BlurMaskFilter extends android.graphics.MaskFilter {
    ctor public BlurMaskFilter(float, android.graphics.BlurMaskFilter.Blur);
  }

  public enum BlurMaskFilter.Blur {
    enum_constant public static final android.graphics.BlurMaskFilter.Blur INNER;
    enum_constant public static final android.graphics.BlurMaskFilter.Blur NORMAL;
    enum_constant public static final android.graphics.BlurMaskFilter.Blur OUTER;
    enum_constant public static final android.graphics.BlurMaskFilter.Blur SOLID;
  }

  public class Camera {
    ctor public Camera();
    method public void applyToCanvas(android.graphics.Canvas);
    method public float dotWithNormal(float, float, float);
    method public void getMatrix(android.graphics.Matrix);
    method public void restore();
    method public void rotateX(float);
    method public void rotateY(float);
    method public void rotateZ(float);
    method public void save();
    method public void translate(float, float, float);
  }

  public class Canvas {
    ctor public Canvas();
    ctor public Canvas(android.graphics.Bitmap);
    ctor public Canvas(javax.microedition.khronos.opengles.GL);
    method public boolean clipPath(android.graphics.Path, android.graphics.Region.Op);
    method public boolean clipPath(android.graphics.Path);
    method public boolean clipRect(android.graphics.RectF, android.graphics.Region.Op);
    method public boolean clipRect(android.graphics.Rect, android.graphics.Region.Op);
    method public boolean clipRect(android.graphics.RectF);
    method public boolean clipRect(android.graphics.Rect);
    method public boolean clipRect(float, float, float, float, android.graphics.Region.Op);
    method public boolean clipRect(float, float, float, float);
    method public boolean clipRect(int, int, int, int);
    method public boolean clipRegion(android.graphics.Region, android.graphics.Region.Op);
    method public boolean clipRegion(android.graphics.Region);
    method public void concat(android.graphics.Matrix);
    method public void drawARGB(int, int, int, int);
    method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
    method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
    method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
    method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
    method public void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
    method public void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
    method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
    method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
    method public void drawCircle(float, float, float, android.graphics.Paint);
    method public void drawColor(int);
    method public void drawColor(int, android.graphics.PorterDuff.Mode);
    method public void drawLine(float, float, float, float, android.graphics.Paint);
    method public void drawLines(float[], int, int, android.graphics.Paint);
    method public void drawLines(float[], android.graphics.Paint);
    method public void drawOval(android.graphics.RectF, android.graphics.Paint);
    method public void drawPaint(android.graphics.Paint);
    method public void drawPath(android.graphics.Path, android.graphics.Paint);
    method public void drawPicture(android.graphics.Picture);
    method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
    method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
    method public void drawPoint(float, float, android.graphics.Paint);
    method public void drawPoints(float[], int, int, android.graphics.Paint);
    method public void drawPoints(float[], android.graphics.Paint);
    method public void drawPosText(char[], int, int, float[], android.graphics.Paint);
    method public void drawPosText(String, float[], android.graphics.Paint);
    method public void drawRGB(int, int, int);
    method public void drawRect(android.graphics.RectF, android.graphics.Paint);
    method public void drawRect(android.graphics.Rect, android.graphics.Paint);
    method public void drawRect(float, float, float, float, android.graphics.Paint);
    method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
    method public void drawText(char[], int, int, float, float, android.graphics.Paint);
    method public void drawText(String, float, float, android.graphics.Paint);
    method public void drawText(String, int, int, float, float, android.graphics.Paint);
    method public void drawText(CharSequence, int, int, float, float, android.graphics.Paint);
    method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
    method public void drawTextOnPath(String, android.graphics.Path, float, float, android.graphics.Paint);
    method public void drawVertices(android.graphics.Canvas.VertexMode, int, float[], int, float[], int, int[], int, short[], int, int, android.graphics.Paint);
    method public static void freeGlCaches();
    method public boolean getClipBounds(android.graphics.Rect);
    method public final android.graphics.Rect getClipBounds();
    method public android.graphics.DrawFilter getDrawFilter();
    method public javax.microedition.khronos.opengles.GL getGL();
    method public int getHeight();
    method public void getMatrix(android.graphics.Matrix);
    method public final android.graphics.Matrix getMatrix();
    method public int getSaveCount();
    method public int getWidth();
    method public boolean isOpaque();
    method public boolean quickReject(android.graphics.RectF, android.graphics.Canvas.EdgeType);
    method public boolean quickReject(android.graphics.Path, android.graphics.Canvas.EdgeType);
    method public boolean quickReject(float, float, float, float, android.graphics.Canvas.EdgeType);
    method public void restore();
    method public void restoreToCount(int);
    method public void rotate(float);
    method public final void rotate(float, float, float);
    method public int save();
    method public int save(int);
    method public int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
    method public int saveLayer(float, float, float, float, android.graphics.Paint, int);
    method public int saveLayerAlpha(android.graphics.RectF, int, int);
    method public int saveLayerAlpha(float, float, float, float, int, int);
    method public void scale(float, float);
    method public final void scale(float, float, float, float);
    method public void setBitmap(android.graphics.Bitmap);
    method public void setDrawFilter(android.graphics.DrawFilter);
    method public void setMatrix(android.graphics.Matrix);
    method public void setViewport(int, int);
    method public void skew(float, float);
    method public void translate(float, float);
    field public static final int ALL_SAVE_FLAG = 31; // 0x1f
    field public static final int CLIP_SAVE_FLAG = 2; // 0x2
    field public static final int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
    field public static final int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
    field public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 4; // 0x4
    field public static final int MATRIX_SAVE_FLAG = 1; // 0x1
  }

  public enum Canvas.EdgeType {
    enum_constant public static final android.graphics.Canvas.EdgeType AA;
    enum_constant public static final android.graphics.Canvas.EdgeType BW;
  }

  public enum Canvas.VertexMode {
    enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLES;
    enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLE_FAN;
    enum_constant public static final android.graphics.Canvas.VertexMode TRIANGLE_STRIP;
  }

  public class Color {
    ctor public Color();
    method public static int HSVToColor(float[]);
    method public static int HSVToColor(int, float[]);
    method public static void RGBToHSV(int, int, int, float[]);
    method public static int alpha(int);
    method public static int argb(int, int, int, int);
    method public static int blue(int);
    method public static void colorToHSV(int, float[]);
    method public static int green(int);
    method public static int parseColor(String);
    method public static int red(int);
    method public static int rgb(int, int, int);
    field public static final int BLACK = -16777216; // 0xff000000
    field public static final int BLUE = -16776961; // 0xff0000ff
    field public static final int CYAN = -16711681; // 0xff00ffff
    field public static final int DKGRAY = -12303292; // 0xff444444
    field public static final int GRAY = -7829368; // 0xff888888
    field public static final int GREEN = -16711936; // 0xff00ff00
    field public static final int LTGRAY = -3355444; // 0xffcccccc
    field public static final int MAGENTA = -65281; // 0xffff00ff
    field public static final int RED = -65536; // 0xffff0000
    field public static final int TRANSPARENT = 0; // 0x0
    field public static final int WHITE = -1; // 0xffffffff
    field public static final int YELLOW = -256; // 0xffffff00
  }

  public class ColorFilter {
    ctor public ColorFilter();
  }

  public class ColorMatrix {
    ctor public ColorMatrix();
    ctor public ColorMatrix(float[]);
    ctor public ColorMatrix(android.graphics.ColorMatrix);
    method public final float[] getArray();
    method public void postConcat(android.graphics.ColorMatrix);
    method public void preConcat(android.graphics.ColorMatrix);
    method public void reset();
    method public void set(android.graphics.ColorMatrix);
    method public void set(float[]);
    method public void setConcat(android.graphics.ColorMatrix, android.graphics.ColorMatrix);
    method public void setRGB2YUV();
    method public void setRotate(int, float);
    method public void setSaturation(float);
    method public void setScale(float, float, float, float);
    method public void setYUV2RGB();
  }

  public class ColorMatrixColorFilter extends android.graphics.ColorFilter {
    ctor public ColorMatrixColorFilter(android.graphics.ColorMatrix);
    ctor public ColorMatrixColorFilter(float[]);
  }

  public class ComposePathEffect extends android.graphics.PathEffect {
    ctor public ComposePathEffect(android.graphics.PathEffect, android.graphics.PathEffect);
  }

  public class ComposeShader extends android.graphics.Shader {
    ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.Xfermode);
    ctor public ComposeShader(android.graphics.Shader, android.graphics.Shader, android.graphics.PorterDuff.Mode);
  }

  public class CornerPathEffect extends android.graphics.PathEffect {
    ctor public CornerPathEffect(float);
  }

  public class DashPathEffect extends android.graphics.PathEffect {
    ctor public DashPathEffect(float[], float);
  }

  public class DiscretePathEffect extends android.graphics.PathEffect {
    ctor public DiscretePathEffect(float, float);
  }

  public class DrawFilter {
    ctor public DrawFilter();
  }

  public class EmbossMaskFilter extends android.graphics.MaskFilter {
    ctor public EmbossMaskFilter(float[], float, float, float);
  }

  public class Interpolator {
    ctor public Interpolator(int);
    ctor public Interpolator(int, int);
    method public final int getKeyFrameCount();
    method public final int getValueCount();
    method public void reset(int);
    method public void reset(int, int);
    method public void setKeyFrame(int, int, float[]);
    method public void setKeyFrame(int, int, float[], float[]);
    method public void setRepeatMirror(float, boolean);
    method public android.graphics.Interpolator.Result timeToValues(float[]);
    method public android.graphics.Interpolator.Result timeToValues(int, float[]);
  }

  public enum Interpolator.Result {
    enum_constant public static final android.graphics.Interpolator.Result FREEZE_END;
    enum_constant public static final android.graphics.Interpolator.Result FREEZE_START;
    enum_constant public static final android.graphics.Interpolator.Result NORMAL;
  }

  public class LayerRasterizer extends android.graphics.Rasterizer {
    ctor public LayerRasterizer();
    method public void addLayer(android.graphics.Paint, float, float);
    method public void addLayer(android.graphics.Paint);
  }

  public class LightingColorFilter extends android.graphics.ColorFilter {
    ctor public LightingColorFilter(int, int);
  }

  public class LinearGradient extends android.graphics.Shader {
    ctor public LinearGradient(float, float, float, float, int[], float[], android.graphics.Shader.TileMode);
    ctor public LinearGradient(float, float, float, float, int, int, android.graphics.Shader.TileMode);
  }

  public class MaskFilter {
    ctor public MaskFilter();
  }

  public class Matrix {
    ctor public Matrix();
    ctor public Matrix(android.graphics.Matrix);
    method public void getValues(float[]);
    method public boolean invert(android.graphics.Matrix);
    method public boolean isIdentity();
    method public void mapPoints(float[], int, float[], int, int);
    method public void mapPoints(float[], float[]);
    method public void mapPoints(float[]);
    method public float mapRadius(float);
    method public boolean mapRect(android.graphics.RectF, android.graphics.RectF);
    method public boolean mapRect(android.graphics.RectF);
    method public void mapVectors(float[], int, float[], int, int);
    method public void mapVectors(float[], float[]);
    method public void mapVectors(float[]);
    method public boolean postConcat(android.graphics.Matrix);
    method public boolean postRotate(float, float, float);
    method public boolean postRotate(float);
    method public boolean postScale(float, float, float, float);
    method public boolean postScale(float, float);
    method public boolean postSkew(float, float, float, float);
    method public boolean postSkew(float, float);
    method public boolean postTranslate(float, float);
    method public boolean preConcat(android.graphics.Matrix);
    method public boolean preRotate(float, float, float);
    method public boolean preRotate(float);
    method public boolean preScale(float, float, float, float);
    method public boolean preScale(float, float);
    method public boolean preSkew(float, float, float, float);
    method public boolean preSkew(float, float);
    method public boolean preTranslate(float, float);
    method public boolean rectStaysRect();
    method public void reset();
    method public void set(android.graphics.Matrix);
    method public boolean setConcat(android.graphics.Matrix, android.graphics.Matrix);
    method public boolean setPolyToPoly(float[], int, float[], int, int);
    method public boolean setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix.ScaleToFit);
    method public void setRotate(float, float, float);
    method public void setRotate(float);
    method public void setScale(float, float, float, float);
    method public void setScale(float, float);
    method public void setSinCos(float, float, float, float);
    method public void setSinCos(float, float);
    method public void setSkew(float, float, float, float);
    method public void setSkew(float, float);
    method public void setTranslate(float, float);
    method public void setValues(float[]);
    method public String toShortString();
    field public static final int MPERSP_0 = 6; // 0x6
    field public static final int MPERSP_1 = 7; // 0x7
    field public static final int MPERSP_2 = 8; // 0x8
    field public static final int MSCALE_X = 0; // 0x0
    field public static final int MSCALE_Y = 4; // 0x4
    field public static final int MSKEW_X = 1; // 0x1
    field public static final int MSKEW_Y = 3; // 0x3
    field public static final int MTRANS_X = 2; // 0x2
    field public static final int MTRANS_Y = 5; // 0x5
  }

  public enum Matrix.ScaleToFit {
    enum_constant public static final android.graphics.Matrix.ScaleToFit CENTER;
    enum_constant public static final android.graphics.Matrix.ScaleToFit END;
    enum_constant public static final android.graphics.Matrix.ScaleToFit FILL;
    enum_constant public static final android.graphics.Matrix.ScaleToFit START;
  }

  public class Movie {
    method public static android.graphics.Movie decodeByteArray(byte[], int, int);
    method public static android.graphics.Movie decodeFile(String);
    method public static android.graphics.Movie decodeStream(java.io.InputStream);
    method public void draw(android.graphics.Canvas, float, float, android.graphics.Paint);
    method public void draw(android.graphics.Canvas, float, float);
    method public int duration();
    method public int height();
    method public boolean isOpaque();
    method public boolean setTime(int);
    method public int width();
  }

  public class NinePatch {
    ctor public NinePatch(android.graphics.Bitmap, byte[], String);
    method public void draw(android.graphics.Canvas, android.graphics.RectF);
    method public void draw(android.graphics.Canvas, android.graphics.Rect);
    method public void draw(android.graphics.Canvas, android.graphics.Rect, android.graphics.Paint);
    method public int getHeight();
    method public final android.graphics.Region getTransparentRegion(android.graphics.Rect);
    method public int getWidth();
    method public final boolean hasAlpha();
    method public static boolean isNinePatchChunk(byte[]);
    method public void setPaint(android.graphics.Paint);
  }

  public class Paint {
    ctor public Paint();
    ctor public Paint(int);
    ctor public Paint(android.graphics.Paint);
    method public float ascent();
    method public int breakText(char[], int, int, float, float[]);
    method public int breakText(CharSequence, int, int, boolean, float, float[]);
    method public int breakText(String, boolean, float, float[]);
    method public void clearShadowLayer();
    method public float descent();
    method public int getAlpha();
    method public int getColor();
    method public android.graphics.ColorFilter getColorFilter();
    method public boolean getFillPath(android.graphics.Path, android.graphics.Path);
    method public int getFlags();
    method public float getFontMetrics(android.graphics.Paint.FontMetrics);
    method public android.graphics.Paint.FontMetrics getFontMetrics();
    method public int getFontMetricsInt(android.graphics.Paint.FontMetricsInt);
    method public android.graphics.Paint.FontMetricsInt getFontMetricsInt();
    method public float getFontSpacing();
    method public android.graphics.MaskFilter getMaskFilter();
    method public android.graphics.PathEffect getPathEffect();
    method public android.graphics.Rasterizer getRasterizer();
    method public android.graphics.Shader getShader();
    method public android.graphics.Paint.Cap getStrokeCap();
    method public android.graphics.Paint.Join getStrokeJoin();
    method public float getStrokeMiter();
    method public float getStrokeWidth();
    method public android.graphics.Paint.Style getStyle();
    method public android.graphics.Paint.Align getTextAlign();
    method public void getTextBounds(String, int, int, android.graphics.Rect);
    method public void getTextBounds(char[], int, int, android.graphics.Rect);
    method public void getTextPath(char[], int, int, float, float, android.graphics.Path);
    method public void getTextPath(String, int, int, float, float, android.graphics.Path);
    method public float getTextScaleX();
    method public float getTextSize();
    method public float getTextSkewX();
    method public int getTextWidths(char[], int, int, float[]);
    method public int getTextWidths(CharSequence, int, int, float[]);
    method public int getTextWidths(String, int, int, float[]);
    method public int getTextWidths(String, float[]);
    method public android.graphics.Typeface getTypeface();
    method public android.graphics.Xfermode getXfermode();
    method public final boolean isAntiAlias();
    method public final boolean isDither();
    method public final boolean isFakeBoldText();
    method public final boolean isFilterBitmap();
    method public final boolean isLinearText();
    method public final boolean isStrikeThruText();
    method public final boolean isSubpixelText();
    method public final boolean isUnderlineText();
    method public float measureText(char[], int, int);
    method public float measureText(String, int, int);
    method public float measureText(String);
    method public float measureText(CharSequence, int, int);
    method public void reset();
    method public void set(android.graphics.Paint);
    method public void setARGB(int, int, int, int);
    method public void setAlpha(int);
    method public void setAntiAlias(boolean);
    method public void setColor(int);
    method public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter);
    method public void setDither(boolean);
    method public void setFakeBoldText(boolean);
    method public void setFilterBitmap(boolean);
    method public void setFlags(int);
    method public void setLinearText(boolean);
    method public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
    method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
    method public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
    method public android.graphics.Shader setShader(android.graphics.Shader);
    method public void setShadowLayer(float, float, float, int);
    method public void setStrikeThruText(boolean);
    method public void setStrokeCap(android.graphics.Paint.Cap);
    method public void setStrokeJoin(android.graphics.Paint.Join);
    method public void setStrokeMiter(float);
    method public void setStrokeWidth(float);
    method public void setStyle(android.graphics.Paint.Style);
    method public void setSubpixelText(boolean);
    method public void setTextAlign(android.graphics.Paint.Align);
    method public void setTextScaleX(float);
    method public void setTextSize(float);
    method public void setTextSkewX(float);
    method public android.graphics.Typeface setTypeface(android.graphics.Typeface);
    method public void setUnderlineText(boolean);
    method public android.graphics.Xfermode setXfermode(android.graphics.Xfermode);
    field public static final int ANTI_ALIAS_FLAG = 1; // 0x1
    field public static final int DEV_KERN_TEXT_FLAG = 256; // 0x100
    field public static final int DITHER_FLAG = 4; // 0x4
    field public static final int FAKE_BOLD_TEXT_FLAG = 32; // 0x20
    field public static final int FILTER_BITMAP_FLAG = 2; // 0x2
    field public static final int LINEAR_TEXT_FLAG = 64; // 0x40
    field public static final int STRIKE_THRU_TEXT_FLAG = 16; // 0x10
    field public static final int SUBPIXEL_TEXT_FLAG = 128; // 0x80
    field public static final int UNDERLINE_TEXT_FLAG = 8; // 0x8
  }

  public enum Paint.Align {
    enum_constant public static final android.graphics.Paint.Align CENTER;
    enum_constant public static final android.graphics.Paint.Align LEFT;
    enum_constant public static final android.graphics.Paint.Align RIGHT;
  }

  public enum Paint.Cap {
    enum_constant public static final android.graphics.Paint.Cap BUTT;
    enum_constant public static final android.graphics.Paint.Cap ROUND;
    enum_constant public static final android.graphics.Paint.Cap SQUARE;
  }

  public static class Paint.FontMetrics {
    ctor public Paint.FontMetrics();
    field public float ascent;
    field public float bottom;
    field public float descent;
    field public float leading;
    field public float top;
  }

  public static class Paint.FontMetricsInt {
    ctor public Paint.FontMetricsInt();
    field public int ascent;
    field public int bottom;
    field public int descent;
    field public int leading;
    field public int top;
  }

  public enum Paint.Join {
    enum_constant public static final android.graphics.Paint.Join BEVEL;
    enum_constant public static final android.graphics.Paint.Join MITER;
    enum_constant public static final android.graphics.Paint.Join ROUND;
  }

  public enum Paint.Style {
    enum_constant public static final android.graphics.Paint.Style FILL;
    enum_constant public static final android.graphics.Paint.Style FILL_AND_STROKE;
    enum_constant public static final android.graphics.Paint.Style STROKE;
  }

  public class PaintFlagsDrawFilter extends android.graphics.DrawFilter {
    ctor public PaintFlagsDrawFilter(int, int);
  }

  public class Path {
    ctor public Path();
    ctor public Path(android.graphics.Path);
    method public void addArc(android.graphics.RectF, float, float);
    method public void addCircle(float, float, float, android.graphics.Path.Direction);
    method public void addOval(android.graphics.RectF, android.graphics.Path.Direction);
    method public void addPath(android.graphics.Path, float, float);
    method public void addPath(android.graphics.Path);
    method public void addPath(android.graphics.Path, android.graphics.Matrix);
    method public void addRect(android.graphics.RectF, android.graphics.Path.Direction);
    method public void addRect(float, float, float, float, android.graphics.Path.Direction);
    method public void addRoundRect(android.graphics.RectF, float, float, android.graphics.Path.Direction);
    method public void addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction);
    method public void arcTo(android.graphics.RectF, float, float, boolean);
    method public void arcTo(android.graphics.RectF, float, float);
    method public void close();
    method public void computeBounds(android.graphics.RectF, boolean);
    method public void cubicTo(float, float, float, float, float, float);
    method public android.graphics.Path.FillType getFillType();
    method public void incReserve(int);
    method public boolean isEmpty();
    method public boolean isInverseFillType();
    method public boolean isRect(android.graphics.RectF);
    method public void lineTo(float, float);
    method public void moveTo(float, float);
    method public void offset(float, float, android.graphics.Path);
    method public void offset(float, float);
    method public void quadTo(float, float, float, float);
    method public void rCubicTo(float, float, float, float, float, float);
    method public void rLineTo(float, float);
    method public void rMoveTo(float, float);
    method public void rQuadTo(float, float, float, float);
    method public void reset();
    method public void rewind();
    method public void set(android.graphics.Path);
    method public void setFillType(android.graphics.Path.FillType);
    method public void setLastPoint(float, float);
    method public void toggleInverseFillType();
    method public void transform(android.graphics.Matrix, android.graphics.Path);
    method public void transform(android.graphics.Matrix);
  }

  public enum Path.Direction {
    enum_constant public static final android.graphics.Path.Direction CCW;
    enum_constant public static final android.graphics.Path.Direction CW;
  }

  public enum Path.FillType {
    enum_constant public static final android.graphics.Path.FillType EVEN_ODD;
    enum_constant public static final android.graphics.Path.FillType INVERSE_EVEN_ODD;
    enum_constant public static final android.graphics.Path.FillType INVERSE_WINDING;
    enum_constant public static final android.graphics.Path.FillType WINDING;
  }

  public class PathDashPathEffect extends android.graphics.PathEffect {
    ctor public PathDashPathEffect(android.graphics.Path, float, float, android.graphics.PathDashPathEffect.Style);
  }

  public enum PathDashPathEffect.Style {
    enum_constant public static final android.graphics.PathDashPathEffect.Style MORPH;
    enum_constant public static final android.graphics.PathDashPathEffect.Style ROTATE;
    enum_constant public static final android.graphics.PathDashPathEffect.Style TRANSLATE;
  }

  public class PathEffect {
    ctor public PathEffect();
  }

  public class PathMeasure {
    ctor public PathMeasure();
    ctor public PathMeasure(android.graphics.Path, boolean);
    method public float getLength();
    method public boolean getMatrix(float, android.graphics.Matrix, int);
    method public boolean getPosTan(float, float[], float[]);
    method public boolean getSegment(float, float, android.graphics.Path, boolean);
    method public boolean isClosed();
    method public boolean nextContour();
    method public void setPath(android.graphics.Path, boolean);
    field public static final int POSITION_MATRIX_FLAG = 1; // 0x1
    field public static final int TANGENT_MATRIX_FLAG = 2; // 0x2
  }

  public class Picture {
    ctor public Picture();
    ctor public Picture(android.graphics.Picture);
    method public android.graphics.Canvas beginRecording(int, int);
    method public static android.graphics.Picture createFromStream(java.io.InputStream);
    method public void draw(android.graphics.Canvas);
    method public void endRecording();
    method public int getHeight();
    method public int getWidth();
    method public void writeToStream(java.io.OutputStream);
  }

  public class PixelFormat {
    ctor public PixelFormat();
    method public static boolean formatHasAlpha(int);
    method public static void getPixelFormatInfo(int, android.graphics.PixelFormat);
    field public static final int A_8 = 8; // 0x8
    field public static final int JPEG = 256; // 0x100
    field public static final int LA_88 = 10; // 0xa
    field public static final int L_8 = 9; // 0x9
    field public static final int OPAQUE = -1; // 0xffffffff
    field public static final int RGBA_4444 = 7; // 0x7
    field public static final int RGBA_5551 = 6; // 0x6
    field public static final int RGBA_8888 = 1; // 0x1
    field public static final int RGBX_8888 = 2; // 0x2
    field public static final int RGB_332 = 11; // 0xb
    field public static final int RGB_565 = 4; // 0x4
    field public static final int RGB_888 = 3; // 0x3
    field public static final int TRANSLUCENT = -3; // 0xfffffffd
    field public static final int TRANSPARENT = -2; // 0xfffffffe
    field public static final int UNKNOWN = 0; // 0x0
    field public static final int YCbCr_420_SP = 17; // 0x11
    field public static final int YCbCr_422_SP = 16; // 0x10
    field public int bitsPerPixel;
    field public int bytesPerPixel;
  }

  public class PixelXorXfermode extends android.graphics.Xfermode {
    ctor public PixelXorXfermode(int);
  }

  public class Point {
    ctor public Point();
    ctor public Point(int, int);
    ctor public Point(android.graphics.Point);
    method public final boolean equals(int, int);
    method public final void negate();
    method public final void offset(int, int);
    method public void set(int, int);
    field public int x;
    field public int y;
  }

  public class PointF {
    ctor public PointF();
    ctor public PointF(float, float);
    ctor public PointF(android.graphics.Point);
    method public final boolean equals(float, float);
    method public final float length();
    method public static float length(float, float);
    method public final void negate();
    method public final void offset(float, float);
    method public final void set(float, float);
    method public final void set(android.graphics.PointF);
    field public float x;
    field public float y;
  }

  public class PorterDuff {
    ctor public PorterDuff();
  }

  public enum PorterDuff.Mode {
    enum_constant public static final android.graphics.PorterDuff.Mode CLEAR;
    enum_constant public static final android.graphics.PorterDuff.Mode DARKEN;
    enum_constant public static final android.graphics.PorterDuff.Mode DST;
    enum_constant public static final android.graphics.PorterDuff.Mode DST_ATOP;
    enum_constant public static final android.graphics.PorterDuff.Mode DST_IN;
    enum_constant public static final android.graphics.PorterDuff.Mode DST_OUT;
    enum_constant public static final android.graphics.PorterDuff.Mode DST_OVER;
    enum_constant public static final android.graphics.PorterDuff.Mode LIGHTEN;
    enum_constant public static final android.graphics.PorterDuff.Mode MULTIPLY;
    enum_constant public static final android.graphics.PorterDuff.Mode SCREEN;
    enum_constant public static final android.graphics.PorterDuff.Mode SRC;
    enum_constant public static final android.graphics.PorterDuff.Mode SRC_ATOP;
    enum_constant public static final android.graphics.PorterDuff.Mode SRC_IN;
    enum_constant public static final android.graphics.PorterDuff.Mode SRC_OUT;
    enum_constant public static final android.graphics.PorterDuff.Mode SRC_OVER;
    enum_constant public static final android.graphics.PorterDuff.Mode XOR;
  }

  public class PorterDuffColorFilter extends android.graphics.ColorFilter {
    ctor public PorterDuffColorFilter(int, android.graphics.PorterDuff.Mode);
  }

  public class PorterDuffXfermode extends android.graphics.Xfermode {
    ctor public PorterDuffXfermode(android.graphics.PorterDuff.Mode);
  }

  public class RadialGradient extends android.graphics.Shader {
    ctor public RadialGradient(float, float, float, int[], float[], android.graphics.Shader.TileMode);
    ctor public RadialGradient(float, float, float, int, int, android.graphics.Shader.TileMode);
  }

  public class Rasterizer {
    ctor public Rasterizer();
  }

  public final class Rect implements android.os.Parcelable {
    ctor public Rect();
    ctor public Rect(int, int, int, int);
    ctor public Rect(android.graphics.Rect);
    method public int centerX();
    method public int centerY();
    method public boolean contains(int, int);
    method public boolean contains(int, int, int, int);
    method public boolean contains(android.graphics.Rect);
    method public int describeContents();
    method public float exactCenterX();
    method public float exactCenterY();
    method public int height();
    method public void inset(int, int);
    method public boolean intersect(int, int, int, int);
    method public boolean intersect(android.graphics.Rect);
    method public boolean intersects(int, int, int, int);
    method public static boolean intersects(android.graphics.Rect, android.graphics.Rect);
    method public boolean isEmpty();
    method public void offset(int, int);
    method public void offsetTo(int, int);
    method public void readFromParcel(android.os.Parcel);
    method public void set(int, int, int, int);
    method public void set(android.graphics.Rect);
    method public void setEmpty();
    method public boolean setIntersect(android.graphics.Rect, android.graphics.Rect);
    method public void sort();
    method public String toShortString();
    method public void union(int, int, int, int);
    method public void union(android.graphics.Rect);
    method public void union(int, int);
    method public int width();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.graphics.Rect> CREATOR;
    field public int bottom;
    field public int left;
    field public int right;
    field public int top;
  }

  public class RectF implements android.os.Parcelable {
    ctor public RectF();
    ctor public RectF(float, float, float, float);
    ctor public RectF(android.graphics.RectF);
    ctor public RectF(android.graphics.Rect);
    method public final float centerX();
    method public final float centerY();
    method public boolean contains(float, float);
    method public boolean contains(float, float, float, float);
    method public boolean contains(android.graphics.RectF);
    method public int describeContents();
    method public final float height();
    method public void inset(float, float);
    method public boolean intersect(float, float, float, float);
    method public boolean intersect(android.graphics.RectF);
    method public boolean intersects(float, float, float, float);
    method public static boolean intersects(android.graphics.RectF, android.graphics.RectF);
    method public final boolean isEmpty();
    method public void offset(float, float);
    method public void offsetTo(float, float);
    method public void readFromParcel(android.os.Parcel);
    method public void round(android.graphics.Rect);
    method public void roundOut(android.graphics.Rect);
    method public void set(float, float, float, float);
    method public void set(android.graphics.RectF);
    method public void set(android.graphics.Rect);
    method public void setEmpty();
    method public boolean setIntersect(android.graphics.RectF, android.graphics.RectF);
    method public void sort();
    method public void union(float, float, float, float);
    method public void union(android.graphics.RectF);
    method public void union(float, float);
    method public final float width();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.graphics.RectF> CREATOR;
    field public float bottom;
    field public float left;
    field public float right;
    field public float top;
  }

  public class Region implements android.os.Parcelable {
    ctor public Region();
    ctor public Region(android.graphics.Region);
    ctor public Region(android.graphics.Rect);
    ctor public Region(int, int, int, int);
    method public boolean contains(int, int);
    method public int describeContents();
    method public android.graphics.Path getBoundaryPath();
    method public boolean getBoundaryPath(android.graphics.Path);
    method public android.graphics.Rect getBounds();
    method public boolean getBounds(android.graphics.Rect);
    method public boolean isComplex();
    method public boolean isEmpty();
    method public boolean isRect();
    method public boolean op(android.graphics.Rect, android.graphics.Region.Op);
    method public boolean op(int, int, int, int, android.graphics.Region.Op);
    method public boolean op(android.graphics.Region, android.graphics.Region.Op);
    method public boolean op(android.graphics.Rect, android.graphics.Region, android.graphics.Region.Op);
    method public boolean op(android.graphics.Region, android.graphics.Region, android.graphics.Region.Op);
    method public boolean quickContains(android.graphics.Rect);
    method public boolean quickContains(int, int, int, int);
    method public boolean quickReject(android.graphics.Rect);
    method public boolean quickReject(int, int, int, int);
    method public boolean quickReject(android.graphics.Region);
    method public boolean set(android.graphics.Region);
    method public boolean set(android.graphics.Rect);
    method public boolean set(int, int, int, int);
    method public void setEmpty();
    method public boolean setPath(android.graphics.Path, android.graphics.Region);
    method public void translate(int, int);
    method public void translate(int, int, android.graphics.Region);
    method public final boolean union(android.graphics.Rect);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.graphics.Region> CREATOR;
  }

  public enum Region.Op {
    enum_constant public static final android.graphics.Region.Op DIFFERENCE;
    enum_constant public static final android.graphics.Region.Op INTERSECT;
    enum_constant public static final android.graphics.Region.Op REPLACE;
    enum_constant public static final android.graphics.Region.Op REVERSE_DIFFERENCE;
    enum_constant public static final android.graphics.Region.Op UNION;
    enum_constant public static final android.graphics.Region.Op XOR;
  }

  public class RegionIterator {
    ctor public RegionIterator(android.graphics.Region);
    method public final boolean next(android.graphics.Rect);
  }

  public class Shader {
    ctor public Shader();
    method public boolean getLocalMatrix(android.graphics.Matrix);
    method public void setLocalMatrix(android.graphics.Matrix);
  }

  public enum Shader.TileMode {
    enum_constant public static final android.graphics.Shader.TileMode CLAMP;
    enum_constant public static final android.graphics.Shader.TileMode MIRROR;
    enum_constant public static final android.graphics.Shader.TileMode REPEAT;
  }

  public class SumPathEffect extends android.graphics.PathEffect {
    ctor public SumPathEffect(android.graphics.PathEffect, android.graphics.PathEffect);
  }

  public class SweepGradient extends android.graphics.Shader {
    ctor public SweepGradient(float, float, int[], float[]);
    ctor public SweepGradient(float, float, int, int);
  }

  public class Typeface {
    method public static android.graphics.Typeface create(String, int);
    method public static android.graphics.Typeface create(android.graphics.Typeface, int);
    method public static android.graphics.Typeface createFromAsset(android.content.res.AssetManager, String);
    method public static android.graphics.Typeface defaultFromStyle(int);
    method public int getStyle();
    method public final boolean isBold();
    method public final boolean isItalic();
    field public static final int BOLD = 1; // 0x1
    field public static final int BOLD_ITALIC = 3; // 0x3
    field public static final android.graphics.Typeface DEFAULT;
    field public static final android.graphics.Typeface DEFAULT_BOLD;
    field public static final int ITALIC = 2; // 0x2
    field public static final android.graphics.Typeface MONOSPACE;
    field public static final int NORMAL = 0; // 0x0
    field public static final android.graphics.Typeface SANS_SERIF;
    field public static final android.graphics.Typeface SERIF;
  }

  public class Xfermode {
    ctor public Xfermode();
  }

}

package android.graphics.drawable {

  public class AnimationDrawable extends android.graphics.drawable.DrawableContainer implements java.lang.Runnable {
    ctor public AnimationDrawable();
    method public void addFrame(android.graphics.drawable.Drawable, int);
    method public int getDuration(int);
    method public android.graphics.drawable.Drawable getFrame(int);
    method public int getNumberOfFrames();
    method public boolean isOneShot();
    method public boolean isRunning();
    method public void run();
    method public void setOneShot(boolean);
    method public void start();
    method public void stop();
  }

  public class BitmapDrawable extends android.graphics.drawable.Drawable {
    ctor public BitmapDrawable();
    ctor public BitmapDrawable(android.graphics.Bitmap);
    ctor public BitmapDrawable(String);
    ctor public BitmapDrawable(java.io.InputStream);
    method public void draw(android.graphics.Canvas);
    method public final android.graphics.Bitmap getBitmap();
    method public final android.graphics.drawable.Drawable.ConstantState getConstantState();
    method public int getGravity();
    method public int getOpacity();
    method public final android.graphics.Paint getPaint();
    method public android.graphics.Shader.TileMode getTileModeX();
    method public android.graphics.Shader.TileMode getTileModeY();
    method public void setAlpha(int);
    method public void setAntiAlias(boolean);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void setGravity(int);
    method public void setTileModeX(android.graphics.Shader.TileMode);
    method public void setTileModeXY(android.graphics.Shader.TileMode, android.graphics.Shader.TileMode);
    method public final void setTileModeY(android.graphics.Shader.TileMode);
  }

  public class ClipDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public ClipDrawable(android.graphics.drawable.Drawable, int, int);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
    field public static final int HORIZONTAL = 1; // 0x1
    field public static final int VERTICAL = 2; // 0x2
  }

  public class ColorDrawable extends android.graphics.drawable.Drawable {
    ctor public ColorDrawable();
    ctor public ColorDrawable(int);
    method public void draw(android.graphics.Canvas);
    method public int getAlpha();
    method public int getOpacity();
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
  }

  public abstract class Drawable {
    ctor public Drawable();
    method public void clearColorFilter();
    method public final void copyBounds(android.graphics.Rect);
    method public final android.graphics.Rect copyBounds();
    method public static android.graphics.drawable.Drawable createFromPath(String);
    method public static android.graphics.drawable.Drawable createFromStream(java.io.InputStream, String);
    method public static android.graphics.drawable.Drawable createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static android.graphics.drawable.Drawable createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public abstract void draw(android.graphics.Canvas);
    method public final android.graphics.Rect getBounds();
    method public int getChangingConfigurations();
    method public android.graphics.drawable.Drawable.ConstantState getConstantState();
    method public android.graphics.drawable.Drawable getCurrent();
    method public int getIntrinsicHeight();
    method public int getIntrinsicWidth();
    method public final int getLevel();
    method public int getMinimumHeight();
    method public int getMinimumWidth();
    method public abstract int getOpacity();
    method public boolean getPadding(android.graphics.Rect);
    method public int[] getState();
    method public android.graphics.Region getTransparentRegion();
    method public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public void invalidateSelf();
    method public boolean isStateful();
    method public final boolean isVisible();
    method public android.graphics.drawable.Drawable mutate();
    method protected void onBoundsChange(android.graphics.Rect);
    method protected boolean onLevelChange(int);
    method protected boolean onStateChange(int[]);
    method public static int resolveOpacity(int, int);
    method public void scheduleSelf(Runnable, long);
    method public abstract void setAlpha(int);
    method public void setBounds(int, int, int, int);
    method public void setBounds(android.graphics.Rect);
    method public final void setCallback(android.graphics.drawable.Drawable.Callback);
    method public void setChangingConfigurations(int);
    method public abstract void setColorFilter(android.graphics.ColorFilter);
    method public void setColorFilter(int, android.graphics.PorterDuff.Mode);
    method public void setDither(boolean);
    method public void setFilterBitmap(boolean);
    method public final boolean setLevel(int);
    method public boolean setState(int[]);
    method public boolean setVisible(boolean, boolean);
    method public void unscheduleSelf(Runnable);
  }

  public static interface Drawable.Callback {
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public abstract static class Drawable.ConstantState {
    ctor public Drawable.ConstantState();
    method public abstract int getChangingConfigurations();
    method public abstract android.graphics.drawable.Drawable newDrawable();
  }

  public class DrawableContainer extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public DrawableContainer();
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public boolean selectDrawable(int);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method protected void setConstantState(android.graphics.drawable.DrawableContainer.DrawableContainerState);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public abstract static class DrawableContainer.DrawableContainerState extends android.graphics.drawable.Drawable.ConstantState {
    method public final int addChild(android.graphics.drawable.Drawable);
    method public boolean canConstantState();
    method public int getChangingConfigurations();
    method public final int getChildCount();
    method public final android.graphics.drawable.Drawable[] getChildren();
    method public final int getConstantHeight();
    method public final int getConstantMinimumHeight();
    method public final int getConstantMinimumWidth();
    method public final android.graphics.Rect getConstantPadding();
    method public final int getConstantWidth();
    method public final int getOpacity();
    method public void growArray(int, int);
    method public final boolean isConstantSize();
    method public final boolean isStateful();
    method public final void setConstantSize(boolean);
    method public final void setVariablePadding(boolean);
  }

  public class GradientDrawable extends android.graphics.drawable.Drawable {
    ctor public GradientDrawable();
    ctor public GradientDrawable(android.graphics.drawable.GradientDrawable.Orientation, int[]);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public void setAlpha(int);
    method public void setColor(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void setCornerRadii(float[]);
    method public void setCornerRadius(float);
    method public void setGradientCenter(float, float);
    method public void setGradientRadius(float);
    method public void setGradientType(int);
    method public void setShape(int);
    method public void setSize(int, int);
    method public void setStroke(int, int);
    method public void setStroke(int, int, float, float);
    method public void setUseLevel(boolean);
    field public static final int LINE = 2; // 0x2
    field public static final int LINEAR_GRADIENT = 0; // 0x0
    field public static final int OVAL = 1; // 0x1
    field public static final int RADIAL_GRADIENT = 1; // 0x1
    field public static final int RECTANGLE = 0; // 0x0
    field public static final int RING = 3; // 0x3
    field public static final int SWEEP_GRADIENT = 2; // 0x2
  }

  public enum GradientDrawable.Orientation {
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BL_TR;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BOTTOM_TOP;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation BR_TL;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation LEFT_RIGHT;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation RIGHT_LEFT;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation TL_BR;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation TOP_BOTTOM;
    enum_constant public static final android.graphics.drawable.GradientDrawable.Orientation TR_BL;
  }

  public class InsetDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public InsetDrawable(android.graphics.drawable.Drawable, int);
    ctor public InsetDrawable(android.graphics.drawable.Drawable, int, int, int, int);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public class LayerDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public LayerDrawable(android.graphics.drawable.Drawable[]);
    method public void draw(android.graphics.Canvas);
    method public android.graphics.drawable.Drawable findDrawableByLayerId(int);
    method public android.graphics.drawable.Drawable getDrawable(int);
    method public int getId(int);
    method public int getNumberOfLayers();
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public boolean setDrawableByLayerId(int, android.graphics.drawable.Drawable);
    method public void setId(int, int);
    method public void setLayerInset(int, int, int, int, int);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public class LevelListDrawable extends android.graphics.drawable.DrawableContainer {
    ctor public LevelListDrawable();
    method public void addLevel(int, int, android.graphics.drawable.Drawable);
  }

  public class NinePatchDrawable extends android.graphics.drawable.Drawable {
    ctor public NinePatchDrawable(android.graphics.Bitmap, byte[], android.graphics.Rect, String);
    ctor public NinePatchDrawable(android.graphics.NinePatch);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public android.graphics.Paint getPaint();
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
  }

  public class PaintDrawable extends android.graphics.drawable.ShapeDrawable {
    ctor public PaintDrawable();
    ctor public PaintDrawable(int);
    method public void setCornerRadii(float[]);
    method public void setCornerRadius(float);
  }

  public class PictureDrawable extends android.graphics.drawable.Drawable {
    ctor public PictureDrawable(android.graphics.Picture);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public android.graphics.Picture getPicture();
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void setPicture(android.graphics.Picture);
  }

  public class RotateDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public RotateDrawable();
    method public void draw(android.graphics.Canvas);
    method public android.graphics.drawable.Drawable getDrawable();
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public class ScaleDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
    ctor public ScaleDrawable(android.graphics.drawable.Drawable, int, float, float);
    method public void draw(android.graphics.Canvas);
    method public android.graphics.drawable.Drawable getDrawable();
    method public int getOpacity();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
  }

  public class ShapeDrawable extends android.graphics.drawable.Drawable {
    ctor public ShapeDrawable();
    ctor public ShapeDrawable(android.graphics.drawable.shapes.Shape);
    method public void draw(android.graphics.Canvas);
    method public int getOpacity();
    method public android.graphics.Paint getPaint();
    method public android.graphics.drawable.ShapeDrawable.ShaderFactory getShaderFactory();
    method public android.graphics.drawable.shapes.Shape getShape();
    method protected boolean inflateTag(String, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet);
    method protected void onDraw(android.graphics.drawable.shapes.Shape, android.graphics.Canvas, android.graphics.Paint);
    method public void setAlpha(int);
    method public void setColorFilter(android.graphics.ColorFilter);
    method public void setIntrinsicHeight(int);
    method public void setIntrinsicWidth(int);
    method public void setPadding(int, int, int, int);
    method public void setPadding(android.graphics.Rect);
    method public void setShaderFactory(android.graphics.drawable.ShapeDrawable.ShaderFactory);
    method public void setShape(android.graphics.drawable.shapes.Shape);
  }

  public abstract static class ShapeDrawable.ShaderFactory {
    ctor public ShapeDrawable.ShaderFactory();
    method public abstract android.graphics.Shader resize(int, int);
  }

  public class StateListDrawable extends android.graphics.drawable.DrawableContainer {
    ctor public StateListDrawable();
    method public void addState(int[], android.graphics.drawable.Drawable);
  }

  public class TransitionDrawable extends android.graphics.drawable.LayerDrawable implements android.graphics.drawable.Drawable.Callback {
    ctor public TransitionDrawable(android.graphics.drawable.Drawable[]);
    method public boolean isCrossFadeEnabled();
    method public void resetTransition();
    method public void reverseTransition(int);
    method public void setCrossFadeEnabled(boolean);
    method public void startTransition(int);
  }

}

package android.graphics.drawable.shapes {

  public class ArcShape extends android.graphics.drawable.shapes.RectShape {
    ctor public ArcShape(float, float);
  }

  public class OvalShape extends android.graphics.drawable.shapes.RectShape {
    ctor public OvalShape();
  }

  public class PathShape extends android.graphics.drawable.shapes.Shape {
    ctor public PathShape(android.graphics.Path, float, float);
    method public android.graphics.drawable.shapes.PathShape clone() throws java.lang.CloneNotSupportedException;
    method public void draw(android.graphics.Canvas, android.graphics.Paint);
  }

  public class RectShape extends android.graphics.drawable.shapes.Shape {
    ctor public RectShape();
    method public android.graphics.drawable.shapes.RectShape clone() throws java.lang.CloneNotSupportedException;
    method public void draw(android.graphics.Canvas, android.graphics.Paint);
    method protected final android.graphics.RectF rect();
  }

  public class RoundRectShape extends android.graphics.drawable.shapes.RectShape {
    ctor public RoundRectShape(float[], android.graphics.RectF, float[]);
    method public android.graphics.drawable.shapes.RoundRectShape clone() throws java.lang.CloneNotSupportedException;
  }

  public abstract class Shape implements java.lang.Cloneable {
    ctor public Shape();
    method public android.graphics.drawable.shapes.Shape clone() throws java.lang.CloneNotSupportedException;
    method public abstract void draw(android.graphics.Canvas, android.graphics.Paint);
    method public final float getHeight();
    method public final float getWidth();
    method public boolean hasAlpha();
    method protected void onResize(float, float);
    method public final void resize(float, float);
  }

}

package android.hardware {

  public class Camera {
    method public final void autoFocus(android.hardware.Camera.AutoFocusCallback);
    method protected void finalize();
    method public android.hardware.Camera.Parameters getParameters();
    method public static android.hardware.Camera open();
    method public final void release();
    method public final void setErrorCallback(android.hardware.Camera.ErrorCallback);
    method public final void setOneShotPreviewCallback(android.hardware.Camera.PreviewCallback);
    method public void setParameters(android.hardware.Camera.Parameters);
    method public final void setPreviewCallback(android.hardware.Camera.PreviewCallback);
    method public final void setPreviewDisplay(android.view.SurfaceHolder) throws java.io.IOException;
    method public final void startPreview();
    method public final void stopPreview();
    method public final void takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback);
    field public static final int CAMERA_ERROR_SERVER_DIED = 100; // 0x64
    field public static final int CAMERA_ERROR_UNKNOWN = 1; // 0x1
  }

  public static interface Camera.AutoFocusCallback {
    method public void onAutoFocus(boolean, android.hardware.Camera);
  }

  public static interface Camera.ErrorCallback {
    method public void onError(int, android.hardware.Camera);
  }

  public class Camera.Parameters {
    method public String flatten();
    method public String get(String);
    method public int getInt(String);
    method public int getPictureFormat();
    method public android.hardware.Camera.Size getPictureSize();
    method public int getPreviewFormat();
    method public int getPreviewFrameRate();
    method public android.hardware.Camera.Size getPreviewSize();
    method public void remove(String);
    method public void set(String, String);
    method public void set(String, int);
    method public void setPictureFormat(int);
    method public void setPictureSize(int, int);
    method public void setPreviewFormat(int);
    method public void setPreviewFrameRate(int);
    method public void setPreviewSize(int, int);
    method public void unflatten(String);
  }

  public static interface Camera.PictureCallback {
    method public void onPictureTaken(byte[], android.hardware.Camera);
  }

  public static interface Camera.PreviewCallback {
    method public void onPreviewFrame(byte[], android.hardware.Camera);
  }

  public static interface Camera.ShutterCallback {
    method public void onShutter();
  }

  public class Camera.Size {
    ctor public Camera.Size(int, int);
    field public int height;
    field public int width;
  }

  public class GeomagneticField {
    ctor public GeomagneticField(float, float, float, long);
    method public float getDeclination();
    method public float getFieldStrength();
    method public float getHorizontalStrength();
    method public float getInclination();
    method public float getX();
    method public float getY();
    method public float getZ();
  }

  public class Sensor {
    method public float getMaximumRange();
    method public String getName();
    method public float getPower();
    method public float getResolution();
    method public int getType();
    method public String getVendor();
    method public int getVersion();
    field public static final int TYPE_ACCELEROMETER = 1; // 0x1
    field public static final int TYPE_ALL = -1; // 0xffffffff
    field public static final int TYPE_GYROSCOPE = 4; // 0x4
    field public static final int TYPE_LIGHT = 5; // 0x5
    field public static final int TYPE_MAGNETIC_FIELD = 2; // 0x2
    field public static final int TYPE_ORIENTATION = 3; // 0x3
    field public static final int TYPE_PRESSURE = 6; // 0x6
    field public static final int TYPE_PROXIMITY = 8; // 0x8
    field public static final int TYPE_TEMPERATURE = 7; // 0x7
  }

  public class SensorEvent {
    field public int accuracy;
    field public android.hardware.Sensor sensor;
    field public long timestamp;
    field public final float[] values;
  }

  public interface SensorEventListener {
    method public void onAccuracyChanged(android.hardware.Sensor, int);
    method public void onSensorChanged(android.hardware.SensorEvent);
  }

  @Deprecated public interface SensorListener {
    method public void onAccuracyChanged(int, int);
    method public void onSensorChanged(int, float[]);
  }

  public class SensorManager {
    method public android.hardware.Sensor getDefaultSensor(int);
    method public static float getInclination(float[]);
    method public static float[] getOrientation(float[], float[]);
    method public static boolean getRotationMatrix(float[], float[], float[], float[]);
    method public java.util.List<android.hardware.Sensor> getSensorList(int);
    method public int getSensors();
    method public boolean registerListener(android.hardware.SensorListener, int);
    method public boolean registerListener(android.hardware.SensorListener, int, int);
    method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int);
    method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, android.os.Handler);
    method public static boolean remapCoordinateSystem(float[], int, int, float[]);
    method public void unregisterListener(android.hardware.SensorListener, int);
    method public void unregisterListener(android.hardware.SensorListener);
    method public void unregisterListener(android.hardware.SensorEventListener, android.hardware.Sensor);
    method public void unregisterListener(android.hardware.SensorEventListener);
    field public static final int AXIS_MINUS_X = 129; // 0x81
    field public static final int AXIS_MINUS_Y = 130; // 0x82
    field public static final int AXIS_MINUS_Z = 131; // 0x83
    field public static final int AXIS_X = 1; // 0x1
    field public static final int AXIS_Y = 2; // 0x2
    field public static final int AXIS_Z = 3; // 0x3
    field public static final int DATA_X = 0; // 0x0
    field public static final int DATA_Y = 1; // 0x1
    field public static final int DATA_Z = 2; // 0x2
    field public static final float GRAVITY_DEATH_STAR_I = 3.5303614E-7f;
    field public static final float GRAVITY_EARTH = 9.80665f;
    field public static final float GRAVITY_JUPITER = 23.12f;
    field public static final float GRAVITY_MARS = 3.71f;
    field public static final float GRAVITY_MERCURY = 3.7f;
    field public static final float GRAVITY_MOON = 1.6f;
    field public static final float GRAVITY_NEPTUNE = 11.0f;
    field public static final float GRAVITY_PLUTO = 0.6f;
    field public static final float GRAVITY_SATURN = 8.96f;
    field public static final float GRAVITY_SUN = 275.0f;
    field public static final float GRAVITY_THE_ISLAND = 4.815162f;
    field public static final float GRAVITY_URANUS = 8.69f;
    field public static final float GRAVITY_VENUS = 8.87f;
    field public static final float LIGHT_CLOUDY = 100.0f;
    field public static final float LIGHT_FULLMOON = 0.25f;
    field public static final float LIGHT_NO_MOON = 0.001f;
    field public static final float LIGHT_OVERCAST = 10000.0f;
    field public static final float LIGHT_SHADE = 20000.0f;
    field public static final float LIGHT_SUNLIGHT = 110000.0f;
    field public static final float LIGHT_SUNLIGHT_MAX = 120000.0f;
    field public static final float LIGHT_SUNRISE = 400.0f;
    field public static final float MAGNETIC_FIELD_EARTH_MAX = 60.0f;
    field public static final float MAGNETIC_FIELD_EARTH_MIN = 30.0f;
    field public static final int RAW_DATA_INDEX = 3; // 0x3
    field public static final int RAW_DATA_X = 3; // 0x3
    field public static final int RAW_DATA_Y = 4; // 0x4
    field public static final int RAW_DATA_Z = 5; // 0x5
    field public static final int SENSOR_ACCELEROMETER = 2; // 0x2
    field public static final int SENSOR_ALL = 127; // 0x7f
    field public static final int SENSOR_DELAY_FASTEST = 0; // 0x0
    field public static final int SENSOR_DELAY_GAME = 1; // 0x1
    field public static final int SENSOR_DELAY_NORMAL = 3; // 0x3
    field public static final int SENSOR_DELAY_UI = 2; // 0x2
    field public static final int SENSOR_LIGHT = 16; // 0x10
    field public static final int SENSOR_MAGNETIC_FIELD = 8; // 0x8
    field public static final int SENSOR_MAX = 64; // 0x40
    field public static final int SENSOR_MIN = 1; // 0x1
    field public static final int SENSOR_ORIENTATION = 1; // 0x1
    field public static final int SENSOR_ORIENTATION_RAW = 128; // 0x80
    field public static final int SENSOR_PROXIMITY = 32; // 0x20
    field public static final int SENSOR_STATUS_ACCURACY_HIGH = 3; // 0x3
    field public static final int SENSOR_STATUS_ACCURACY_LOW = 1; // 0x1
    field public static final int SENSOR_STATUS_ACCURACY_MEDIUM = 2; // 0x2
    field public static final int SENSOR_STATUS_UNRELIABLE = 0; // 0x0
    field public static final int SENSOR_TEMPERATURE = 4; // 0x4
    field public static final int SENSOR_TRICORDER = 64; // 0x40
    field public static final float STANDARD_GRAVITY = 9.80665f;
  }

}

package android.inputmethodservice {

  public abstract class AbstractInputMethodService extends android.app.Service implements android.view.KeyEvent.Callback {
    ctor public AbstractInputMethodService();
    method public final android.os.IBinder onBind(android.content.Intent);
    method public abstract android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl onCreateInputMethodInterface();
    method public abstract android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface();
    method public boolean onTrackballEvent(android.view.MotionEvent);
  }

  public abstract class AbstractInputMethodService.AbstractInputMethodImpl implements android.view.inputmethod.InputMethod {
    ctor public AbstractInputMethodService.AbstractInputMethodImpl();
    method public void createSession(android.view.inputmethod.InputMethod.SessionCallback);
    method public void revokeSession(android.view.inputmethod.InputMethodSession);
    method public void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
  }

  public abstract class AbstractInputMethodService.AbstractInputMethodSessionImpl implements android.view.inputmethod.InputMethodSession {
    ctor public AbstractInputMethodService.AbstractInputMethodSessionImpl();
    method public void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
    method public void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
    method public boolean isEnabled();
    method public boolean isRevoked();
    method public void revokeSelf();
    method public void setEnabled(boolean);
  }

  public class ExtractEditText extends android.widget.EditText {
    ctor public ExtractEditText(android.content.Context);
    ctor public ExtractEditText(android.content.Context, android.util.AttributeSet);
    ctor public ExtractEditText(android.content.Context, android.util.AttributeSet, int);
    method public void finishInternalChanges();
    method public boolean hasVerticalScrollBar();
    method public void startInternalChanges();
  }

  public class InputMethodService extends android.inputmethodservice.AbstractInputMethodService {
    ctor public InputMethodService();
    method public int getCandidatesHiddenVisibility();
    method public android.view.inputmethod.InputBinding getCurrentInputBinding();
    method public android.view.inputmethod.InputConnection getCurrentInputConnection();
    method public android.view.inputmethod.EditorInfo getCurrentInputEditorInfo();
    method public boolean getCurrentInputStarted();
    method public android.view.LayoutInflater getLayoutInflater();
    method public int getMaxWidth();
    method public CharSequence getTextForImeAction(int);
    method public android.app.Dialog getWindow();
    method public void hideStatusIcon();
    method public void hideWindow();
    method public boolean isExtractViewShown();
    method public boolean isFullscreenMode();
    method public boolean isInputViewShown();
    method public boolean isShowInputRequested();
    method public void onAppPrivateCommand(String, android.os.Bundle);
    method public void onBindInput();
    method public void onComputeInsets(android.inputmethodservice.InputMethodService.Insets);
    method public void onConfigureWindow(android.view.Window, boolean, boolean);
    method public android.view.View onCreateCandidatesView();
    method public android.view.View onCreateExtractTextView();
    method public android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl onCreateInputMethodInterface();
    method public android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface();
    method public android.view.View onCreateInputView();
    method public void onDisplayCompletions(android.view.inputmethod.CompletionInfo[]);
    method public boolean onEvaluateFullscreenMode();
    method public boolean onEvaluateInputViewShown();
    method public boolean onExtractTextContextMenuItem(int);
    method public void onExtractedCursorMovement(int, int);
    method public void onExtractedSelectionChanged(int, int);
    method public void onExtractedTextClicked();
    method public void onExtractingInputChanged(android.view.inputmethod.EditorInfo);
    method public void onFinishCandidatesView(boolean);
    method public void onFinishInput();
    method public void onFinishInputView(boolean);
    method public void onInitializeInterface();
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
    method public boolean onShowInputRequested(int, boolean);
    method public void onStartCandidatesView(android.view.inputmethod.EditorInfo, boolean);
    method public void onStartInput(android.view.inputmethod.EditorInfo, boolean);
    method public void onStartInputView(android.view.inputmethod.EditorInfo, boolean);
    method public void onUnbindInput();
    method public void onUpdateCursor(android.graphics.Rect);
    method public void onUpdateExtractedText(int, android.view.inputmethod.ExtractedText);
    method public void onUpdateExtractingViews(android.view.inputmethod.EditorInfo);
    method public void onUpdateExtractingVisibility(android.view.inputmethod.EditorInfo);
    method public void onUpdateSelection(int, int, int, int, int, int);
    method public void onWindowHidden();
    method public void onWindowShown();
    method public void requestHideSelf(int);
    method public boolean sendDefaultEditorAction(boolean);
    method public void sendDownUpKeyEvents(int);
    method public void sendKeyChar(char);
    method public void setCandidatesView(android.view.View);
    method public void setCandidatesViewShown(boolean);
    method public void setExtractView(android.view.View);
    method public void setExtractViewShown(boolean);
    method public void setInputView(android.view.View);
    method public void showStatusIcon(int);
    method public void showWindow(boolean);
    method public void switchInputMethod(String);
    method public void updateFullscreenMode();
    method public void updateInputViewShown();
  }

  public class InputMethodService.InputMethodImpl extends android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl {
    ctor public InputMethodService.InputMethodImpl();
    method public void attachToken(android.os.IBinder);
    method public void bindInput(android.view.inputmethod.InputBinding);
    method public void hideSoftInput(int, android.os.ResultReceiver);
    method public void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
    method public void showSoftInput(int, android.os.ResultReceiver);
    method public void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
    method public void unbindInput();
  }

  public class InputMethodService.InputMethodSessionImpl extends android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl {
    ctor public InputMethodService.InputMethodSessionImpl();
    method public void appPrivateCommand(String, android.os.Bundle);
    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
    method public void finishInput();
    method public void toggleSoftInput(int, int);
    method public void updateCursor(android.graphics.Rect);
    method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
    method public void updateSelection(int, int, int, int, int, int);
  }

  public static final class InputMethodService.Insets {
    ctor public InputMethodService.Insets();
    field public static final int TOUCHABLE_INSETS_CONTENT = 1; // 0x1
    field public static final int TOUCHABLE_INSETS_FRAME = 0; // 0x0
    field public static final int TOUCHABLE_INSETS_VISIBLE = 2; // 0x2
    field public int contentTopInsets;
    field public int touchableInsets;
    field public int visibleTopInsets;
  }

  public class Keyboard {
    ctor public Keyboard(android.content.Context, int);
    ctor public Keyboard(android.content.Context, int, int);
    ctor public Keyboard(android.content.Context, int, CharSequence, int, int);
    method protected android.inputmethodservice.Keyboard.Key createKeyFromXml(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
    method protected android.inputmethodservice.Keyboard.Row createRowFromXml(android.content.res.Resources, android.content.res.XmlResourceParser);
    method public int getHeight();
    method protected int getHorizontalGap();
    method protected int getKeyHeight();
    method protected int getKeyWidth();
    method public java.util.List<android.inputmethodservice.Keyboard.Key> getKeys();
    method public int getMinWidth();
    method public java.util.List<android.inputmethodservice.Keyboard.Key> getModifierKeys();
    method public int[] getNearestKeys(int, int);
    method public int getShiftKeyIndex();
    method protected int getVerticalGap();
    method public boolean isShifted();
    method protected void setHorizontalGap(int);
    method protected void setKeyHeight(int);
    method protected void setKeyWidth(int);
    method public boolean setShifted(boolean);
    method protected void setVerticalGap(int);
    field public static final int EDGE_BOTTOM = 8; // 0x8
    field public static final int EDGE_LEFT = 1; // 0x1
    field public static final int EDGE_RIGHT = 2; // 0x2
    field public static final int EDGE_TOP = 4; // 0x4
    field public static final int KEYCODE_ALT = -6; // 0xfffffffa
    field public static final int KEYCODE_CANCEL = -3; // 0xfffffffd
    field public static final int KEYCODE_DELETE = -5; // 0xfffffffb
    field public static final int KEYCODE_DONE = -4; // 0xfffffffc
    field public static final int KEYCODE_MODE_CHANGE = -2; // 0xfffffffe
    field public static final int KEYCODE_SHIFT = -1; // 0xffffffff
  }

  public static class Keyboard.Key {
    ctor public Keyboard.Key(android.inputmethodservice.Keyboard.Row);
    ctor public Keyboard.Key(android.content.res.Resources, android.inputmethodservice.Keyboard.Row, int, int, android.content.res.XmlResourceParser);
    method public int[] getCurrentDrawableState();
    method public boolean isInside(int, int);
    method public void onPressed();
    method public void onReleased(boolean);
    method public int squaredDistanceFrom(int, int);
    field public int[] codes;
    field public int edgeFlags;
    field public int gap;
    field public int height;
    field public android.graphics.drawable.Drawable icon;
    field public android.graphics.drawable.Drawable iconPreview;
    field public CharSequence label;
    field public boolean modifier;
    field public boolean on;
    field public CharSequence popupCharacters;
    field public int popupResId;
    field public boolean pressed;
    field public boolean repeatable;
    field public boolean sticky;
    field public CharSequence text;
    field public int width;
    field public int x;
    field public int y;
  }

  public static class Keyboard.Row {
    ctor public Keyboard.Row(android.inputmethodservice.Keyboard);
    ctor public Keyboard.Row(android.content.res.Resources, android.inputmethodservice.Keyboard, android.content.res.XmlResourceParser);
    field public int defaultHeight;
    field public int defaultHorizontalGap;
    field public int defaultWidth;
    field public int mode;
    field public int rowEdgeFlags;
    field public int verticalGap;
  }

  public class KeyboardView extends android.view.View implements android.view.View.OnClickListener {
    ctor public KeyboardView(android.content.Context, android.util.AttributeSet);
    ctor public KeyboardView(android.content.Context, android.util.AttributeSet, int);
    method public void closing();
    method public android.inputmethodservice.Keyboard getKeyboard();
    method protected android.inputmethodservice.KeyboardView.OnKeyboardActionListener getOnKeyboardActionListener();
    method public boolean handleBack();
    method public boolean isPreviewEnabled();
    method public boolean isProximityCorrectionEnabled();
    method public boolean isShifted();
    method public void onClick(android.view.View);
    method public void onDetachedFromWindow();
    method public void onDraw(android.graphics.Canvas);
    method protected boolean onLongPress(android.inputmethodservice.Keyboard.Key);
    method public void onMeasure(int, int);
    method public void onSizeChanged(int, int, int, int);
    method public void setKeyboard(android.inputmethodservice.Keyboard);
    method public void setOnKeyboardActionListener(android.inputmethodservice.KeyboardView.OnKeyboardActionListener);
    method public void setPopupOffset(int, int);
    method public void setPopupParent(android.view.View);
    method public void setPreviewEnabled(boolean);
    method public void setProximityCorrectionEnabled(boolean);
    method public boolean setShifted(boolean);
    method public void setVerticalCorrection(int);
    method protected void swipeDown();
    method protected void swipeLeft();
    method protected void swipeRight();
    method protected void swipeUp();
  }

  public static interface KeyboardView.OnKeyboardActionListener {
    method public void onKey(int, int[]);
    method public void onPress(int);
    method public void onRelease(int);
    method public void onText(CharSequence);
    method public void swipeDown();
    method public void swipeLeft();
    method public void swipeRight();
    method public void swipeUp();
  }

}

package android.location {

  public class Address implements android.os.Parcelable {
    ctor public Address(java.util.Locale);
    method public void clearLatitude();
    method public void clearLongitude();
    method public int describeContents();
    method public String getAddressLine(int);
    method public String getAdminArea();
    method public String getCountryCode();
    method public String getCountryName();
    method public android.os.Bundle getExtras();
    method public String getFeatureName();
    method public double getLatitude();
    method public java.util.Locale getLocale();
    method public String getLocality();
    method public double getLongitude();
    method public int getMaxAddressLineIndex();
    method public String getPhone();
    method public String getPostalCode();
    method public String getSubAdminArea();
    method public String getThoroughfare();
    method public String getUrl();
    method public boolean hasLatitude();
    method public boolean hasLongitude();
    method public void setAddressLine(int, String);
    method public void setAdminArea(String);
    method public void setCountryCode(String);
    method public void setCountryName(String);
    method public void setExtras(android.os.Bundle);
    method public void setFeatureName(String);
    method public void setLatitude(double);
    method public void setLocality(String);
    method public void setLongitude(double);
    method public void setPhone(String);
    method public void setPostalCode(String);
    method public void setSubAdminArea(String);
    method public void setThoroughfare(String);
    method public void setUrl(String);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.location.Address> CREATOR;
  }

  public class Criteria implements android.os.Parcelable {
    ctor public Criteria();
    ctor public Criteria(android.location.Criteria);
    method public int describeContents();
    method public int getAccuracy();
    method public int getPowerRequirement();
    method public boolean isAltitudeRequired();
    method public boolean isBearingRequired();
    method public boolean isCostAllowed();
    method public boolean isSpeedRequired();
    method public void setAccuracy(int);
    method public void setAltitudeRequired(boolean);
    method public void setBearingRequired(boolean);
    method public void setCostAllowed(boolean);
    method public void setPowerRequirement(int);
    method public void setSpeedRequired(boolean);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int ACCURACY_COARSE = 2; // 0x2
    field public static final int ACCURACY_FINE = 1; // 0x1
    field public static final android.os.Parcelable.Creator<android.location.Criteria> CREATOR;
    field public static final int NO_REQUIREMENT = 0; // 0x0
    field public static final int POWER_HIGH = 3; // 0x3
    field public static final int POWER_LOW = 1; // 0x1
    field public static final int POWER_MEDIUM = 2; // 0x2
  }

  public final class Geocoder {
    ctor public Geocoder(android.content.Context, java.util.Locale);
    ctor public Geocoder(android.content.Context);
    method public java.util.List<android.location.Address> getFromLocation(double, double, int) throws java.io.IOException;
    method public java.util.List<android.location.Address> getFromLocationName(String, int) throws java.io.IOException;
    method public java.util.List<android.location.Address> getFromLocationName(String, int, double, double, double, double) throws java.io.IOException;
  }

  public final class GpsSatellite {
    method public float getAzimuth();
    method public float getElevation();
    method public int getPrn();
    method public float getSnr();
    method public boolean hasAlmanac();
    method public boolean hasEphemeris();
    method public boolean usedInFix();
  }

  public final class GpsStatus {
    method public int getMaxSatellites();
    method public Iterable<android.location.GpsSatellite> getSatellites();
    method public int getTimeToFirstFix();
    field public static final int GPS_EVENT_FIRST_FIX = 3; // 0x3
    field public static final int GPS_EVENT_SATELLITE_STATUS = 4; // 0x4
    field public static final int GPS_EVENT_STARTED = 1; // 0x1
    field public static final int GPS_EVENT_STOPPED = 2; // 0x2
  }

  public static interface GpsStatus.Listener {
    method public void onGpsStatusChanged(int);
  }

  public class Location implements android.os.Parcelable {
    ctor public Location(String);
    ctor public Location(android.location.Location);
    method public float bearingTo(android.location.Location);
    method public static String convert(double, int);
    method public static double convert(String);
    method public int describeContents();
    method public static void distanceBetween(double, double, double, double, float[]);
    method public float distanceTo(android.location.Location);
    method public void dump(android.util.Printer, String);
    method public float getAccuracy();
    method public double getAltitude();
    method public float getBearing();
    method public android.os.Bundle getExtras();
    method public double getLatitude();
    method public double getLongitude();
    method public String getProvider();
    method public float getSpeed();
    method public long getTime();
    method public boolean hasAccuracy();
    method public boolean hasAltitude();
    method public boolean hasBearing();
    method public boolean hasSpeed();
    method public void removeAccuracy();
    method public void removeAltitude();
    method public void removeBearing();
    method public void removeSpeed();
    method public void reset();
    method public void set(android.location.Location);
    method public void setAccuracy(float);
    method public void setAltitude(double);
    method public void setBearing(float);
    method public void setExtras(android.os.Bundle);
    method public void setLatitude(double);
    method public void setLongitude(double);
    method public void setProvider(String);
    method public void setSpeed(float);
    method public void setTime(long);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.location.Location> CREATOR;
    field public static final int FORMAT_DEGREES = 0; // 0x0
    field public static final int FORMAT_MINUTES = 1; // 0x1
    field public static final int FORMAT_SECONDS = 2; // 0x2
  }

  public interface LocationListener {
    method public void onLocationChanged(android.location.Location);
    method public void onProviderDisabled(String);
    method public void onProviderEnabled(String);
    method public void onStatusChanged(String, int, android.os.Bundle);
  }

  public class LocationManager {
    method public boolean addGpsStatusListener(android.location.GpsStatus.Listener);
    method public void addProximityAlert(double, double, float, long, android.app.PendingIntent);
    method public void addTestProvider(String, boolean, boolean, boolean, boolean, boolean, boolean, boolean, int, int);
    method public void clearTestProviderEnabled(String);
    method public void clearTestProviderLocation(String);
    method public void clearTestProviderStatus(String);
    method public java.util.List<java.lang.String> getAllProviders();
    method public String getBestProvider(android.location.Criteria, boolean);
    method public android.location.GpsStatus getGpsStatus(android.location.GpsStatus);
    method public android.location.Location getLastKnownLocation(String);
    method public android.location.LocationProvider getProvider(String);
    method public java.util.List<java.lang.String> getProviders(boolean);
    method public java.util.List<java.lang.String> getProviders(android.location.Criteria, boolean);
    method public boolean isProviderEnabled(String);
    method public void removeGpsStatusListener(android.location.GpsStatus.Listener);
    method public void removeProximityAlert(android.app.PendingIntent);
    method public void removeTestProvider(String);
    method public void removeUpdates(android.location.LocationListener);
    method public void removeUpdates(android.app.PendingIntent);
    method public void requestLocationUpdates(String, long, float, android.location.LocationListener);
    method public void requestLocationUpdates(String, long, float, android.location.LocationListener, android.os.Looper);
    method public void requestLocationUpdates(String, long, float, android.app.PendingIntent);
    method public boolean sendExtraCommand(String, String, android.os.Bundle);
    method public void setTestProviderEnabled(String, boolean);
    method public void setTestProviderLocation(String, android.location.Location);
    method public void setTestProviderStatus(String, int, android.os.Bundle, long);
    field public static final String GPS_PROVIDER = "gps";
    field public static final String KEY_LOCATION_CHANGED = "location";
    field public static final String KEY_PROVIDER_ENABLED = "providerEnabled";
    field public static final String KEY_PROXIMITY_ENTERING = "entering";
    field public static final String KEY_STATUS_CHANGED = "status";
    field public static final String NETWORK_PROVIDER = "network";
  }

  public abstract class LocationProvider {
    method public abstract int getAccuracy();
    method public String getName();
    method public abstract int getPowerRequirement();
    method public abstract boolean hasMonetaryCost();
    method public boolean meetsCriteria(android.location.Criteria);
    method public abstract boolean requiresCell();
    method public abstract boolean requiresNetwork();
    method public abstract boolean requiresSatellite();
    method public abstract boolean supportsAltitude();
    method public abstract boolean supportsBearing();
    method public abstract boolean supportsSpeed();
    field public static final int AVAILABLE = 2; // 0x2
    field public static final int OUT_OF_SERVICE = 0; // 0x0
    field public static final int TEMPORARILY_UNAVAILABLE = 1; // 0x1
  }

}

package android.media {

  public class AsyncPlayer {
    ctor public AsyncPlayer(String);
    method public void play(android.content.Context, android.net.Uri, boolean, int);
    method public void stop();
  }

  public class AudioFormat {
    ctor public AudioFormat();
    field public static final int CHANNEL_CONFIGURATION_DEFAULT = 1; // 0x1
    field public static final int CHANNEL_CONFIGURATION_INVALID = 0; // 0x0
    field public static final int CHANNEL_CONFIGURATION_MONO = 2; // 0x2
    field public static final int CHANNEL_CONFIGURATION_STEREO = 3; // 0x3
    field public static final int ENCODING_DEFAULT = 1; // 0x1
    field public static final int ENCODING_INVALID = 0; // 0x0
    field public static final int ENCODING_PCM_16BIT = 2; // 0x2
    field public static final int ENCODING_PCM_8BIT = 3; // 0x3
  }

  public class AudioManager {
    method public void adjustStreamVolume(int, int, int);
    method public void adjustSuggestedStreamVolume(int, int, int);
    method public void adjustVolume(int, int);
    method public int getMode();
    method public int getRingerMode();
    method public int getRouting(int);
    method public int getStreamMaxVolume(int);
    method public int getStreamVolume(int);
    method public int getVibrateSetting(int);
    method public boolean isBluetoothA2dpOn();
    method public boolean isBluetoothScoOn();
    method public boolean isMicrophoneMute();
    method public boolean isMusicActive();
    method public boolean isSpeakerphoneOn();
    method public void loadSoundEffects();
    method public void playSoundEffect(int);
    method public void playSoundEffect(int, float);
    method public void setBluetoothA2dpOn(boolean);
    method public void setBluetoothScoOn(boolean);
    method public void setMicrophoneMute(boolean);
    method public void setMode(int);
    method public void setRingerMode(int);
    method public void setRouting(int, int, int);
    method public void setSpeakerphoneOn(boolean);
    method public void setStreamMute(int, boolean);
    method public void setStreamSolo(int, boolean);
    method public void setStreamVolume(int, int, int);
    method public void setVibrateSetting(int, int);
    method public boolean shouldVibrate(int);
    method public void unloadSoundEffects();
    field public static final String ACTION_AUDIO_BECOMING_NOISY = "android.media.AUDIO_BECOMING_NOISY";
    field public static final int ADJUST_LOWER = -1; // 0xffffffff
    field public static final int ADJUST_RAISE = 1; // 0x1
    field public static final int ADJUST_SAME = 0; // 0x0
    field public static final String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
    field public static final String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
    field public static final String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
    field public static final int FLAG_ALLOW_RINGER_MODES = 2; // 0x2
    field public static final int FLAG_PLAY_SOUND = 4; // 0x4
    field public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 8; // 0x8
    field public static final int FLAG_SHOW_UI = 1; // 0x1
    field public static final int FLAG_VIBRATE = 16; // 0x10
    field public static final int FX_FOCUS_NAVIGATION_DOWN = 2; // 0x2
    field public static final int FX_FOCUS_NAVIGATION_LEFT = 3; // 0x3
    field public static final int FX_FOCUS_NAVIGATION_RIGHT = 4; // 0x4
    field public static final int FX_FOCUS_NAVIGATION_UP = 1; // 0x1
    field public static final int FX_KEYPRESS_DELETE = 7; // 0x7
    field public static final int FX_KEYPRESS_RETURN = 8; // 0x8
    field public static final int FX_KEYPRESS_SPACEBAR = 6; // 0x6
    field public static final int FX_KEYPRESS_STANDARD = 5; // 0x5
    field public static final int FX_KEY_CLICK = 0; // 0x0
    field public static final int MODE_CURRENT = -1; // 0xffffffff
    field public static final int MODE_INVALID = -2; // 0xfffffffe
    field public static final int MODE_IN_CALL = 2; // 0x2
    field public static final int MODE_NORMAL = 0; // 0x0
    field public static final int MODE_RINGTONE = 1; // 0x1
    field public static final int NUM_STREAMS = 5; // 0x5
    field public static final String RINGER_MODE_CHANGED_ACTION = "android.media.RINGER_MODE_CHANGED";
    field public static final int RINGER_MODE_NORMAL = 2; // 0x2
    field public static final int RINGER_MODE_SILENT = 0; // 0x0
    field public static final int RINGER_MODE_VIBRATE = 1; // 0x1
    field public static final int ROUTE_ALL = -1; // 0xffffffff
    field public static final int ROUTE_BLUETOOTH = 4; // 0x4
    field public static final int ROUTE_BLUETOOTH_A2DP = 16; // 0x10
    field public static final int ROUTE_BLUETOOTH_SCO = 4; // 0x4
    field public static final int ROUTE_EARPIECE = 1; // 0x1
    field public static final int ROUTE_HEADSET = 8; // 0x8
    field public static final int ROUTE_SPEAKER = 2; // 0x2
    field public static final int STREAM_ALARM = 4; // 0x4
    field public static final int STREAM_MUSIC = 3; // 0x3
    field public static final int STREAM_NOTIFICATION = 5; // 0x5
    field public static final int STREAM_RING = 2; // 0x2
    field public static final int STREAM_SYSTEM = 1; // 0x1
    field public static final int STREAM_VOICE_CALL = 0; // 0x0
    field public static final int USE_DEFAULT_STREAM_TYPE = -2147483648; // 0x80000000
    field public static final String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
    field public static final int VIBRATE_SETTING_OFF = 0; // 0x0
    field public static final int VIBRATE_SETTING_ON = 1; // 0x1
    field public static final int VIBRATE_SETTING_ONLY_SILENT = 2; // 0x2
    field public static final int VIBRATE_TYPE_NOTIFICATION = 1; // 0x1
    field public static final int VIBRATE_TYPE_RINGER = 0; // 0x0
  }

  public class AudioRecord {
    ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
    method protected void finalize();
    method public int getAudioFormat();
    method public int getAudioSource();
    method public int getChannelConfiguration();
    method public int getChannelCount();
    method public static int getMinBufferSize(int, int, int);
    method public int getNotificationMarkerPosition();
    method public int getPositionNotificationPeriod();
    method public int getRecordingState();
    method public int getSampleRate();
    method public int getState();
    method public int read(byte[], int, int);
    method public int read(short[], int, int);
    method public int read(java.nio.ByteBuffer, int);
    method public void release();
    method public int setNotificationMarkerPosition(int);
    method public int setPositionNotificationPeriod(int);
    method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener);
    method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener, android.os.Handler);
    method public void startRecording() throws java.lang.IllegalStateException;
    method public void stop() throws java.lang.IllegalStateException;
    field public static final int ERROR = -1; // 0xffffffff
    field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
    field public static final int ERROR_INVALID_OPERATION = -3; // 0xfffffffd
    field public static final int RECORDSTATE_RECORDING = 3; // 0x3
    field public static final int RECORDSTATE_STOPPED = 1; // 0x1
    field public static final int STATE_INITIALIZED = 1; // 0x1
    field public static final int STATE_UNINITIALIZED = 0; // 0x0
    field public static final int SUCCESS = 0; // 0x0
  }

  public static interface AudioRecord.OnRecordPositionUpdateListener {
    method public void onMarkerReached(android.media.AudioRecord);
    method public void onPeriodicNotification(android.media.AudioRecord);
  }

  public class AudioTrack {
    ctor public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
    method protected void finalize();
    method public void flush();
    method public int getAudioFormat();
    method public int getChannelConfiguration();
    method public int getChannelCount();
    method public static float getMaxVolume();
    method public static int getMinBufferSize(int, int, int);
    method public static float getMinVolume();
    method protected int getNativeFrameCount();
    method public static int getNativeOutputSampleRate(int);
    method public int getNotificationMarkerPosition();
    method public int getPlayState();
    method public int getPlaybackHeadPosition();
    method public int getPlaybackRate();
    method public int getPositionNotificationPeriod();
    method public int getSampleRate();
    method public int getState();
    method public int getStreamType();
    method public void pause() throws java.lang.IllegalStateException;
    method public void play() throws java.lang.IllegalStateException;
    method public void release();
    method public int reloadStaticData();
    method public int setLoopPoints(int, int, int);
    method public int setNotificationMarkerPosition(int);
    method public int setPlaybackHeadPosition(int);
    method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener);
    method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler);
    method public int setPlaybackRate(int);
    method public int setPositionNotificationPeriod(int);
    method protected void setState(int);
    method public int setStereoVolume(float, float);
    method public void stop() throws java.lang.IllegalStateException;
    method public int write(byte[], int, int);
    method public int write(short[], int, int);
    field public static final int ERROR = -1; // 0xffffffff
    field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
    field public static final int ERROR_INVALID_OPERATION = -3; // 0xfffffffd
    field public static final int MODE_STATIC = 0; // 0x0
    field public static final int MODE_STREAM = 1; // 0x1
    field public static final int PLAYSTATE_PAUSED = 2; // 0x2
    field public static final int PLAYSTATE_PLAYING = 3; // 0x3
    field public static final int PLAYSTATE_STOPPED = 1; // 0x1
    field public static final int STATE_INITIALIZED = 1; // 0x1
    field public static final int STATE_NO_STATIC_DATA = 2; // 0x2
    field public static final int STATE_UNINITIALIZED = 0; // 0x0
    field public static final int SUCCESS = 0; // 0x0
  }

  public static interface AudioTrack.OnPlaybackPositionUpdateListener {
    method public void onMarkerReached(android.media.AudioTrack);
    method public void onPeriodicNotification(android.media.AudioTrack);
  }

  public class FaceDetector {
    ctor public FaceDetector(int, int, int);
    method public int findFaces(android.graphics.Bitmap, android.media.FaceDetector.Face[]);
  }

  public class FaceDetector.Face {
    method public float confidence();
    method public float eyesDistance();
    method public void getMidPoint(android.graphics.PointF);
    method public float pose(int);
    field public static final float CONFIDENCE_THRESHOLD = 0.4f;
    field public static final int EULER_X = 0; // 0x0
    field public static final int EULER_Y = 1; // 0x1
    field public static final int EULER_Z = 2; // 0x2
  }

  public class JetPlayer {
    method public boolean clearQueue();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public boolean closeJetFile();
    method protected void finalize();
    method public static android.media.JetPlayer getJetPlayer();
    method public static int getMaxTracks();
    method public boolean loadJetFile(String);
    method public boolean loadJetFile(android.content.res.AssetFileDescriptor);
    method public boolean pause();
    method public boolean play();
    method public boolean queueJetSegment(int, int, int, int, int, byte);
    method public boolean queueJetSegmentMuteArray(int, int, int, int, boolean[], byte);
    method public void release();
    method public void setEventListener(android.media.JetPlayer.OnJetEventListener);
    method public void setEventListener(android.media.JetPlayer.OnJetEventListener, android.os.Handler);
    method public boolean setMuteArray(boolean[], boolean);
    method public boolean setMuteFlag(int, boolean, boolean);
    method public boolean setMuteFlags(int, boolean);
    method public boolean triggerClip(int);
  }

  public static interface JetPlayer.OnJetEventListener {
    method public void onJetEvent(android.media.JetPlayer, short, byte, byte, byte, byte);
    method public void onJetNumQueuedSegmentUpdate(android.media.JetPlayer, int);
    method public void onJetPauseUpdate(android.media.JetPlayer, int);
    method public void onJetUserIdUpdate(android.media.JetPlayer, int, int);
  }

  public class MediaPlayer {
    ctor public MediaPlayer();
    method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri);
    method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder);
    method public static android.media.MediaPlayer create(android.content.Context, int);
    method protected void finalize();
    method public int getCurrentPosition();
    method public int getDuration();
    method public int getVideoHeight();
    method public int getVideoWidth();
    method public boolean isLooping();
    method public boolean isPlaying();
    method public void pause() throws java.lang.IllegalStateException;
    method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
    method public void prepareAsync() throws java.lang.IllegalStateException;
    method public void release();
    method public void reset();
    method public void seekTo(int) throws java.lang.IllegalStateException;
    method public void setAudioStreamType(int);
    method public void setDataSource(android.content.Context, android.net.Uri) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.SecurityException;
    method public void setDataSource(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setDataSource(java.io.FileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setDisplay(android.view.SurfaceHolder);
    method public void setLooping(boolean);
    method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
    method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
    method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
    method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
    method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
    method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
    method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
    method public void setScreenOnWhilePlaying(boolean);
    method public void setVolume(float, float);
    method public void setWakeMode(android.content.Context, int);
    method public void start() throws java.lang.IllegalStateException;
    method public void stop() throws java.lang.IllegalStateException;
    field public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200; // 0xc8
    field public static final int MEDIA_ERROR_SERVER_DIED = 100; // 0x64
    field public static final int MEDIA_ERROR_UNKNOWN = 1; // 0x1
    field public static final int MEDIA_INFO_BAD_INTERLEAVING = 800; // 0x320
    field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
    field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
    field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
  }

  public static interface MediaPlayer.OnBufferingUpdateListener {
    method public void onBufferingUpdate(android.media.MediaPlayer, int);
  }

  public static interface MediaPlayer.OnCompletionListener {
    method public void onCompletion(android.media.MediaPlayer);
  }

  public static interface MediaPlayer.OnErrorListener {
    method public boolean onError(android.media.MediaPlayer, int, int);
  }

  public static interface MediaPlayer.OnInfoListener {
    method public boolean onInfo(android.media.MediaPlayer, int, int);
  }

  public static interface MediaPlayer.OnPreparedListener {
    method public void onPrepared(android.media.MediaPlayer);
  }

  public static interface MediaPlayer.OnSeekCompleteListener {
    method public void onSeekComplete(android.media.MediaPlayer);
  }

  public static interface MediaPlayer.OnVideoSizeChangedListener {
    method public void onVideoSizeChanged(android.media.MediaPlayer, int, int);
  }

  public class MediaRecorder {
    ctor public MediaRecorder();
    method protected void finalize();
    method public int getMaxAmplitude() throws java.lang.IllegalStateException;
    method public void prepare() throws java.io.IOException, java.lang.IllegalStateException;
    method public void release();
    method public void reset();
    method public void setAudioEncoder(int) throws java.lang.IllegalStateException;
    method public void setAudioSource(int) throws java.lang.IllegalStateException;
    method public void setCamera(android.hardware.Camera);
    method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
    method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
    method public void setOnErrorListener(android.media.MediaRecorder.OnErrorListener);
    method public void setOnInfoListener(android.media.MediaRecorder.OnInfoListener);
    method public void setOutputFile(java.io.FileDescriptor) throws java.lang.IllegalStateException;
    method public void setOutputFile(String) throws java.lang.IllegalStateException;
    method public void setOutputFormat(int) throws java.lang.IllegalStateException;
    method public void setPreviewDisplay(android.view.Surface);
    method public void setVideoEncoder(int) throws java.lang.IllegalStateException;
    method public void setVideoFrameRate(int) throws java.lang.IllegalStateException;
    method public void setVideoSize(int, int) throws java.lang.IllegalStateException;
    method public void setVideoSource(int) throws java.lang.IllegalStateException;
    method public void start() throws java.lang.IllegalStateException;
    method public void stop() throws java.lang.IllegalStateException;
    field public static final int MEDIA_RECORDER_ERROR_UNKNOWN = 1; // 0x1
    field public static final int MEDIA_RECORDER_INFO_MAX_DURATION_REACHED = 800; // 0x320
    field public static final int MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED = 801; // 0x321
    field public static final int MEDIA_RECORDER_INFO_UNKNOWN = 1; // 0x1
  }

  public final class MediaRecorder.AudioEncoder {
    field public static final int AMR_NB = 1; // 0x1
    field public static final int DEFAULT = 0; // 0x0
  }

  public final class MediaRecorder.AudioSource {
    field public static final int DEFAULT = 0; // 0x0
    field public static final int MIC = 1; // 0x1
  }

  public static interface MediaRecorder.OnErrorListener {
    method public void onError(android.media.MediaRecorder, int, int);
  }

  public static interface MediaRecorder.OnInfoListener {
    method public void onInfo(android.media.MediaRecorder, int, int);
  }

  public final class MediaRecorder.OutputFormat {
    field public static final int DEFAULT = 0; // 0x0
    field public static final int MPEG_4 = 2; // 0x2
    field public static final int RAW_AMR = 3; // 0x3
    field public static final int THREE_GPP = 1; // 0x1
  }

  public final class MediaRecorder.VideoEncoder {
    field public static final int DEFAULT = 0; // 0x0
    field public static final int H263 = 1; // 0x1
    field public static final int H264 = 2; // 0x2
    field public static final int MPEG_4_SP = 3; // 0x3
  }

  public final class MediaRecorder.VideoSource {
    field public static final int CAMERA = 1; // 0x1
    field public static final int DEFAULT = 0; // 0x0
  }

  public class MediaScannerConnection implements android.content.ServiceConnection {
    ctor public MediaScannerConnection(android.content.Context, android.media.MediaScannerConnection.MediaScannerConnectionClient);
    method public void connect();
    method public void disconnect();
    method public boolean isConnected();
    method public void onServiceConnected(android.content.ComponentName, android.os.IBinder);
    method public void onServiceDisconnected(android.content.ComponentName);
    method public void scanFile(String, String);
  }

  public static interface MediaScannerConnection.MediaScannerConnectionClient {
    method public void onMediaScannerConnected();
    method public void onScanCompleted(String, android.net.Uri);
  }

  public class Ringtone {
    method public int getStreamType();
    method public String getTitle(android.content.Context);
    method public boolean isPlaying();
    method public void play();
    method public void setStreamType(int);
    method public void stop();
  }

  public class RingtoneManager {
    ctor public RingtoneManager(android.app.Activity);
    ctor public RingtoneManager(android.content.Context);
    method public static android.net.Uri getActualDefaultRingtoneUri(android.content.Context, int);
    method public android.database.Cursor getCursor();
    method public static int getDefaultType(android.net.Uri);
    method public static android.net.Uri getDefaultUri(int);
    method public boolean getIncludeDrm();
    method public android.media.Ringtone getRingtone(int);
    method public static android.media.Ringtone getRingtone(android.content.Context, android.net.Uri);
    method public int getRingtonePosition(android.net.Uri);
    method public android.net.Uri getRingtoneUri(int);
    method public boolean getStopPreviousRingtone();
    method public static android.net.Uri getValidRingtoneUri(android.content.Context);
    method public int inferStreamType();
    method public static boolean isDefault(android.net.Uri);
    method public static void setActualDefaultRingtoneUri(android.content.Context, int, android.net.Uri);
    method public void setIncludeDrm(boolean);
    method public void setStopPreviousRingtone(boolean);
    method public void setType(int);
    method public void stopPreviousRingtone();
    field public static final String ACTION_RINGTONE_PICKER = "android.intent.action.RINGTONE_PICKER";
    field public static final String EXTRA_RINGTONE_DEFAULT_URI = "android.intent.extra.ringtone.DEFAULT_URI";
    field public static final String EXTRA_RINGTONE_EXISTING_URI = "android.intent.extra.ringtone.EXISTING_URI";
    field public static final String EXTRA_RINGTONE_INCLUDE_DRM = "android.intent.extra.ringtone.INCLUDE_DRM";
    field public static final String EXTRA_RINGTONE_PICKED_URI = "android.intent.extra.ringtone.PICKED_URI";
    field public static final String EXTRA_RINGTONE_SHOW_DEFAULT = "android.intent.extra.ringtone.SHOW_DEFAULT";
    field public static final String EXTRA_RINGTONE_SHOW_SILENT = "android.intent.extra.ringtone.SHOW_SILENT";
    field public static final String EXTRA_RINGTONE_TITLE = "android.intent.extra.ringtone.TITLE";
    field public static final String EXTRA_RINGTONE_TYPE = "android.intent.extra.ringtone.TYPE";
    field public static final int ID_COLUMN_INDEX = 0; // 0x0
    field public static final int TITLE_COLUMN_INDEX = 1; // 0x1
    field public static final int TYPE_ALARM = 4; // 0x4
    field public static final int TYPE_ALL = 7; // 0x7
    field public static final int TYPE_NOTIFICATION = 2; // 0x2
    field public static final int TYPE_RINGTONE = 1; // 0x1
    field public static final int URI_COLUMN_INDEX = 2; // 0x2
  }

  public class SoundPool {
    ctor public SoundPool(int, int, int);
    method protected void finalize();
    method public int load(String, int);
    method public int load(android.content.Context, int, int);
    method public int load(android.content.res.AssetFileDescriptor, int);
    method public int load(java.io.FileDescriptor, long, long, int);
    method public final void pause(int);
    method public final int play(int, float, float, int, int, float);
    method public final void release();
    method public final void resume(int);
    method public final void setLoop(int, int);
    method public final void setPriority(int, int);
    method public final void setRate(int, float);
    method public final void setVolume(int, float, float);
    method public final void stop(int);
    method public final boolean unload(int);
  }

  public class ToneGenerator {
    ctor public ToneGenerator(int, int);
    method protected void finalize();
    method public void release();
    method public boolean startTone(int);
    method public void stopTone();
    field public static final int MAX_VOLUME = 100; // 0x64
    field public static final int MIN_VOLUME = 0; // 0x0
    field public static final int TONE_DTMF_0 = 0; // 0x0
    field public static final int TONE_DTMF_1 = 1; // 0x1
    field public static final int TONE_DTMF_2 = 2; // 0x2
    field public static final int TONE_DTMF_3 = 3; // 0x3
    field public static final int TONE_DTMF_4 = 4; // 0x4
    field public static final int TONE_DTMF_5 = 5; // 0x5
    field public static final int TONE_DTMF_6 = 6; // 0x6
    field public static final int TONE_DTMF_7 = 7; // 0x7
    field public static final int TONE_DTMF_8 = 8; // 0x8
    field public static final int TONE_DTMF_9 = 9; // 0x9
    field public static final int TONE_DTMF_A = 12; // 0xc
    field public static final int TONE_DTMF_B = 13; // 0xd
    field public static final int TONE_DTMF_C = 14; // 0xe
    field public static final int TONE_DTMF_D = 15; // 0xf
    field public static final int TONE_DTMF_P = 11; // 0xb
    field public static final int TONE_DTMF_S = 10; // 0xa
    field public static final int TONE_PROP_ACK = 25; // 0x19
    field public static final int TONE_PROP_BEEP = 24; // 0x18
    field public static final int TONE_PROP_BEEP2 = 28; // 0x1c
    field public static final int TONE_PROP_NACK = 26; // 0x1a
    field public static final int TONE_PROP_PROMPT = 27; // 0x1b
    field public static final int TONE_SUP_BUSY = 17; // 0x11
    field public static final int TONE_SUP_CALL_WAITING = 22; // 0x16
    field public static final int TONE_SUP_CONGESTION = 18; // 0x12
    field public static final int TONE_SUP_DIAL = 16; // 0x10
    field public static final int TONE_SUP_ERROR = 21; // 0x15
    field public static final int TONE_SUP_RADIO_ACK = 19; // 0x13
    field public static final int TONE_SUP_RADIO_NOTAVAIL = 20; // 0x14
    field public static final int TONE_SUP_RINGTONE = 23; // 0x17
  }

}

package android.net {

  public class ConnectivityManager {
    method public android.net.NetworkInfo getActiveNetworkInfo();
    method public android.net.NetworkInfo[] getAllNetworkInfo();
    method public boolean getBackgroundDataSetting();
    method public android.net.NetworkInfo getNetworkInfo(int);
    method public int getNetworkPreference();
    method public static boolean isNetworkTypeValid(int);
    method public boolean requestRouteToHost(int, int);
    method public void setNetworkPreference(int);
    method public int startUsingNetworkFeature(int, String);
    method public int stopUsingNetworkFeature(int, String);
    field public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
    field public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
    field public static final int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
    field public static final String EXTRA_EXTRA_INFO = "extraInfo";
    field public static final String EXTRA_IS_FAILOVER = "isFailover";
    field public static final String EXTRA_NETWORK_INFO = "networkInfo";
    field public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity";
    field public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
    field public static final String EXTRA_REASON = "reason";
    field public static final int TYPE_MOBILE = 0; // 0x0
    field public static final int TYPE_WIFI = 1; // 0x1
  }

  public class Credentials {
    ctor public Credentials(int, int, int);
    method public int getGid();
    method public int getPid();
    method public int getUid();
  }

  public class DhcpInfo implements android.os.Parcelable {
    ctor public DhcpInfo();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public int dns1;
    field public int dns2;
    field public int gateway;
    field public int ipAddress;
    field public int leaseDuration;
    field public int netmask;
    field public int serverAddress;
  }

  public class LocalServerSocket {
    ctor public LocalServerSocket(String) throws java.io.IOException;
    ctor public LocalServerSocket(java.io.FileDescriptor) throws java.io.IOException;
    method public android.net.LocalSocket accept() throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public java.io.FileDescriptor getFileDescriptor();
    method public android.net.LocalSocketAddress getLocalSocketAddress();
  }

  public class LocalSocket {
    ctor public LocalSocket();
    method public void bind(android.net.LocalSocketAddress) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public void connect(android.net.LocalSocketAddress) throws java.io.IOException;
    method public void connect(android.net.LocalSocketAddress, int) throws java.io.IOException;
    method public java.io.FileDescriptor[] getAncillaryFileDescriptors() throws java.io.IOException;
    method public java.io.FileDescriptor getFileDescriptor();
    method public java.io.InputStream getInputStream() throws java.io.IOException;
    method public android.net.LocalSocketAddress getLocalSocketAddress();
    method public java.io.OutputStream getOutputStream() throws java.io.IOException;
    method public android.net.Credentials getPeerCredentials() throws java.io.IOException;
    method public int getReceiveBufferSize() throws java.io.IOException;
    method public android.net.LocalSocketAddress getRemoteSocketAddress();
    method public int getSendBufferSize() throws java.io.IOException;
    method public int getSoTimeout() throws java.io.IOException;
    method public boolean isBound();
    method public boolean isClosed();
    method public boolean isConnected();
    method public boolean isInputShutdown();
    method public boolean isOutputShutdown();
    method public void setFileDescriptorsForSend(java.io.FileDescriptor[]);
    method public void setReceiveBufferSize(int) throws java.io.IOException;
    method public void setSendBufferSize(int) throws java.io.IOException;
    method public void setSoTimeout(int) throws java.io.IOException;
    method public void shutdownInput() throws java.io.IOException;
    method public void shutdownOutput() throws java.io.IOException;
  }

  public class LocalSocketAddress {
    ctor public LocalSocketAddress(String, android.net.LocalSocketAddress.Namespace);
    ctor public LocalSocketAddress(String);
    method public String getName();
    method public android.net.LocalSocketAddress.Namespace getNamespace();
  }

  public enum LocalSocketAddress.Namespace {
    enum_constant public static final android.net.LocalSocketAddress.Namespace ABSTRACT;
    enum_constant public static final android.net.LocalSocketAddress.Namespace FILESYSTEM;
    enum_constant public static final android.net.LocalSocketAddress.Namespace RESERVED;
  }

  public class MailTo {
    method public String getBody();
    method public String getCc();
    method public java.util.Map<java.lang.String,java.lang.String> getHeaders();
    method public String getSubject();
    method public String getTo();
    method public static boolean isMailTo(String);
    method public static android.net.MailTo parse(String) throws android.net.ParseException;
    field public static final String MAILTO_SCHEME = "mailto:";
  }

  public class NetworkInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.net.NetworkInfo.DetailedState getDetailedState();
    method public String getExtraInfo();
    method public String getReason();
    method public android.net.NetworkInfo.State getState();
    method public int getSubtype();
    method public String getSubtypeName();
    method public int getType();
    method public String getTypeName();
    method public boolean isAvailable();
    method public boolean isConnected();
    method public boolean isConnectedOrConnecting();
    method public boolean isFailover();
    method public boolean isRoaming();
    method public void writeToParcel(android.os.Parcel, int);
  }

  public enum NetworkInfo.DetailedState {
    enum_constant public static final android.net.NetworkInfo.DetailedState AUTHENTICATING;
    enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTED;
    enum_constant public static final android.net.NetworkInfo.DetailedState CONNECTING;
    enum_constant public static final android.net.NetworkInfo.DetailedState DISCONNECTED;
    enum_constant public static final android.net.NetworkInfo.DetailedState DISCONNECTING;
    enum_constant public static final android.net.NetworkInfo.DetailedState FAILED;
    enum_constant public static final android.net.NetworkInfo.DetailedState IDLE;
    enum_constant public static final android.net.NetworkInfo.DetailedState OBTAINING_IPADDR;
    enum_constant public static final android.net.NetworkInfo.DetailedState SCANNING;
    enum_constant public static final android.net.NetworkInfo.DetailedState SUSPENDED;
  }

  public enum NetworkInfo.State {
    enum_constant public static final android.net.NetworkInfo.State CONNECTED;
    enum_constant public static final android.net.NetworkInfo.State CONNECTING;
    enum_constant public static final android.net.NetworkInfo.State DISCONNECTED;
    enum_constant public static final android.net.NetworkInfo.State DISCONNECTING;
    enum_constant public static final android.net.NetworkInfo.State SUSPENDED;
    enum_constant public static final android.net.NetworkInfo.State UNKNOWN;
  }

  public class ParseException extends java.lang.RuntimeException {
    field public String response;
  }

  public final class Proxy {
    ctor public Proxy();
    method public static String getDefaultHost();
    method public static int getDefaultPort();
    method public static String getHost(android.content.Context);
    method public static int getPort(android.content.Context);
    field public static final String PROXY_CHANGE_ACTION = "android.intent.action.PROXY_CHANGE";
  }

  public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
    ctor public SSLCertificateSocketFactory(int) throws java.security.KeyManagementException, java.security.NoSuchAlgorithmException;
    method public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException;
    method public java.net.Socket createSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
    method public java.net.Socket createSocket(java.net.InetAddress, int) throws java.io.IOException;
    method public java.net.Socket createSocket(String, int, java.net.InetAddress, int) throws java.io.IOException;
    method public java.net.Socket createSocket(String, int) throws java.io.IOException;
    method public static javax.net.SocketFactory getDefault(int);
    method public String[] getDefaultCipherSuites();
    method public String[] getSupportedCipherSuites();
  }

  public abstract class Uri implements java.lang.Comparable<android.net.Uri> android.os.Parcelable {
    method public abstract android.net.Uri.Builder buildUpon();
    method public int compareTo(android.net.Uri);
    method public static String decode(String);
    method public static String encode(String);
    method public static String encode(String, String);
    method public static android.net.Uri fromFile(java.io.File);
    method public static android.net.Uri fromParts(String, String, String);
    method public abstract String getAuthority();
    method public abstract String getEncodedAuthority();
    method public abstract String getEncodedFragment();
    method public abstract String getEncodedPath();
    method public abstract String getEncodedQuery();
    method public abstract String getEncodedSchemeSpecificPart();
    method public abstract String getEncodedUserInfo();
    method public abstract String getFragment();
    method public abstract String getHost();
    method public abstract String getLastPathSegment();
    method public abstract String getPath();
    method public abstract java.util.List<java.lang.String> getPathSegments();
    method public abstract int getPort();
    method public abstract String getQuery();
    method public String getQueryParameter(String);
    method public java.util.List<java.lang.String> getQueryParameters(String);
    method public abstract String getScheme();
    method public abstract String getSchemeSpecificPart();
    method public abstract String getUserInfo();
    method public boolean isAbsolute();
    method public abstract boolean isHierarchical();
    method public boolean isOpaque();
    method public abstract boolean isRelative();
    method public static android.net.Uri parse(String);
    method public abstract String toString();
    method public static android.net.Uri withAppendedPath(android.net.Uri, String);
    method public static void writeToParcel(android.os.Parcel, android.net.Uri);
    field public static final android.os.Parcelable.Creator<android.net.Uri> CREATOR;
    field public static final android.net.Uri EMPTY;
  }

  public static final class Uri.Builder {
    ctor public Uri.Builder();
    method public android.net.Uri.Builder appendEncodedPath(String);
    method public android.net.Uri.Builder appendPath(String);
    method public android.net.Uri.Builder appendQueryParameter(String, String);
    method public android.net.Uri.Builder authority(String);
    method public android.net.Uri build();
    method public android.net.Uri.Builder encodedAuthority(String);
    method public android.net.Uri.Builder encodedFragment(String);
    method public android.net.Uri.Builder encodedOpaquePart(String);
    method public android.net.Uri.Builder encodedPath(String);
    method public android.net.Uri.Builder encodedQuery(String);
    method public android.net.Uri.Builder fragment(String);
    method public android.net.Uri.Builder opaquePart(String);
    method public android.net.Uri.Builder path(String);
    method public android.net.Uri.Builder query(String);
    method public android.net.Uri.Builder scheme(String);
  }

  public class UrlQuerySanitizer {
    ctor public UrlQuerySanitizer();
    ctor public UrlQuerySanitizer(String);
    method protected void addSanitizedEntry(String, String);
    method protected void clear();
    method protected int decodeHexDigit(char);
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAllButNulAndAngleBracketsLegal();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAllButNulLegal();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAllButWhitespaceLegal();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAllIllegal();
    method public boolean getAllowUnregisteredParamaters();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAmpAndSpaceLegal();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getAmpLegal();
    method public android.net.UrlQuerySanitizer.ValueSanitizer getEffectiveValueSanitizer(String);
    method public java.util.List<android.net.UrlQuerySanitizer.ParameterValuePair> getParameterList();
    method public java.util.Set<java.lang.String> getParameterSet();
    method public boolean getPreferFirstRepeatedParameter();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getSpaceLegal();
    method public android.net.UrlQuerySanitizer.ValueSanitizer getUnregisteredParameterValueSanitizer();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getUrlAndSpaceLegal();
    method public static final android.net.UrlQuerySanitizer.ValueSanitizer getUrlLegal();
    method public String getValue(String);
    method public android.net.UrlQuerySanitizer.ValueSanitizer getValueSanitizer(String);
    method public boolean hasParameter(String);
    method protected boolean isHexDigit(char);
    method protected void parseEntry(String, String);
    method public void parseQuery(String);
    method public void parseUrl(String);
    method public void registerParameter(String, android.net.UrlQuerySanitizer.ValueSanitizer);
    method public void registerParameters(String[], android.net.UrlQuerySanitizer.ValueSanitizer);
    method public void setAllowUnregisteredParamaters(boolean);
    method public void setPreferFirstRepeatedParameter(boolean);
    method public void setUnregisteredParameterValueSanitizer(android.net.UrlQuerySanitizer.ValueSanitizer);
    method public String unescape(String);
  }

  public static class UrlQuerySanitizer.IllegalCharacterValueSanitizer implements android.net.UrlQuerySanitizer.ValueSanitizer {
    ctor public UrlQuerySanitizer.IllegalCharacterValueSanitizer(int);
    method public String sanitize(String);
    field public static final int ALL_BUT_NUL_AND_ANGLE_BRACKETS_LEGAL = 1439; // 0x59f
    field public static final int ALL_BUT_NUL_LEGAL = 1535; // 0x5ff
    field public static final int ALL_BUT_WHITESPACE_LEGAL = 1532; // 0x5fc
    field public static final int ALL_ILLEGAL = 0; // 0x0
    field public static final int ALL_OK = 2047; // 0x7ff
    field public static final int ALL_WHITESPACE_OK = 3; // 0x3
    field public static final int AMP_AND_SPACE_LEGAL = 129; // 0x81
    field public static final int AMP_LEGAL = 128; // 0x80
    field public static final int AMP_OK = 128; // 0x80
    field public static final int DQUOTE_OK = 8; // 0x8
    field public static final int GT_OK = 64; // 0x40
    field public static final int LT_OK = 32; // 0x20
    field public static final int NON_7_BIT_ASCII_OK = 4; // 0x4
    field public static final int NUL_OK = 512; // 0x200
    field public static final int OTHER_WHITESPACE_OK = 2; // 0x2
    field public static final int PCT_OK = 256; // 0x100
    field public static final int SCRIPT_URL_OK = 1024; // 0x400
    field public static final int SPACE_LEGAL = 1; // 0x1
    field public static final int SPACE_OK = 1; // 0x1
    field public static final int SQUOTE_OK = 16; // 0x10
    field public static final int URL_AND_SPACE_LEGAL = 405; // 0x195
    field public static final int URL_LEGAL = 404; // 0x194
  }

  public class UrlQuerySanitizer.ParameterValuePair {
    ctor public UrlQuerySanitizer.ParameterValuePair(String, String);
    field public String mParameter;
    field public String mValue;
  }

  public static interface UrlQuerySanitizer.ValueSanitizer {
    method public String sanitize(String);
  }

}

package android.net.http {

  public class SslCertificate {
    ctor public SslCertificate(String, String, String, String);
    ctor public SslCertificate(java.security.cert.X509Certificate);
    method public android.net.http.SslCertificate.DName getIssuedBy();
    method public android.net.http.SslCertificate.DName getIssuedTo();
    method public String getValidNotAfter();
    method public String getValidNotBefore();
    method public static android.net.http.SslCertificate restoreState(android.os.Bundle);
    method public static android.os.Bundle saveState(android.net.http.SslCertificate);
  }

  public class SslCertificate.DName {
    ctor public SslCertificate.DName(String);
    method public String getCName();
    method public String getDName();
    method public String getOName();
    method public String getUName();
  }

}

package android.net.wifi {

  public class ScanResult implements android.os.Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public String BSSID;
    field public String SSID;
    field public String capabilities;
    field public int frequency;
    field public int level;
  }

  public enum SupplicantState implements android.os.Parcelable {
    method public int describeContents();
    method public static boolean isValidState(android.net.wifi.SupplicantState);
    method public void writeToParcel(android.os.Parcel, int);
    enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED;
    enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING;
    enum_constant public static final android.net.wifi.SupplicantState COMPLETED;
    enum_constant public static final android.net.wifi.SupplicantState DISCONNECTED;
    enum_constant public static final android.net.wifi.SupplicantState DORMANT;
    enum_constant public static final android.net.wifi.SupplicantState FOUR_WAY_HANDSHAKE;
    enum_constant public static final android.net.wifi.SupplicantState GROUP_HANDSHAKE;
    enum_constant public static final android.net.wifi.SupplicantState INACTIVE;
    enum_constant public static final android.net.wifi.SupplicantState INVALID;
    enum_constant public static final android.net.wifi.SupplicantState SCANNING;
    enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED;
  }

  public class WifiConfiguration implements android.os.Parcelable {
    ctor public WifiConfiguration();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public String BSSID;
    field public String SSID;
    field public java.util.BitSet allowedAuthAlgorithms;
    field public java.util.BitSet allowedGroupCiphers;
    field public java.util.BitSet allowedKeyManagement;
    field public java.util.BitSet allowedPairwiseCiphers;
    field public java.util.BitSet allowedProtocols;
    field public boolean hiddenSSID;
    field public int networkId;
    field public String preSharedKey;
    field public int priority;
    field public int status;
    field public String[] wepKeys;
    field public int wepTxKeyIndex;
  }

  public static class WifiConfiguration.AuthAlgorithm {
    field public static final int LEAP = 2; // 0x2
    field public static final int OPEN = 0; // 0x0
    field public static final int SHARED = 1; // 0x1
    field public static final String[] strings;
    field public static final String varName = "auth_alg";
  }

  public static class WifiConfiguration.GroupCipher {
    field public static final int CCMP = 3; // 0x3
    field public static final int TKIP = 2; // 0x2
    field public static final int WEP104 = 1; // 0x1
    field public static final int WEP40 = 0; // 0x0
    field public static final String[] strings;
    field public static final String varName = "group";
  }

  public static class WifiConfiguration.KeyMgmt {
    field public static final int IEEE8021X = 3; // 0x3
    field public static final int NONE = 0; // 0x0
    field public static final int WPA_EAP = 2; // 0x2
    field public static final int WPA_PSK = 1; // 0x1
    field public static final String[] strings;
    field public static final String varName = "key_mgmt";
  }

  public static class WifiConfiguration.PairwiseCipher {
    field public static final int CCMP = 2; // 0x2
    field public static final int NONE = 0; // 0x0
    field public static final int TKIP = 1; // 0x1
    field public static final String[] strings;
    field public static final String varName = "pairwise";
  }

  public static class WifiConfiguration.Protocol {
    field public static final int RSN = 1; // 0x1
    field public static final int WPA = 0; // 0x0
    field public static final String[] strings;
    field public static final String varName = "proto";
  }

  public static class WifiConfiguration.Status {
    field public static final int CURRENT = 0; // 0x0
    field public static final int DISABLED = 1; // 0x1
    field public static final int ENABLED = 2; // 0x2
    field public static final String[] strings;
  }

  public class WifiInfo implements android.os.Parcelable {
    method public int describeContents();
    method public String getBSSID();
    method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState);
    method public boolean getHiddenSSID();
    method public int getIpAddress();
    method public int getLinkSpeed();
    method public String getMacAddress();
    method public int getNetworkId();
    method public int getRssi();
    method public String getSSID();
    method public android.net.wifi.SupplicantState getSupplicantState();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final String LINK_SPEED_UNITS = "Mbps";
  }

  public class WifiManager {
    method public int addNetwork(android.net.wifi.WifiConfiguration);
    method public static int calculateSignalLevel(int, int);
    method public static int compareSignalLevel(int, int);
    method public android.net.wifi.WifiManager.WifiLock createWifiLock(int, String);
    method public android.net.wifi.WifiManager.WifiLock createWifiLock(String);
    method public boolean disableNetwork(int);
    method public boolean disconnect();
    method public boolean enableNetwork(int, boolean);
    method public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
    method public android.net.wifi.WifiInfo getConnectionInfo();
    method public android.net.DhcpInfo getDhcpInfo();
    method public java.util.List<android.net.wifi.ScanResult> getScanResults();
    method public int getWifiState();
    method public boolean isWifiEnabled();
    method public boolean pingSupplicant();
    method public boolean reassociate();
    method public boolean reconnect();
    method public boolean removeNetwork(int);
    method public boolean saveConfiguration();
    method public boolean setWifiEnabled(boolean);
    method public boolean startScan();
    method public int updateNetwork(android.net.wifi.WifiConfiguration);
    field public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
    field public static final int ERROR_AUTHENTICATING = 1; // 0x1
    field public static final String EXTRA_BSSID = "bssid";
    field public static final String EXTRA_NETWORK_INFO = "networkInfo";
    field public static final String EXTRA_NEW_RSSI = "newRssi";
    field public static final String EXTRA_NEW_STATE = "newState";
    field public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
    field public static final String EXTRA_SUPPLICANT_CONNECTED = "connected";
    field public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError";
    field public static final String EXTRA_WIFI_STATE = "wifi_state";
    field public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
    field public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
    field public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
    field public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
    field public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = "android.net.wifi.supplicant.CONNECTION_CHANGE";
    field public static final String SUPPLICANT_STATE_CHANGED_ACTION = "android.net.wifi.supplicant.STATE_CHANGE";
    field public static final int WIFI_MODE_FULL = 1; // 0x1
    field public static final int WIFI_MODE_SCAN_ONLY = 2; // 0x2
    field public static final String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";
    field public static final int WIFI_STATE_DISABLED = 1; // 0x1
    field public static final int WIFI_STATE_DISABLING = 0; // 0x0
    field public static final int WIFI_STATE_ENABLED = 3; // 0x3
    field public static final int WIFI_STATE_ENABLING = 2; // 0x2
    field public static final int WIFI_STATE_UNKNOWN = 4; // 0x4
  }

  public class WifiManager.WifiLock {
    method public void acquire();
    method public boolean isHeld();
    method public void release();
    method public void setReferenceCounted(boolean);
  }

}

package android.opengl {

  public class GLDebugHelper {
    ctor public GLDebugHelper();
    method public static javax.microedition.khronos.opengles.GL wrap(javax.microedition.khronos.opengles.GL, int, java.io.Writer);
    method public static javax.microedition.khronos.egl.EGL wrap(javax.microedition.khronos.egl.EGL, int, java.io.Writer);
    field public static final int CONFIG_CHECK_GL_ERROR = 1; // 0x1
    field public static final int CONFIG_CHECK_THREAD = 2; // 0x2
    field public static final int CONFIG_LOG_ARGUMENT_NAMES = 4; // 0x4
    field public static final int ERROR_WRONG_THREAD = 28672; // 0x7000
  }

  public class GLException extends java.lang.RuntimeException {
    ctor public GLException(int);
    ctor public GLException(int, String);
  }

  public class GLSurfaceView extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback {
    ctor public GLSurfaceView(android.content.Context);
    ctor public GLSurfaceView(android.content.Context, android.util.AttributeSet);
    method public int getDebugFlags();
    method public int getRenderMode();
    method public void onPause();
    method public void onResume();
    method public void queueEvent(Runnable);
    method public void requestRender();
    method public void setDebugFlags(int);
    method public void setEGLConfigChooser(android.opengl.GLSurfaceView.EGLConfigChooser);
    method public void setEGLConfigChooser(boolean);
    method public void setEGLConfigChooser(int, int, int, int, int, int);
    method public void setGLWrapper(android.opengl.GLSurfaceView.GLWrapper);
    method public void setRenderMode(int);
    method public void setRenderer(android.opengl.GLSurfaceView.Renderer);
    method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
    method public void surfaceCreated(android.view.SurfaceHolder);
    method public void surfaceDestroyed(android.view.SurfaceHolder);
    field public static final int DEBUG_CHECK_GL_ERROR = 1; // 0x1
    field public static final int DEBUG_LOG_GL_CALLS = 2; // 0x2
    field public static final int RENDERMODE_CONTINUOUSLY = 1; // 0x1
    field public static final int RENDERMODE_WHEN_DIRTY = 0; // 0x0
  }

  public static interface GLSurfaceView.EGLConfigChooser {
    method public javax.microedition.khronos.egl.EGLConfig chooseConfig(javax.microedition.khronos.egl.EGL10, javax.microedition.khronos.egl.EGLDisplay);
  }

  public static interface GLSurfaceView.GLWrapper {
    method public javax.microedition.khronos.opengles.GL wrap(javax.microedition.khronos.opengles.GL);
  }

  public static interface GLSurfaceView.Renderer {
    method public void onDrawFrame(javax.microedition.khronos.opengles.GL10);
    method public void onSurfaceChanged(javax.microedition.khronos.opengles.GL10, int, int);
    method public void onSurfaceCreated(javax.microedition.khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig);
  }

  public class GLU {
    ctor public GLU();
    method public static String gluErrorString(int);
    method public static void gluLookAt(javax.microedition.khronos.opengles.GL10, float, float, float, float, float, float, float, float, float);
    method public static void gluOrtho2D(javax.microedition.khronos.opengles.GL10, float, float, float, float);
    method public static void gluPerspective(javax.microedition.khronos.opengles.GL10, float, float, float, float);
    method public static int gluProject(float, float, float, float[], int, float[], int, int[], int, float[], int);
    method public static int gluUnProject(float, float, float, float[], int, float[], int, int[], int, float[], int);
  }

  public final class GLUtils {
    method public static int getInternalFormat(android.graphics.Bitmap);
    method public static int getType(android.graphics.Bitmap);
    method public static void texImage2D(int, int, int, android.graphics.Bitmap, int);
    method public static void texImage2D(int, int, int, android.graphics.Bitmap, int, int);
    method public static void texImage2D(int, int, android.graphics.Bitmap, int);
    method public static void texSubImage2D(int, int, int, int, android.graphics.Bitmap);
    method public static void texSubImage2D(int, int, int, int, android.graphics.Bitmap, int, int);
  }

  public class Matrix {
    ctor public Matrix();
    method public static void frustumM(float[], int, float, float, float, float, float, float);
    method public static boolean invertM(float[], int, float[], int);
    method public static float length(float, float, float);
    method public static void multiplyMM(float[], int, float[], int, float[], int);
    method public static void multiplyMV(float[], int, float[], int, float[], int);
    method public static void orthoM(float[], int, float, float, float, float, float, float);
    method public static void rotateM(float[], int, float[], int, float, float, float, float);
    method public static void rotateM(float[], int, float, float, float, float);
    method public static void scaleM(float[], int, float[], int, float, float, float);
    method public static void scaleM(float[], int, float, float, float);
    method public static void setIdentityM(float[], int);
    method public static void setRotateEulerM(float[], int, float, float, float);
    method public static void setRotateM(float[], int, float, float, float, float);
    method public static void translateM(float[], int, float[], int, float, float, float);
    method public static void translateM(float[], int, float, float, float);
    method public static void transposeM(float[], int, float[], int);
  }

  public class Visibility {
    ctor public Visibility();
    method public static void computeBoundingSphere(float[], int, int, float[], int);
    method public static int frustumCullSpheres(float[], int, float[], int, int, int[], int, int);
    method public static int visibilityTest(float[], int, float[], int, char[], int, int);
  }

}

package android.os {

  public abstract class AsyncTask<Params, Progress, Result> {
    ctor public AsyncTask();
    method public final boolean cancel(boolean);
    method protected abstract Result doInBackground(Params...);
    method public final android.os.AsyncTask<Params,Progress,Result> execute(Params...);
    method public final Result get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
    method public final Result get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public final android.os.AsyncTask.Status getStatus();
    method public final boolean isCancelled();
    method protected void onCancelled();
    method protected void onPostExecute(Result);
    method protected void onPreExecute();
    method protected void onProgressUpdate(Progress...);
    method protected final void publishProgress(Progress...);
  }

  public enum AsyncTask.Status {
    enum_constant public static final android.os.AsyncTask.Status FINISHED;
    enum_constant public static final android.os.AsyncTask.Status PENDING;
    enum_constant public static final android.os.AsyncTask.Status RUNNING;
  }

  public class BadParcelableException extends android.util.AndroidRuntimeException {
    ctor public BadParcelableException(String);
    ctor public BadParcelableException(Exception);
  }

  public class BatteryManager {
    ctor public BatteryManager();
    field public static final int BATTERY_HEALTH_DEAD = 4; // 0x4
    field public static final int BATTERY_HEALTH_GOOD = 2; // 0x2
    field public static final int BATTERY_HEALTH_OVERHEAT = 3; // 0x3
    field public static final int BATTERY_HEALTH_OVER_VOLTAGE = 5; // 0x5
    field public static final int BATTERY_HEALTH_UNKNOWN = 1; // 0x1
    field public static final int BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6; // 0x6
    field public static final int BATTERY_PLUGGED_AC = 1; // 0x1
    field public static final int BATTERY_PLUGGED_USB = 2; // 0x2
    field public static final int BATTERY_STATUS_CHARGING = 2; // 0x2
    field public static final int BATTERY_STATUS_DISCHARGING = 3; // 0x3
    field public static final int BATTERY_STATUS_FULL = 5; // 0x5
    field public static final int BATTERY_STATUS_NOT_CHARGING = 4; // 0x4
    field public static final int BATTERY_STATUS_UNKNOWN = 1; // 0x1
  }

  public class Binder implements android.os.IBinder {
    ctor public Binder();
    method public void attachInterface(android.os.IInterface, String);
    method public static final long clearCallingIdentity();
    method public void dump(java.io.FileDescriptor, String[]);
    method protected void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]);
    method public static final void flushPendingCommands();
    method public static final int getCallingPid();
    method public static final int getCallingUid();
    method public String getInterfaceDescriptor();
    method public boolean isBinderAlive();
    method public static final void joinThreadPool();
    method public void linkToDeath(android.os.IBinder.DeathRecipient, int);
    method protected boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
    method public boolean pingBinder();
    method public android.os.IInterface queryLocalInterface(String);
    method public static final void restoreCallingIdentity(long);
    method public final boolean transact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
    method public boolean unlinkToDeath(android.os.IBinder.DeathRecipient, int);
  }

  public class Build {
    ctor public Build();
    field public static final String BOARD;
    field public static final String BRAND;
    field public static final String DEVICE;
    field public static final String DISPLAY;
    field public static final String FINGERPRINT;
    field public static final String HOST;
    field public static final String ID;
    field public static final String MODEL;
    field public static final String PRODUCT;
    field public static final String TAGS;
    field public static final long TIME;
    field public static final String TYPE;
    field public static final String USER;
  }

  public static class Build.VERSION {
    ctor public Build.VERSION();
    field public static final String INCREMENTAL;
    field public static final String RELEASE;
    field public static final String SDK;
  }

  public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
    ctor public Bundle();
    ctor public Bundle(ClassLoader);
    ctor public Bundle(int);
    ctor public Bundle(android.os.Bundle);
    method public void clear();
    method public Object clone();
    method public boolean containsKey(String);
    method public int describeContents();
    method public Object get(String);
    method public boolean getBoolean(String);
    method public boolean getBoolean(String, boolean);
    method public boolean[] getBooleanArray(String);
    method public android.os.Bundle getBundle(String);
    method public byte getByte(String);
    method public Byte getByte(String, byte);
    method public byte[] getByteArray(String);
    method public char getChar(String);
    method public char getChar(String, char);
    method public char[] getCharArray(String);
    method public CharSequence getCharSequence(String);
    method public double getDouble(String);
    method public double getDouble(String, double);
    method public double[] getDoubleArray(String);
    method public float getFloat(String);
    method public float getFloat(String, float);
    method public float[] getFloatArray(String);
    method public int getInt(String);
    method public int getInt(String, int);
    method public int[] getIntArray(String);
    method public java.util.ArrayList<java.lang.Integer> getIntegerArrayList(String);
    method public long getLong(String);
    method public long getLong(String, long);
    method public long[] getLongArray(String);
    method public <T extends android.os.Parcelable> T getParcelable(String);
    method public android.os.Parcelable[] getParcelableArray(String);
    method public <T extends android.os.Parcelable> java.util.ArrayList<T> getParcelableArrayList(String);
    method public java.io.Serializable getSerializable(String);
    method public short getShort(String);
    method public short getShort(String, short);
    method public short[] getShortArray(String);
    method public <T extends android.os.Parcelable> android.util.SparseArray<T> getSparseParcelableArray(String);
    method public String getString(String);
    method public String[] getStringArray(String);
    method public java.util.ArrayList<java.lang.String> getStringArrayList(String);
    method public boolean hasFileDescriptors();
    method public boolean isEmpty();
    method public java.util.Set<java.lang.String> keySet();
    method public void putAll(android.os.Bundle);
    method public void putBoolean(String, boolean);
    method public void putBooleanArray(String, boolean[]);
    method public void putBundle(String, android.os.Bundle);
    method public void putByte(String, byte);
    method public void putByteArray(String, byte[]);
    method public void putChar(String, char);
    method public void putCharArray(String, char[]);
    method public void putCharSequence(String, CharSequence);
    method public void putDouble(String, double);
    method public void putDoubleArray(String, double[]);
    method public void putFloat(String, float);
    method public void putFloatArray(String, float[]);
    method public void putInt(String, int);
    method public void putIntArray(String, int[]);
    method public void putIntegerArrayList(String, java.util.ArrayList<java.lang.Integer>);
    method public void putLong(String, long);
    method public void putLongArray(String, long[]);
    method public void putParcelable(String, android.os.Parcelable);
    method public void putParcelableArray(String, android.os.Parcelable[]);
    method public void putParcelableArrayList(String, java.util.ArrayList<? extends android.os.Parcelable>);
    method public void putSerializable(String, java.io.Serializable);
    method public void putShort(String, short);
    method public void putShortArray(String, short[]);
    method public void putSparseParcelableArray(String, android.util.SparseArray<? extends android.os.Parcelable>);
    method public void putString(String, String);
    method public void putStringArray(String, String[]);
    method public void putStringArrayList(String, java.util.ArrayList<java.lang.String>);
    method public void readFromParcel(android.os.Parcel);
    method public void remove(String);
    method public void setClassLoader(ClassLoader);
    method public int size();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.Bundle> CREATOR;
    field public static final android.os.Bundle EMPTY;
  }

  public class ConditionVariable {
    ctor public ConditionVariable();
    ctor public ConditionVariable(boolean);
    method public void block();
    method public boolean block(long);
    method public void close();
    method public void open();
  }

  public abstract class CountDownTimer {
    ctor public CountDownTimer(long, long);
    method public final void cancel();
    method public abstract void onFinish();
    method public abstract void onTick(long);
    method public final android.os.CountDownTimer start();
  }

  public class DeadObjectException extends android.os.RemoteException {
    ctor public DeadObjectException();
  }

  public final class Debug {
    method public static void changeDebugPort(int);
    method public static void dumpHprofData(String) throws java.io.IOException;
    method public static void enableEmulatorTraceOutput();
    method public static int getBinderDeathObjectCount();
    method public static int getBinderLocalObjectCount();
    method public static int getBinderProxyObjectCount();
    method public static int getBinderReceivedTransactions();
    method public static int getBinderSentTransactions();
    method public static int getGlobalAllocCount();
    method public static int getGlobalAllocSize();
    method public static int getGlobalExternalAllocCount();
    method public static int getGlobalExternalAllocSize();
    method public static int getGlobalExternalFreedCount();
    method public static int getGlobalExternalFreedSize();
    method public static int getGlobalFreedCount();
    method public static int getGlobalFreedSize();
    method public static int getGlobalGcInvocationCount();
    method public static int getLoadedClassCount();
    method public static void getMemoryInfo(android.os.Debug.MemoryInfo);
    method public static long getNativeHeapAllocatedSize();
    method public static long getNativeHeapFreeSize();
    method public static long getNativeHeapSize();
    method public static int getThreadAllocCount();
    method public static int getThreadAllocSize();
    method public static int getThreadExternalAllocCount();
    method public static int getThreadExternalAllocSize();
    method public static int getThreadGcInvocationCount();
    method public static boolean isDebuggerConnected();
    method public static void printLoadedClasses(int);
    method public static void resetAllCounts();
    method public static void resetGlobalAllocCount();
    method public static void resetGlobalAllocSize();
    method public static void resetGlobalExternalAllocCount();
    method public static void resetGlobalExternalAllocSize();
    method public static void resetGlobalExternalFreedCount();
    method public static void resetGlobalExternalFreedSize();
    method public static void resetGlobalFreedCount();
    method public static void resetGlobalFreedSize();
    method public static void resetGlobalGcInvocationCount();
    method public static void resetThreadAllocCount();
    method public static void resetThreadAllocSize();
    method public static void resetThreadExternalAllocCount();
    method public static void resetThreadExternalAllocSize();
    method public static void resetThreadGcInvocationCount();
    method public static int setAllocationLimit(int);
    method public static int setGlobalAllocationLimit(int);
    method public static void startAllocCounting();
    method public static void startMethodTracing();
    method public static void startMethodTracing(String);
    method public static void startMethodTracing(String, int);
    method public static void startMethodTracing(String, int, int);
    method public static void startNativeTracing();
    method public static void stopAllocCounting();
    method public static void stopMethodTracing();
    method public static void stopNativeTracing();
    method public static long threadCpuTimeNanos();
    method public static void waitForDebugger();
    method public static boolean waitingForDebugger();
    field public static final int SHOW_CLASSLOADER = 2; // 0x2
    field public static final int SHOW_FULL_DETAIL = 1; // 0x1
    field public static final int SHOW_INITIALIZED = 4; // 0x4
    field public static final int TRACE_COUNT_ALLOCS = 1; // 0x1
  }

  public static class Debug.InstructionCount {
    ctor public Debug.InstructionCount();
    method public boolean collect();
    method public int globalMethodInvocations();
    method public int globalTotal();
    method public boolean resetAndStart();
  }

  public static class Debug.MemoryInfo {
    ctor public Debug.MemoryInfo();
    field public int dalvikPrivateDirty;
    field public int dalvikPss;
    field public int dalvikSharedDirty;
    field public int nativePrivateDirty;
    field public int nativePss;
    field public int nativeSharedDirty;
    field public int otherPrivateDirty;
    field public int otherPss;
    field public int otherSharedDirty;
  }

  public class Environment {
    ctor public Environment();
    method public static java.io.File getDataDirectory();
    method public static java.io.File getDownloadCacheDirectory();
    method public static java.io.File getExternalStorageDirectory();
    method public static String getExternalStorageState();
    method public static java.io.File getRootDirectory();
    field public static final String MEDIA_BAD_REMOVAL = "bad_removal";
    field public static final String MEDIA_CHECKING = "checking";
    field public static final String MEDIA_MOUNTED = "mounted";
    field public static final String MEDIA_MOUNTED_READ_ONLY = "mounted_ro";
    field public static final String MEDIA_NOFS = "nofs";
    field public static final String MEDIA_REMOVED = "removed";
    field public static final String MEDIA_SHARED = "shared";
    field public static final String MEDIA_UNMOUNTABLE = "unmountable";
    field public static final String MEDIA_UNMOUNTED = "unmounted";
  }

  public abstract class FileObserver {
    ctor public FileObserver(String);
    ctor public FileObserver(String, int);
    method protected void finalize();
    method public abstract void onEvent(int, String);
    method public void startWatching();
    method public void stopWatching();
    field public static final int ACCESS = 1; // 0x1
    field public static final int ALL_EVENTS = 4095; // 0xfff
    field public static final int ATTRIB = 4; // 0x4
    field public static final int CLOSE_NOWRITE = 16; // 0x10
    field public static final int CLOSE_WRITE = 8; // 0x8
    field public static final int CREATE = 256; // 0x100
    field public static final int DELETE = 512; // 0x200
    field public static final int DELETE_SELF = 1024; // 0x400
    field public static final int MODIFY = 2; // 0x2
    field public static final int MOVED_FROM = 64; // 0x40
    field public static final int MOVED_TO = 128; // 0x80
    field public static final int MOVE_SELF = 2048; // 0x800
    field public static final int OPEN = 32; // 0x20
  }

  public class Handler {
    ctor public Handler();
    ctor public Handler(android.os.Handler.Callback);
    ctor public Handler(android.os.Looper);
    ctor public Handler(android.os.Looper, android.os.Handler.Callback);
    method public void dispatchMessage(android.os.Message);
    method public final void dump(android.util.Printer, String);
    method public final android.os.Looper getLooper();
    method public void handleMessage(android.os.Message);
    method public final boolean hasMessages(int);
    method public final boolean hasMessages(int, Object);
    method public final android.os.Message obtainMessage();
    method public final android.os.Message obtainMessage(int);
    method public final android.os.Message obtainMessage(int, Object);
    method public final android.os.Message obtainMessage(int, int, int);
    method public final android.os.Message obtainMessage(int, int, int, Object);
    method public final boolean post(Runnable);
    method public final boolean postAtFrontOfQueue(Runnable);
    method public final boolean postAtTime(Runnable, long);
    method public final boolean postAtTime(Runnable, Object, long);
    method public final boolean postDelayed(Runnable, long);
    method public final void removeCallbacks(Runnable);
    method public final void removeCallbacks(Runnable, Object);
    method public final void removeCallbacksAndMessages(Object);
    method public final void removeMessages(int);
    method public final void removeMessages(int, Object);
    method public final boolean sendEmptyMessage(int);
    method public final boolean sendEmptyMessageAtTime(int, long);
    method public final boolean sendEmptyMessageDelayed(int, long);
    method public final boolean sendMessage(android.os.Message);
    method public final boolean sendMessageAtFrontOfQueue(android.os.Message);
    method public boolean sendMessageAtTime(android.os.Message, long);
    method public final boolean sendMessageDelayed(android.os.Message, long);
  }

  public static interface Handler.Callback {
    method public boolean handleMessage(android.os.Message);
  }

  public class HandlerThread extends java.lang.Thread {
    ctor public HandlerThread(String);
    ctor public HandlerThread(String, int);
    method public android.os.Looper getLooper();
    method public int getThreadId();
    method protected void onLooperPrepared();
  }

  public interface IBinder {
    method public void dump(java.io.FileDescriptor, String[]) throws android.os.RemoteException;
    method public String getInterfaceDescriptor() throws android.os.RemoteException;
    method public boolean isBinderAlive();
    method public void linkToDeath(android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException;
    method public boolean pingBinder();
    method public android.os.IInterface queryLocalInterface(String);
    method public boolean transact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
    method public boolean unlinkToDeath(android.os.IBinder.DeathRecipient, int);
    field public static final int DUMP_TRANSACTION = 1598311760; // 0x5f444d50
    field public static final int FIRST_CALL_TRANSACTION = 1; // 0x1
    field public static final int FLAG_ONEWAY = 1; // 0x1
    field public static final int INTERFACE_TRANSACTION = 1598968902; // 0x5f4e5446
    field public static final int LAST_CALL_TRANSACTION = 16777215; // 0xffffff
    field public static final int PING_TRANSACTION = 1599098439; // 0x5f504e47
  }

  public static interface IBinder.DeathRecipient {
    method public void binderDied();
  }

  public interface IInterface {
    method public android.os.IBinder asBinder();
  }

  public class Looper {
    method public void dump(android.util.Printer, String);
    method public static final android.os.Looper getMainLooper();
    method public Thread getThread();
    method public static final void loop();
    method public static final android.os.Looper myLooper();
    method public static final android.os.MessageQueue myQueue();
    method public static final void prepare();
    method public static final void prepareMainLooper();
    method public void quit();
    method public void setMessageLogging(android.util.Printer);
  }

  public class MemoryFile {
    ctor public MemoryFile(String, int);
    method public boolean allowPurging(boolean) throws java.io.IOException;
    method public void close();
    method protected void finalize();
    method public java.io.InputStream getInputStream();
    method public java.io.OutputStream getOutputStream();
    method public boolean isPurgingAllowed();
    method public int length();
    method public int readBytes(byte[], int, int, int) throws java.io.IOException;
    method public void writeBytes(byte[], int, int, int) throws java.io.IOException;
  }

  public final class Message implements android.os.Parcelable {
    ctor public Message();
    method public void copyFrom(android.os.Message);
    method public int describeContents();
    method public Runnable getCallback();
    method public android.os.Bundle getData();
    method public android.os.Handler getTarget();
    method public long getWhen();
    method public static android.os.Message obtain();
    method public static android.os.Message obtain(android.os.Message);
    method public static android.os.Message obtain(android.os.Handler);
    method public static android.os.Message obtain(android.os.Handler, Runnable);
    method public static android.os.Message obtain(android.os.Handler, int);
    method public static android.os.Message obtain(android.os.Handler, int, Object);
    method public static android.os.Message obtain(android.os.Handler, int, int, int);
    method public static android.os.Message obtain(android.os.Handler, int, int, int, Object);
    method public android.os.Bundle peekData();
    method public void recycle();
    method public void sendToTarget();
    method public void setData(android.os.Bundle);
    method public void setTarget(android.os.Handler);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.Message> CREATOR;
    field public int arg1;
    field public int arg2;
    field public Object obj;
    field public android.os.Messenger replyTo;
    field public int what;
  }

  public class MessageQueue {
    method public final void addIdleHandler(android.os.MessageQueue.IdleHandler);
    method public final void removeIdleHandler(android.os.MessageQueue.IdleHandler);
  }

  public static interface MessageQueue.IdleHandler {
    method public boolean queueIdle();
  }

  public final class Messenger implements android.os.Parcelable {
    ctor public Messenger(android.os.Handler);
    ctor public Messenger(android.os.IBinder);
    method public int describeContents();
    method public android.os.IBinder getBinder();
    method public static android.os.Messenger readMessengerOrNullFromParcel(android.os.Parcel);
    method public void send(android.os.Message) throws android.os.RemoteException;
    method public static void writeMessengerOrNullToParcel(android.os.Messenger, android.os.Parcel);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.Messenger> CREATOR;
  }

  public final class Parcel {
    method public void appendFrom(android.os.Parcel, int, int);
    method public android.os.IBinder[] createBinderArray();
    method public java.util.ArrayList<android.os.IBinder> createBinderArrayList();
    method public boolean[] createBooleanArray();
    method public byte[] createByteArray();
    method public char[] createCharArray();
    method public double[] createDoubleArray();
    method public float[] createFloatArray();
    method public int[] createIntArray();
    method public long[] createLongArray();
    method public String[] createStringArray();
    method public java.util.ArrayList<java.lang.String> createStringArrayList();
    method public <T> T[] createTypedArray(android.os.Parcelable.Creator<T>);
    method public <T> java.util.ArrayList<T> createTypedArrayList(android.os.Parcelable.Creator<T>);
    method public int dataAvail();
    method public int dataCapacity();
    method public int dataPosition();
    method public int dataSize();
    method public void enforceInterface(String);
    method public boolean hasFileDescriptors();
    method public byte[] marshall();
    method public static android.os.Parcel obtain();
    method protected static android.os.Parcel obtain(int);
    method public Object[] readArray(ClassLoader);
    method public java.util.ArrayList readArrayList(ClassLoader);
    method public void readBinderArray(android.os.IBinder[]);
    method public void readBinderList(java.util.List<android.os.IBinder>);
    method public void readBooleanArray(boolean[]);
    method public android.os.Bundle readBundle();
    method public android.os.Bundle readBundle(ClassLoader);
    method public byte readByte();
    method public void readByteArray(byte[]);
    method public void readCharArray(char[]);
    method public double readDouble();
    method public void readDoubleArray(double[]);
    method public void readException();
    method public void readException(int, String);
    method public android.os.ParcelFileDescriptor readFileDescriptor();
    method public float readFloat();
    method public void readFloatArray(float[]);
    method public java.util.HashMap readHashMap(ClassLoader);
    method public int readInt();
    method public void readIntArray(int[]);
    method public void readList(java.util.List, ClassLoader);
    method public long readLong();
    method public void readLongArray(long[]);
    method public void readMap(java.util.Map, ClassLoader);
    method public <T extends android.os.Parcelable> T readParcelable(ClassLoader);
    method public android.os.Parcelable[] readParcelableArray(ClassLoader);
    method public java.io.Serializable readSerializable();
    method public android.util.SparseArray readSparseArray(ClassLoader);
    method public android.util.SparseBooleanArray readSparseBooleanArray();
    method public String readString();
    method public void readStringArray(String[]);
    method public void readStringList(java.util.List<java.lang.String>);
    method public android.os.IBinder readStrongBinder();
    method public <T> void readTypedArray(T[], android.os.Parcelable.Creator<T>);
    method public <T> void readTypedList(java.util.List<T>, android.os.Parcelable.Creator<T>);
    method public Object readValue(ClassLoader);
    method public void recycle();
    method public void setDataCapacity(int);
    method public void setDataPosition(int);
    method public void setDataSize(int);
    method public void unmarshall(byte[], int, int);
    method public void writeArray(Object[]);
    method public void writeBinderArray(android.os.IBinder[]);
    method public void writeBinderList(java.util.List<android.os.IBinder>);
    method public void writeBooleanArray(boolean[]);
    method public void writeBundle(android.os.Bundle);
    method public void writeByte(byte);
    method public void writeByteArray(byte[]);
    method public void writeByteArray(byte[], int, int);
    method public void writeCharArray(char[]);
    method public void writeDouble(double);
    method public void writeDoubleArray(double[]);
    method public void writeException(Exception);
    method public void writeFileDescriptor(java.io.FileDescriptor);
    method public void writeFloat(float);
    method public void writeFloatArray(float[]);
    method public void writeInt(int);
    method public void writeIntArray(int[]);
    method public void writeInterfaceToken(String);
    method public void writeList(java.util.List);
    method public void writeLong(long);
    method public void writeLongArray(long[]);
    method public void writeMap(java.util.Map);
    method public void writeNoException();
    method public void writeParcelable(android.os.Parcelable, int);
    method public <T extends android.os.Parcelable> void writeParcelableArray(T[], int);
    method public void writeSerializable(java.io.Serializable);
    method public void writeSparseArray(android.util.SparseArray<java.lang.Object>);
    method public void writeSparseBooleanArray(android.util.SparseBooleanArray);
    method public void writeString(String);
    method public void writeStringArray(String[]);
    method public void writeStringList(java.util.List<java.lang.String>);
    method public void writeStrongBinder(android.os.IBinder);
    method public void writeStrongInterface(android.os.IInterface);
    method public <T extends android.os.Parcelable> void writeTypedArray(T[], int);
    method public <T extends android.os.Parcelable> void writeTypedList(java.util.List<T>);
    method public void writeValue(Object);
    field public static final android.os.Parcelable.Creator<java.lang.String> STRING_CREATOR;
  }

  public class ParcelFileDescriptor implements android.os.Parcelable {
    ctor public ParcelFileDescriptor(android.os.ParcelFileDescriptor);
    method public void close() throws java.io.IOException;
    method public int describeContents();
    method public static android.os.ParcelFileDescriptor fromSocket(java.net.Socket);
    method public java.io.FileDescriptor getFileDescriptor();
    method public long getStatSize();
    method public static android.os.ParcelFileDescriptor open(java.io.File, int) throws java.io.FileNotFoundException;
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.ParcelFileDescriptor> CREATOR;
    field public static final int MODE_APPEND = 33554432; // 0x2000000
    field public static final int MODE_CREATE = 134217728; // 0x8000000
    field public static final int MODE_READ_ONLY = 268435456; // 0x10000000
    field public static final int MODE_READ_WRITE = 805306368; // 0x30000000
    field public static final int MODE_TRUNCATE = 67108864; // 0x4000000
    field public static final int MODE_WORLD_READABLE = 1; // 0x1
    field public static final int MODE_WORLD_WRITEABLE = 2; // 0x2
    field public static final int MODE_WRITE_ONLY = 536870912; // 0x20000000
  }

  public static class ParcelFileDescriptor.AutoCloseInputStream extends java.io.FileInputStream {
    ctor public ParcelFileDescriptor.AutoCloseInputStream(android.os.ParcelFileDescriptor);
  }

  public static class ParcelFileDescriptor.AutoCloseOutputStream extends java.io.FileOutputStream {
    ctor public ParcelFileDescriptor.AutoCloseOutputStream(android.os.ParcelFileDescriptor);
  }

  public class ParcelFormatException extends java.lang.RuntimeException {
    ctor public ParcelFormatException();
    ctor public ParcelFormatException(String);
  }

  public interface Parcelable {
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CONTENTS_FILE_DESCRIPTOR = 1; // 0x1
    field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
  }

  public static interface Parcelable.Creator<T> {
    method public T createFromParcel(android.os.Parcel);
    method public T[] newArray(int);
  }

  public class PatternMatcher implements android.os.Parcelable {
    ctor public PatternMatcher(String, int);
    ctor public PatternMatcher(android.os.Parcel);
    method public int describeContents();
    method public final String getPath();
    method public final int getType();
    method public boolean match(String);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.PatternMatcher> CREATOR;
    field public static final int PATTERN_LITERAL = 0; // 0x0
    field public static final int PATTERN_PREFIX = 1; // 0x1
    field public static final int PATTERN_SIMPLE_GLOB = 2; // 0x2
  }

  public class PowerManager {
    method public void goToSleep(long);
    method public android.os.PowerManager.WakeLock newWakeLock(int, String);
    method public void userActivity(long, boolean);
    field public static final int ACQUIRE_CAUSES_WAKEUP = 268435456; // 0x10000000
    field public static final int FULL_WAKE_LOCK = 26; // 0x1a
    field public static final int ON_AFTER_RELEASE = 536870912; // 0x20000000
    field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1
    field public static final int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa
    field public static final int SCREEN_DIM_WAKE_LOCK = 6; // 0x6
  }

  public class PowerManager.WakeLock {
    method public void acquire();
    method public void acquire(long);
    method public boolean isHeld();
    method public void release();
    method public void setReferenceCounted(boolean);
  }

  public class Process {
    ctor public Process();
    method public static final long getElapsedCpuTime();
    method public static final int getGidForName(String);
    method public static final int getThreadPriority(int) throws java.lang.IllegalArgumentException;
    method public static final int getUidForName(String);
    method public static final void killProcess(int);
    method public static final int myPid();
    method public static final int myTid();
    method public static final int myUid();
    method public static final void sendSignal(int, int);
    method public static final void setThreadPriority(int, int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
    method public static final void setThreadPriority(int) throws java.lang.IllegalArgumentException, java.lang.SecurityException;
    method public static final boolean supportsProcesses();
    field public static final int BLUETOOTH_GID = 2000; // 0x7d0
    field public static final int FIRST_APPLICATION_UID = 10000; // 0x2710
    field public static final int LAST_APPLICATION_UID = 99999; // 0x1869f
    field public static final int PHONE_UID = 1001; // 0x3e9
    field public static final int SIGNAL_KILL = 9; // 0x9
    field public static final int SIGNAL_QUIT = 3; // 0x3
    field public static final int SIGNAL_USR1 = 10; // 0xa
    field public static final int SYSTEM_UID = 1000; // 0x3e8
    field public static final int THREAD_PRIORITY_AUDIO = -16; // 0xfffffff0
    field public static final int THREAD_PRIORITY_BACKGROUND = 10; // 0xa
    field public static final int THREAD_PRIORITY_DEFAULT = 0; // 0x0
    field public static final int THREAD_PRIORITY_DISPLAY = -4; // 0xfffffffc
    field public static final int THREAD_PRIORITY_FOREGROUND = -2; // 0xfffffffe
    field public static final int THREAD_PRIORITY_LESS_FAVORABLE = 1; // 0x1
    field public static final int THREAD_PRIORITY_LOWEST = 19; // 0x13
    field public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1; // 0xffffffff
    field public static final int THREAD_PRIORITY_URGENT_AUDIO = -19; // 0xffffffed
    field public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8; // 0xfffffff8
  }

  public class RemoteCallbackList<E extends android.os.IInterface> {
    ctor public RemoteCallbackList();
    method public int beginBroadcast();
    method public void finishBroadcast();
    method public E getBroadcastItem(int);
    method public void kill();
    method public void onCallbackDied(E);
    method public boolean register(E);
    method public boolean unregister(E);
  }

  public class RemoteException extends android.util.AndroidException {
    ctor public RemoteException();
  }

  public class ResultReceiver implements android.os.Parcelable {
    ctor public ResultReceiver(android.os.Handler);
    method public int describeContents();
    method protected void onReceiveResult(int, android.os.Bundle);
    method public void send(int, android.os.Bundle);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.os.ResultReceiver> CREATOR;
  }

  public class StatFs {
    ctor public StatFs(String);
    method protected void finalize();
    method public int getAvailableBlocks();
    method public int getBlockCount();
    method public int getBlockSize();
    method public int getFreeBlocks();
    method public void restat(String);
  }

  public final class SystemClock {
    method public static long currentThreadTimeMillis();
    method public static long elapsedRealtime();
    method public static boolean setCurrentTimeMillis(long);
    method public static void sleep(long);
    method public static long uptimeMillis();
  }

  public abstract class TokenWatcher {
    ctor public TokenWatcher(android.os.Handler, String);
    method public void acquire(android.os.IBinder, String);
    method public abstract void acquired();
    method public void cleanup(android.os.IBinder, boolean);
    method public void dump();
    method public boolean isAcquired();
    method public void release(android.os.IBinder);
    method public abstract void released();
  }

  public class Vibrator {
    method public void cancel();
    method public void vibrate(long);
    method public void vibrate(long[], int);
  }

}

package android.preference {

  public class CheckBoxPreference extends android.preference.Preference {
    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
    ctor public CheckBoxPreference(android.content.Context);
    method public boolean getDisableDependentsState();
    method public CharSequence getSummaryOff();
    method public CharSequence getSummaryOn();
    method public boolean isChecked();
    method public void setChecked(boolean);
    method public void setDisableDependentsState(boolean);
    method public void setSummaryOff(CharSequence);
    method public void setSummaryOff(int);
    method public void setSummaryOn(CharSequence);
    method public void setSummaryOn(int);
  }

  public abstract class DialogPreference extends android.preference.Preference implements android.content.DialogInterface.OnClickListener android.content.DialogInterface.OnDismissListener android.preference.PreferenceManager.OnActivityDestroyListener {
    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
    method public android.app.Dialog getDialog();
    method public android.graphics.drawable.Drawable getDialogIcon();
    method public int getDialogLayoutResource();
    method public CharSequence getDialogMessage();
    method public CharSequence getDialogTitle();
    method public CharSequence getNegativeButtonText();
    method public CharSequence getPositiveButtonText();
    method public void onActivityDestroy();
    method protected void onBindDialogView(android.view.View);
    method public void onClick(android.content.DialogInterface, int);
    method protected android.view.View onCreateDialogView();
    method protected void onDialogClosed(boolean);
    method public void onDismiss(android.content.DialogInterface);
    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
    method public void setDialogIcon(android.graphics.drawable.Drawable);
    method public void setDialogIcon(int);
    method public void setDialogLayoutResource(int);
    method public void setDialogMessage(CharSequence);
    method public void setDialogMessage(int);
    method public void setDialogTitle(CharSequence);
    method public void setDialogTitle(int);
    method public void setNegativeButtonText(CharSequence);
    method public void setNegativeButtonText(int);
    method public void setPositiveButtonText(CharSequence);
    method public void setPositiveButtonText(int);
    method protected void showDialog(android.os.Bundle);
  }

  public class EditTextPreference extends android.preference.DialogPreference {
    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
    ctor public EditTextPreference(android.content.Context);
    method public android.widget.EditText getEditText();
    method public String getText();
    method protected void onAddEditTextToDialogView(android.view.View, android.widget.EditText);
    method public void setText(String);
  }

  public class ListPreference extends android.preference.DialogPreference {
    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
    ctor public ListPreference(android.content.Context);
    method public int findIndexOfValue(String);
    method public CharSequence[] getEntries();
    method public CharSequence getEntry();
    method public CharSequence[] getEntryValues();
    method public String getValue();
    method public void setEntries(CharSequence[]);
    method public void setEntries(int);
    method public void setEntryValues(CharSequence[]);
    method public void setEntryValues(int);
    method public void setValue(String);
    method public void setValueIndex(int);
  }

  public class Preference implements java.lang.Comparable<android.preference.Preference> {
    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
    ctor public Preference(android.content.Context, android.util.AttributeSet);
    ctor public Preference(android.content.Context);
    method protected boolean callChangeListener(Object);
    method public int compareTo(android.preference.Preference);
    method protected android.preference.Preference findPreferenceInHierarchy(String);
    method public android.content.Context getContext();
    method public String getDependency();
    method public android.content.SharedPreferences.Editor getEditor();
    method public android.content.Intent getIntent();
    method public String getKey();
    method public int getLayoutResource();
    method public android.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
    method public android.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
    method public int getOrder();
    method protected boolean getPersistedBoolean(boolean);
    method protected float getPersistedFloat(float);
    method protected int getPersistedInt(int);
    method protected long getPersistedLong(long);
    method protected String getPersistedString(String);
    method public android.preference.PreferenceManager getPreferenceManager();
    method public android.content.SharedPreferences getSharedPreferences();
    method public boolean getShouldDisableView();
    method public CharSequence getSummary();
    method public CharSequence getTitle();
    method public android.view.View getView(android.view.View, android.view.ViewGroup);
    method public int getWidgetLayoutResource();
    method public boolean hasKey();
    method public boolean isEnabled();
    method public boolean isPersistent();
    method public boolean isSelectable();
    method protected void notifyChanged();
    method public void notifyDependencyChange(boolean);
    method protected void notifyHierarchyChanged();
    method protected void onAttachedToActivity();
    method protected void onAttachedToHierarchy(android.preference.PreferenceManager);
    method protected void onBindView(android.view.View);
    method protected void onClick();
    method protected android.view.View onCreateView(android.view.ViewGroup);
    method public void onDependencyChanged(android.preference.Preference, boolean);
    method protected Object onGetDefaultValue(android.content.res.TypedArray, int);
    method protected void onPrepareForRemoval();
    method protected void onRestoreInstanceState(android.os.Parcelable);
    method protected android.os.Parcelable onSaveInstanceState();
    method protected void onSetInitialValue(boolean, Object);
    method protected boolean persistBoolean(boolean);
    method protected boolean persistFloat(float);
    method protected boolean persistInt(int);
    method protected boolean persistLong(long);
    method protected boolean persistString(String);
    method public void restoreHierarchyState(android.os.Bundle);
    method public void saveHierarchyState(android.os.Bundle);
    method public void setDefaultValue(Object);
    method public void setDependency(String);
    method public void setEnabled(boolean);
    method public void setIntent(android.content.Intent);
    method public void setKey(String);
    method public void setLayoutResource(int);
    method public void setOnPreferenceChangeListener(android.preference.Preference.OnPreferenceChangeListener);
    method public void setOnPreferenceClickListener(android.preference.Preference.OnPreferenceClickListener);
    method public void setOrder(int);
    method public void setPersistent(boolean);
    method public void setSelectable(boolean);
    method public void setShouldDisableView(boolean);
    method public void setSummary(CharSequence);
    method public void setSummary(int);
    method public void setTitle(CharSequence);
    method public void setTitle(int);
    method public void setWidgetLayoutResource(int);
    method public boolean shouldCommit();
    method public boolean shouldDisableDependents();
    method protected boolean shouldPersist();
    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
  }

  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
    ctor public Preference.BaseSavedState(android.os.Parcel);
    ctor public Preference.BaseSavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<android.preference.Preference.BaseSavedState> CREATOR;
  }

  public static interface Preference.OnPreferenceChangeListener {
    method public boolean onPreferenceChange(android.preference.Preference, Object);
  }

  public static interface Preference.OnPreferenceClickListener {
    method public boolean onPreferenceClick(android.preference.Preference);
  }

  public abstract class PreferenceActivity extends android.app.ListActivity {
    ctor public PreferenceActivity();
    method public void addPreferencesFromIntent(android.content.Intent);
    method public void addPreferencesFromResource(int);
    method public android.preference.Preference findPreference(CharSequence);
    method public android.preference.PreferenceManager getPreferenceManager();
    method public android.preference.PreferenceScreen getPreferenceScreen();
    method public boolean onPreferenceTreeClick(android.preference.PreferenceScreen, android.preference.Preference);
    method public void setPreferenceScreen(android.preference.PreferenceScreen);
  }

  public class PreferenceCategory extends android.preference.PreferenceGroup {
    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
    ctor public PreferenceCategory(android.content.Context);
  }

  public abstract class PreferenceGroup extends android.preference.Preference {
    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
    method public void addItemFromInflater(android.preference.Preference);
    method public boolean addPreference(android.preference.Preference);
    method protected void dispatchRestoreInstanceState(android.os.Bundle);
    method protected void dispatchSaveInstanceState(android.os.Bundle);
    method public android.preference.Preference findPreference(CharSequence);
    method public android.preference.Preference getPreference(int);
    method public int getPreferenceCount();
    method protected boolean isOnSameScreenAsChildren();
    method public boolean isOrderingAsAdded();
    method protected boolean onPrepareAddPreference(android.preference.Preference);
    method public void removeAll();
    method public boolean removePreference(android.preference.Preference);
    method public void setOrderingAsAdded(boolean);
  }

  public class PreferenceManager {
    method public android.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
    method public android.preference.Preference findPreference(CharSequence);
    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
    method public android.content.SharedPreferences getSharedPreferences();
    method public int getSharedPreferencesMode();
    method public String getSharedPreferencesName();
    method public static void setDefaultValues(android.content.Context, int, boolean);
    method public static void setDefaultValues(android.content.Context, String, int, int, boolean);
    method public void setSharedPreferencesMode(int);
    method public void setSharedPreferencesName(String);
    field public static final String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
    field public static final String METADATA_KEY_PREFERENCES = "android.preference";
  }

  public static interface PreferenceManager.OnActivityDestroyListener {
    method public void onActivityDestroy();
  }

  public static interface PreferenceManager.OnActivityResultListener {
    method public boolean onActivityResult(int, int, android.content.Intent);
  }

  public static interface PreferenceManager.OnActivityStopListener {
    method public void onActivityStop();
  }

  public final class PreferenceScreen extends android.preference.PreferenceGroup implements android.widget.AdapterView.OnItemClickListener android.content.DialogInterface.OnDismissListener {
    method public void bind(android.widget.ListView);
    method public android.app.Dialog getDialog();
    method public android.widget.ListAdapter getRootAdapter();
    method protected android.widget.ListAdapter onCreateRootAdapter();
    method public void onDismiss(android.content.DialogInterface);
    method public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
  }

  public class RingtonePreference extends android.preference.Preference implements android.preference.PreferenceManager.OnActivityResultListener {
    ctor public RingtonePreference(android.content.Context, android.util.AttributeSet, int);
    ctor public RingtonePreference(android.content.Context, android.util.AttributeSet);
    ctor public RingtonePreference(android.content.Context);
    method public int getRingtoneType();
    method public boolean getShowDefault();
    method public boolean getShowSilent();
    method public boolean onActivityResult(int, int, android.content.Intent);
    method protected void onPrepareRingtonePickerIntent(android.content.Intent);
    method protected android.net.Uri onRestoreRingtone();
    method protected void onSaveRingtone(android.net.Uri);
    method public void setRingtoneType(int);
    method public void setShowDefault(boolean);
    method public void setShowSilent(boolean);
  }

}

package android.provider {

  public interface BaseColumns {
    field public static final String _COUNT = "_count";
    field public static final String _ID = "_id";
  }

  public class Browser {
    ctor public Browser();
    method public static final void addSearchUrl(android.content.ContentResolver, String);
    method public static final boolean canClearHistory(android.content.ContentResolver);
    method public static final void clearHistory(android.content.ContentResolver);
    method public static final void clearSearches(android.content.ContentResolver);
    method public static final void deleteFromHistory(android.content.ContentResolver, String);
    method public static final void deleteHistoryTimeFrame(android.content.ContentResolver, long, long);
    method public static final android.database.Cursor getAllBookmarks(android.content.ContentResolver) throws java.lang.IllegalStateException;
    method public static final android.database.Cursor getAllVisitedUrls(android.content.ContentResolver) throws java.lang.IllegalStateException;
    method public static final void requestAllIcons(android.content.ContentResolver, String, android.webkit.WebIconDatabase.IconListener);
    method public static final void saveBookmark(android.content.Context, String, String);
    method public static final void sendString(android.content.Context, String);
    method public static final void truncateHistory(android.content.ContentResolver);
    method public static final void updateVisitedHistory(android.content.ContentResolver, String, boolean);
    field public static final android.net.Uri BOOKMARKS_URI;
    field public static final String EXTRA_APPLICATION_ID = "com.android.browser.application_id";
    field public static final String[] HISTORY_PROJECTION;
    field public static final int HISTORY_PROJECTION_BOOKMARK_INDEX = 4; // 0x4
    field public static final int HISTORY_PROJECTION_DATE_INDEX = 3; // 0x3
    field public static final int HISTORY_PROJECTION_FAVICON_INDEX = 6; // 0x6
    field public static final int HISTORY_PROJECTION_ID_INDEX = 0; // 0x0
    field public static final int HISTORY_PROJECTION_TITLE_INDEX = 5; // 0x5
    field public static final int HISTORY_PROJECTION_URL_INDEX = 1; // 0x1
    field public static final int HISTORY_PROJECTION_VISITS_INDEX = 2; // 0x2
    field public static final String INITIAL_ZOOM_LEVEL = "browser.initialZoomLevel";
    field public static final String[] SEARCHES_PROJECTION;
    field public static final int SEARCHES_PROJECTION_DATE_INDEX = 2; // 0x2
    field public static final int SEARCHES_PROJECTION_SEARCH_INDEX = 1; // 0x1
    field public static final android.net.Uri SEARCHES_URI;
    field public static final String[] TRUNCATE_HISTORY_PROJECTION;
    field public static final int TRUNCATE_HISTORY_PROJECTION_ID_INDEX = 0; // 0x0
    field public static final int TRUNCATE_N_OLDEST = 5; // 0x5
  }

  public static class Browser.BookmarkColumns implements android.provider.BaseColumns {
    ctor public Browser.BookmarkColumns();
    field public static final String BOOKMARK = "bookmark";
    field public static final String CREATED = "created";
    field public static final String DATE = "date";
    field public static final String FAVICON = "favicon";
    field public static final String TITLE = "title";
    field public static final String URL = "url";
    field public static final String VISITS = "visits";
  }

  public static class Browser.SearchColumns implements android.provider.BaseColumns {
    ctor public Browser.SearchColumns();
    field public static final String DATE = "date";
    field public static final String SEARCH = "search";
    field public static final String URL = "url";
  }

  public class CallLog {
    ctor public CallLog();
    field public static final String AUTHORITY = "call_log";
    field public static final android.net.Uri CONTENT_URI;
  }

  public static class CallLog.Calls implements android.provider.BaseColumns {
    ctor public CallLog.Calls();
    field public static final String CACHED_NAME = "name";
    field public static final String CACHED_NUMBER_LABEL = "numberlabel";
    field public static final String CACHED_NUMBER_TYPE = "numbertype";
    field public static final android.net.Uri CONTENT_FILTER_URI;
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DATE = "date";
    field public static final String DEFAULT_SORT_ORDER = "date DESC";
    field public static final String DURATION = "duration";
    field public static final int INCOMING_TYPE = 1; // 0x1
    field public static final int MISSED_TYPE = 3; // 0x3
    field public static final String NEW = "new";
    field public static final String NUMBER = "number";
    field public static final int OUTGOING_TYPE = 2; // 0x2
    field public static final String TYPE = "type";
  }

  public class Contacts {
    field public static final String AUTHORITY = "contacts";
    field public static final android.net.Uri CONTENT_URI;
    field public static final int KIND_EMAIL = 1; // 0x1
    field public static final int KIND_IM = 3; // 0x3
    field public static final int KIND_ORGANIZATION = 4; // 0x4
    field public static final int KIND_PHONE = 5; // 0x5
    field public static final int KIND_POSTAL = 2; // 0x2
  }

  public static final class Contacts.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
    method public void addPostalLocation(android.content.Context, long, double, double);
    method public static Object decodeImProtocol(String);
    method public static String encodeCustomImProtocol(String);
    method public static String encodePredefinedImProtocol(int);
    method public static CharSequence getDisplayLabel(android.content.Context, int, int, CharSequence);
    field public static final String CONTENT_EMAIL_ITEM_TYPE = "vnd.android.cursor.item/email";
    field public static final String CONTENT_EMAIL_TYPE = "vnd.android.cursor.dir/email";
    field public static final android.net.Uri CONTENT_EMAIL_URI;
    field public static final String CONTENT_IM_ITEM_TYPE = "vnd.android.cursor.item/jabber-im";
    field public static final String CONTENT_POSTAL_ITEM_TYPE = "vnd.android.cursor.item/postal-address";
    field public static final String CONTENT_POSTAL_TYPE = "vnd.android.cursor.dir/postal-address";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact-methods";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "name ASC";
    field public static final String PERSON_ID = "person";
    field public static final String POSTAL_LOCATION_LATITUDE = "data";
    field public static final String POSTAL_LOCATION_LONGITUDE = "aux_data";
    field public static final int PROTOCOL_AIM = 0; // 0x0
    field public static final int PROTOCOL_GOOGLE_TALK = 5; // 0x5
    field public static final int PROTOCOL_ICQ = 6; // 0x6
    field public static final int PROTOCOL_JABBER = 7; // 0x7
    field public static final int PROTOCOL_MSN = 1; // 0x1
    field public static final int PROTOCOL_QQ = 4; // 0x4
    field public static final int PROTOCOL_SKYPE = 3; // 0x3
    field public static final int PROTOCOL_YAHOO = 2; // 0x2
  }

  public static interface Contacts.ContactMethodsColumns {
    field public static final String AUX_DATA = "aux_data";
    field public static final String DATA = "data";
    field public static final String ISPRIMARY = "isprimary";
    field public static final String KIND = "kind";
    field public static final String LABEL = "label";
    field public static final String TYPE = "type";
    field public static final int TYPE_CUSTOM = 0; // 0x0
    field public static final int TYPE_HOME = 1; // 0x1
    field public static final int TYPE_OTHER = 3; // 0x3
    field public static final int TYPE_WORK = 2; // 0x2
  }

  public static final class Contacts.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_extensions";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact_extensions";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "person, name ASC";
    field public static final String PERSON_ID = "person";
  }

  public static interface Contacts.ExtensionsColumns {
    field public static final String NAME = "name";
    field public static final String VALUE = "value";
  }

  public static final class Contacts.GroupMembership implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
    field public static final String CONTENT_DIRECTORY = "groupmembership";
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroupmembership";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroupmembership";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "group_id ASC";
    field public static final String GROUP_ID = "group_id";
    field public static final String GROUP_SYNC_ACCOUNT = "group_sync_account";
    field public static final String GROUP_SYNC_ID = "group_sync_id";
    field public static final String PERSON_ID = "person";
    field public static final android.net.Uri RAW_CONTENT_URI;
  }

  public static final class Contacts.Groups implements android.provider.BaseColumns android.provider.Contacts.GroupsColumns {
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contactsgroup";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contactsgroup";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "name ASC";
    field public static final android.net.Uri DELETED_CONTENT_URI;
    field public static final String GROUP_ANDROID_STARRED = "Starred in Android";
    field public static final String GROUP_MY_CONTACTS = "Contacts";
  }

  public static interface Contacts.GroupsColumns {
    field public static final String NAME = "name";
    field public static final String NOTES = "notes";
    field public static final String SHOULD_SYNC = "should_sync";
    field public static final String SYSTEM_ID = "system_id";
  }

  public static final class Contacts.Intents {
    ctor public Contacts.Intents();
    field public static final String ATTACH_IMAGE = "com.android.contacts.action.ATTACH_IMAGE";
    field public static final String EXTRA_CREATE_DESCRIPTION = "com.android.contacts.action.CREATE_DESCRIPTION";
    field public static final String EXTRA_FORCE_CREATE = "com.android.contacts.action.FORCE_CREATE";
    field public static final String SEARCH_SUGGESTION_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED";
    field public static final String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED";
    field public static final String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED";
    field public static final String SHOW_OR_CREATE_CONTACT = "com.android.contacts.action.SHOW_OR_CREATE_CONTACT";
  }

  public static final class Contacts.Intents.Insert {
    ctor public Contacts.Intents.Insert();
    field public static final String ACTION = "android.intent.action.INSERT";
    field public static final String COMPANY = "company";
    field public static final String EMAIL = "email";
    field public static final String EMAIL_ISPRIMARY = "email_isprimary";
    field public static final String EMAIL_TYPE = "email_type";
    field public static final String FULL_MODE = "full_mode";
    field public static final String IM_HANDLE = "im_handle";
    field public static final String IM_ISPRIMARY = "im_isprimary";
    field public static final String IM_PROTOCOL = "im_protocol";
    field public static final String JOB_TITLE = "job_title";
    field public static final String NAME = "name";
    field public static final String NOTES = "notes";
    field public static final String PHONE = "phone";
    field public static final String PHONETIC_NAME = "phonetic_name";
    field public static final String PHONE_ISPRIMARY = "phone_isprimary";
    field public static final String PHONE_TYPE = "phone_type";
    field public static final String POSTAL = "postal";
    field public static final String POSTAL_ISPRIMARY = "postal_isprimary";
    field public static final String POSTAL_TYPE = "postal_type";
    field public static final String SECONDARY_EMAIL = "secondary_email";
    field public static final String SECONDARY_EMAIL_TYPE = "secondary_email_type";
    field public static final String SECONDARY_PHONE = "secondary_phone";
    field public static final String SECONDARY_PHONE_TYPE = "secondary_phone_type";
    field public static final String TERTIARY_EMAIL = "tertiary_email";
    field public static final String TERTIARY_EMAIL_TYPE = "tertiary_email_type";
    field public static final String TERTIARY_PHONE = "tertiary_phone";
    field public static final String TERTIARY_PHONE_TYPE = "tertiary_phone_type";
  }

  public static final class Contacts.Intents.UI {
    ctor public Contacts.Intents.UI();
    field public static final String FILTER_CONTACTS_ACTION = "com.android.contacts.action.FILTER_CONTACTS";
    field public static final String FILTER_TEXT_EXTRA_KEY = "com.android.contacts.extra.FILTER_TEXT";
    field public static final String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP";
    field public static final String LIST_ALL_CONTACTS_ACTION = "com.android.contacts.action.LIST_ALL_CONTACTS";
    field public static final String LIST_CONTACTS_WITH_PHONES_ACTION = "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
    field public static final String LIST_DEFAULT = "com.android.contacts.action.LIST_DEFAULT";
    field public static final String LIST_FREQUENT_ACTION = "com.android.contacts.action.LIST_FREQUENT";
    field public static final String LIST_GROUP_ACTION = "com.android.contacts.action.LIST_GROUP";
    field public static final String LIST_STARRED_ACTION = "com.android.contacts.action.LIST_STARRED";
    field public static final String LIST_STREQUENT_ACTION = "com.android.contacts.action.LIST_STREQUENT";
    field public static final String TITLE_EXTRA_KEY = "com.android.contacts.extra.TITLE_EXTRA";
  }

  public static interface Contacts.OrganizationColumns {
    field public static final String COMPANY = "company";
    field public static final String ISPRIMARY = "isprimary";
    field public static final String LABEL = "label";
    field public static final String PERSON_ID = "person";
    field public static final String TITLE = "title";
    field public static final String TYPE = "type";
    field public static final int TYPE_CUSTOM = 0; // 0x0
    field public static final int TYPE_OTHER = 2; // 0x2
    field public static final int TYPE_WORK = 1; // 0x1
  }

  public static final class Contacts.Organizations implements android.provider.BaseColumns android.provider.Contacts.OrganizationColumns {
    method public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence);
    field public static final String CONTENT_DIRECTORY = "organizations";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "company, title, isprimary ASC";
  }

  public static final class Contacts.People implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns android.provider.Contacts.PresenceColumns {
    method public static android.net.Uri addToGroup(android.content.ContentResolver, long, String);
    method public static android.net.Uri addToGroup(android.content.ContentResolver, long, long);
    method public static android.net.Uri addToMyContactsGroup(android.content.ContentResolver, long);
    method public static android.net.Uri createPersonInMyContactsGroup(android.content.ContentResolver, android.content.ContentValues);
    method public static android.graphics.Bitmap loadContactPhoto(android.content.Context, android.net.Uri, int, android.graphics.BitmapFactory.Options);
    method public static void markAsContacted(android.content.ContentResolver, long);
    method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
    method public static android.database.Cursor queryGroups(android.content.ContentResolver, long);
    method public static void setPhotoData(android.content.ContentResolver, android.net.Uri, byte[]);
    field public static final android.net.Uri CONTENT_FILTER_URI;
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/person";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/person";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "name ASC";
    field public static final android.net.Uri DELETED_CONTENT_URI;
    field public static final String PRIMARY_EMAIL_ID = "primary_email";
    field public static final String PRIMARY_ORGANIZATION_ID = "primary_organization";
    field public static final String PRIMARY_PHONE_ID = "primary_phone";
  }

  public static final class Contacts.People.ContactMethods implements android.provider.BaseColumns android.provider.Contacts.ContactMethodsColumns android.provider.Contacts.PeopleColumns {
    field public static final String CONTENT_DIRECTORY = "contact_methods";
    field public static final String DEFAULT_SORT_ORDER = "data ASC";
  }

  public static class Contacts.People.Extensions implements android.provider.BaseColumns android.provider.Contacts.ExtensionsColumns {
    field public static final String CONTENT_DIRECTORY = "extensions";
    field public static final String DEFAULT_SORT_ORDER = "name ASC";
    field public static final String PERSON_ID = "person";
  }

  public static final class Contacts.People.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
    field public static final String CONTENT_DIRECTORY = "phones";
    field public static final String DEFAULT_SORT_ORDER = "number ASC";
  }

  public static interface Contacts.PeopleColumns {
    field public static final String CUSTOM_RINGTONE = "custom_ringtone";
    field public static final String DISPLAY_NAME = "display_name";
    field public static final String LAST_TIME_CONTACTED = "last_time_contacted";
    field public static final String NAME = "name";
    field public static final String NOTES = "notes";
    field public static final String PHONETIC_NAME = "phonetic_name";
    field public static final String PHOTO_VERSION = "photo_version";
    field public static final String SEND_TO_VOICEMAIL = "send_to_voicemail";
    field public static final String STARRED = "starred";
    field public static final String TIMES_CONTACTED = "times_contacted";
  }

  public static final class Contacts.Phones implements android.provider.BaseColumns android.provider.Contacts.PeopleColumns android.provider.Contacts.PhonesColumns {
    method public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence, CharSequence[]);
    method public static CharSequence getDisplayLabel(android.content.Context, int, CharSequence);
    field public static final android.net.Uri CONTENT_FILTER_URL;
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "name ASC";
    field public static final String PERSON_ID = "person";
  }

  public static interface Contacts.PhonesColumns {
    field public static final String ISPRIMARY = "isprimary";
    field public static final String LABEL = "label";
    field public static final String NUMBER = "number";
    field public static final String NUMBER_KEY = "number_key";
    field public static final String TYPE = "type";
    field public static final int TYPE_CUSTOM = 0; // 0x0
    field public static final int TYPE_FAX_HOME = 5; // 0x5
    field public static final int TYPE_FAX_WORK = 4; // 0x4
    field public static final int TYPE_HOME = 1; // 0x1
    field public static final int TYPE_MOBILE = 2; // 0x2
    field public static final int TYPE_OTHER = 7; // 0x7
    field public static final int TYPE_PAGER = 6; // 0x6
    field public static final int TYPE_WORK = 3; // 0x3
  }

  public static final class Contacts.Photos implements android.provider.BaseColumns android.provider.Contacts.PhotosColumns {
    field public static final String CONTENT_DIRECTORY = "photo";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "person ASC";
  }

  public static interface Contacts.PhotosColumns {
    field public static final String DATA = "data";
    field public static final String DOWNLOAD_REQUIRED = "download_required";
    field public static final String EXISTS_ON_SERVER = "exists_on_server";
    field public static final String LOCAL_VERSION = "local_version";
    field public static final String PERSON_ID = "person";
    field public static final String SYNC_ERROR = "sync_error";
  }

  public static interface Contacts.PresenceColumns {
    field public static final String IM_ACCOUNT = "im_account";
    field public static final String IM_HANDLE = "im_handle";
    field public static final String IM_PROTOCOL = "im_protocol";
  }

  public static final class Contacts.Settings implements android.provider.BaseColumns android.provider.Contacts.SettingsColumns {
    method public static String getSetting(android.content.ContentResolver, String, String);
    method public static void setSetting(android.content.ContentResolver, String, String, String);
    field public static final String CONTENT_DIRECTORY = "settings";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "key ASC";
    field public static final String SYNC_EVERYTHING = "syncEverything";
  }

  public static interface Contacts.SettingsColumns {
    field public static final String KEY = "key";
    field public static final String VALUE = "value";
    field public static final String _SYNC_ACCOUNT = "_sync_account";
  }

  public final class LiveFolders implements android.provider.BaseColumns {
    field public static final String ACTION_CREATE_LIVE_FOLDER = "android.intent.action.CREATE_LIVE_FOLDER";
    field public static final String DESCRIPTION = "description";
    field public static final int DISPLAY_MODE_GRID = 1; // 0x1
    field public static final int DISPLAY_MODE_LIST = 2; // 0x2
    field public static final String EXTRA_LIVE_FOLDER_BASE_INTENT = "android.intent.extra.livefolder.BASE_INTENT";
    field public static final String EXTRA_LIVE_FOLDER_DISPLAY_MODE = "android.intent.extra.livefolder.DISPLAY_MODE";
    field public static final String EXTRA_LIVE_FOLDER_ICON = "android.intent.extra.livefolder.ICON";
    field public static final String EXTRA_LIVE_FOLDER_NAME = "android.intent.extra.livefolder.NAME";
    field public static final String ICON_BITMAP = "icon_bitmap";
    field public static final String ICON_PACKAGE = "icon_package";
    field public static final String ICON_RESOURCE = "icon_resource";
    field public static final String INTENT = "intent";
    field public static final String NAME = "name";
  }

  public final class MediaStore {
    ctor public MediaStore();
    method public static android.net.Uri getMediaScannerUri();
    field public static final String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
    field public static final String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
    field public static final String AUTHORITY = "media";
    field public static final String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
    field public static final String EXTRA_MEDIA_ALBUM = "android.intent.extra.album";
    field public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
    field public static final String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus";
    field public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
    field public static final String EXTRA_OUTPUT = "output";
    field public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
    field public static final String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
    field public static final String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
    field public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
    field public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
    field public static final String MEDIA_SCANNER_VOLUME = "volume";
  }

  public static final class MediaStore.Audio {
    ctor public MediaStore.Audio();
    method public static String keyFor(String);
  }

  public static interface MediaStore.Audio.AlbumColumns {
    field public static final String ALBUM = "album";
    field public static final String ALBUM_ART = "album_art";
    field public static final String ALBUM_ID = "album_id";
    field public static final String ALBUM_KEY = "album_key";
    field public static final String ARTIST = "artist";
    field public static final String FIRST_YEAR = "minyear";
    field public static final String LAST_YEAR = "maxyear";
    field public static final String NUMBER_OF_SONGS = "numsongs";
    field public static final String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist";
  }

  public static final class MediaStore.Audio.Albums implements android.provider.BaseColumns android.provider.MediaStore.Audio.AlbumColumns {
    ctor public MediaStore.Audio.Albums();
    method public static android.net.Uri getContentUri(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/albums";
    field public static final String DEFAULT_SORT_ORDER = "album_key";
    field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static interface MediaStore.Audio.ArtistColumns {
    field public static final String ARTIST = "artist";
    field public static final String ARTIST_KEY = "artist_key";
    field public static final String NUMBER_OF_ALBUMS = "number_of_albums";
    field public static final String NUMBER_OF_TRACKS = "number_of_tracks";
  }

  public static final class MediaStore.Audio.Artists implements android.provider.BaseColumns android.provider.MediaStore.Audio.ArtistColumns {
    ctor public MediaStore.Audio.Artists();
    method public static android.net.Uri getContentUri(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/artists";
    field public static final String DEFAULT_SORT_ORDER = "artist_key";
    field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static final class MediaStore.Audio.Artists.Albums implements android.provider.MediaStore.Audio.AlbumColumns {
    ctor public MediaStore.Audio.Artists.Albums();
    method public static android.net.Uri getContentUri(String, long);
  }

  public static interface MediaStore.Audio.AudioColumns extends android.provider.MediaStore.MediaColumns {
    field public static final String ALBUM = "album";
    field public static final String ALBUM_ART = "album_art";
    field public static final String ALBUM_ID = "album_id";
    field public static final String ALBUM_KEY = "album_key";
    field public static final String ARTIST = "artist";
    field public static final String ARTIST_ID = "artist_id";
    field public static final String ARTIST_KEY = "artist_key";
    field public static final String COMPOSER = "composer";
    field public static final String DURATION = "duration";
    field public static final String IS_ALARM = "is_alarm";
    field public static final String IS_MUSIC = "is_music";
    field public static final String IS_NOTIFICATION = "is_notification";
    field public static final String IS_RINGTONE = "is_ringtone";
    field public static final String TITLE_KEY = "title_key";
    field public static final String TRACK = "track";
    field public static final String YEAR = "year";
  }

  public static final class MediaStore.Audio.Genres implements android.provider.BaseColumns android.provider.MediaStore.Audio.GenresColumns {
    ctor public MediaStore.Audio.Genres();
    method public static android.net.Uri getContentUri(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/genre";
    field public static final String DEFAULT_SORT_ORDER = "name";
    field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static final class MediaStore.Audio.Genres.Members implements android.provider.MediaStore.Audio.AudioColumns {
    ctor public MediaStore.Audio.Genres.Members();
    method public static android.net.Uri getContentUri(String, long);
    field public static final String AUDIO_ID = "audio_id";
    field public static final String CONTENT_DIRECTORY = "members";
    field public static final String DEFAULT_SORT_ORDER = "title";
    field public static final String GENRE_ID = "genre_id";
  }

  public static interface MediaStore.Audio.GenresColumns {
    field public static final String NAME = "name";
  }

  public static final class MediaStore.Audio.Media implements android.provider.MediaStore.Audio.AudioColumns {
    ctor public MediaStore.Audio.Media();
    method public static android.net.Uri getContentUri(String);
    method public static android.net.Uri getContentUriForPath(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
    field public static final String DEFAULT_SORT_ORDER = "title";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final String EXTRA_MAX_BYTES = "android.provider.MediaStore.extra.MAX_BYTES";
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
    field public static final String RECORD_SOUND_ACTION = "android.provider.MediaStore.RECORD_SOUND";
  }

  public static final class MediaStore.Audio.Playlists implements android.provider.BaseColumns android.provider.MediaStore.Audio.PlaylistsColumns {
    ctor public MediaStore.Audio.Playlists();
    method public static android.net.Uri getContentUri(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/playlist";
    field public static final String DEFAULT_SORT_ORDER = "name";
    field public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static final class MediaStore.Audio.Playlists.Members implements android.provider.MediaStore.Audio.AudioColumns {
    ctor public MediaStore.Audio.Playlists.Members();
    method public static android.net.Uri getContentUri(String, long);
    field public static final String AUDIO_ID = "audio_id";
    field public static final String CONTENT_DIRECTORY = "members";
    field public static final String DEFAULT_SORT_ORDER = "play_order";
    field public static final String PLAYLIST_ID = "playlist_id";
    field public static final String PLAY_ORDER = "play_order";
    field public static final String _ID = "_id";
  }

  public static interface MediaStore.Audio.PlaylistsColumns {
    field public static final String DATA = "_data";
    field public static final String DATE_ADDED = "date_added";
    field public static final String DATE_MODIFIED = "date_modified";
    field public static final String NAME = "name";
  }

  public static final class MediaStore.Images {
    ctor public MediaStore.Images();
  }

  public static interface MediaStore.Images.ImageColumns extends android.provider.MediaStore.MediaColumns {
    field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
    field public static final String BUCKET_ID = "bucket_id";
    field public static final String DATE_TAKEN = "datetaken";
    field public static final String DESCRIPTION = "description";
    field public static final String IS_PRIVATE = "isprivate";
    field public static final String LATITUDE = "latitude";
    field public static final String LONGITUDE = "longitude";
    field public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final String ORIENTATION = "orientation";
    field public static final String PICASA_ID = "picasa_id";
  }

  public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
    ctor public MediaStore.Images.Media();
    method public static android.graphics.Bitmap getBitmap(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException, java.io.IOException;
    method public static android.net.Uri getContentUri(String);
    method public static String insertImage(android.content.ContentResolver, String, String, String) throws java.io.FileNotFoundException;
    method public static String insertImage(android.content.ContentResolver, android.graphics.Bitmap, String, String);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String[], String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image";
    field public static final String DEFAULT_SORT_ORDER = "bucket_display_name";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static class MediaStore.Images.Thumbnails implements android.provider.BaseColumns {
    ctor public MediaStore.Images.Thumbnails();
    method public static android.net.Uri getContentUri(String);
    method public static final android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method public static final android.database.Cursor queryMiniThumbnail(android.content.ContentResolver, long, int, String[]);
    method public static final android.database.Cursor queryMiniThumbnails(android.content.ContentResolver, android.net.Uri, int, String[]);
    field public static final String DATA = "_data";
    field public static final String DEFAULT_SORT_ORDER = "image_id ASC";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final int FULL_SCREEN_KIND = 2; // 0x2
    field public static final String HEIGHT = "height";
    field public static final String IMAGE_ID = "image_id";
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
    field public static final String KIND = "kind";
    field public static final int MICRO_KIND = 3; // 0x3
    field public static final int MINI_KIND = 1; // 0x1
    field public static final String WIDTH = "width";
  }

  public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
    field public static final String DATA = "_data";
    field public static final String DATE_ADDED = "date_added";
    field public static final String DATE_MODIFIED = "date_modified";
    field public static final String DISPLAY_NAME = "_display_name";
    field public static final String MIME_TYPE = "mime_type";
    field public static final String SIZE = "_size";
    field public static final String TITLE = "title";
  }

  public static final class MediaStore.Video {
    ctor public MediaStore.Video();
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    field public static final String DEFAULT_SORT_ORDER = "_display_name";
  }

  public static final class MediaStore.Video.Media implements android.provider.MediaStore.Video.VideoColumns {
    ctor public MediaStore.Video.Media();
    method public static android.net.Uri getContentUri(String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/video";
    field public static final String DEFAULT_SORT_ORDER = "title";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
    field public static final android.net.Uri INTERNAL_CONTENT_URI;
  }

  public static interface MediaStore.Video.VideoColumns extends android.provider.MediaStore.MediaColumns {
    field public static final String ALBUM = "album";
    field public static final String ARTIST = "artist";
    field public static final String BOOKMARK = "bookmark";
    field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
    field public static final String BUCKET_ID = "bucket_id";
    field public static final String CATEGORY = "category";
    field public static final String DATE_TAKEN = "datetaken";
    field public static final String DESCRIPTION = "description";
    field public static final String DURATION = "duration";
    field public static final String IS_PRIVATE = "isprivate";
    field public static final String LANGUAGE = "language";
    field public static final String LATITUDE = "latitude";
    field public static final String LONGITUDE = "longitude";
    field public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
    field public static final String RESOLUTION = "resolution";
    field public static final String TAGS = "tags";
  }

  public interface OpenableColumns {
    field public static final String DISPLAY_NAME = "_display_name";
    field public static final String SIZE = "_size";
  }

  public class SearchRecentSuggestions {
    ctor public SearchRecentSuggestions(android.content.Context, String, int);
    method public void clearHistory();
    method public void saveRecentQuery(String, String);
    method protected void truncateHistory(android.content.ContentResolver, int);
    field public static final String[] QUERIES_PROJECTION_1LINE;
    field public static final String[] QUERIES_PROJECTION_2LINE;
    field public static final int QUERIES_PROJECTION_DATE_INDEX = 1; // 0x1
    field public static final int QUERIES_PROJECTION_DISPLAY1_INDEX = 3; // 0x3
    field public static final int QUERIES_PROJECTION_DISPLAY2_INDEX = 4; // 0x4
    field public static final int QUERIES_PROJECTION_QUERY_INDEX = 2; // 0x2
  }

  public final class Settings {
    ctor public Settings();
    field public static final String ACTION_AIRPLANE_MODE_SETTINGS = "android.settings.AIRPLANE_MODE_SETTINGS";
    field public static final String ACTION_APN_SETTINGS = "android.settings.APN_SETTINGS";
    field public static final String ACTION_APPLICATION_DEVELOPMENT_SETTINGS = "android.settings.APPLICATION_DEVELOPMENT_SETTINGS";
    field public static final String ACTION_APPLICATION_SETTINGS = "android.settings.APPLICATION_SETTINGS";
    field public static final String ACTION_BLUETOOTH_SETTINGS = "android.settings.BLUETOOTH_SETTINGS";
    field public static final String ACTION_DATA_ROAMING_SETTINGS = "android.settings.DATA_ROAMING_SETTINGS";
    field public static final String ACTION_DATE_SETTINGS = "android.settings.DATE_SETTINGS";
    field public static final String ACTION_DISPLAY_SETTINGS = "android.settings.DISPLAY_SETTINGS";
    field public static final String ACTION_INPUT_METHOD_SETTINGS = "android.settings.INPUT_METHOD_SETTINGS";
    field public static final String ACTION_INTERNAL_STORAGE_SETTINGS = "android.settings.INTERNAL_STORAGE_SETTINGS";
    field public static final String ACTION_LOCALE_SETTINGS = "android.settings.LOCALE_SETTINGS";
    field public static final String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
    field public static final String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
    field public static final String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
    field public static final String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
    field public static final String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
    field public static final String ACTION_SECURITY_SETTINGS = "android.settings.SECURITY_SETTINGS";
    field public static final String ACTION_SETTINGS = "android.settings.SETTINGS";
    field public static final String ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS";
    field public static final String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS";
    field public static final String ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS";
    field public static final String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS";
    field public static final String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS";
    field public static final String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS";
    field public static final String AUTHORITY = "settings";
  }

  public static class Settings.NameValueTable implements android.provider.BaseColumns {
    ctor public Settings.NameValueTable();
    method public static android.net.Uri getUriFor(android.net.Uri, String);
    method protected static boolean putString(android.content.ContentResolver, android.net.Uri, String, String);
    field public static final String NAME = "name";
    field public static final String VALUE = "value";
  }

  public static final class Settings.Secure extends android.provider.Settings.NameValueTable {
    ctor public Settings.Secure();
    method public static float getFloat(android.content.ContentResolver, String, float);
    method public static float getFloat(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static int getInt(android.content.ContentResolver, String, int);
    method public static int getInt(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static long getLong(android.content.ContentResolver, String, long);
    method public static long getLong(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static String getString(android.content.ContentResolver, String);
    method public static android.net.Uri getUriFor(String);
    method public static boolean putFloat(android.content.ContentResolver, String, float);
    method public static boolean putInt(android.content.ContentResolver, String, int);
    method public static boolean putLong(android.content.ContentResolver, String, long);
    method public static boolean putString(android.content.ContentResolver, String, String);
    field public static final String ADB_ENABLED = "adb_enabled";
    field public static final String ALLOW_MOCK_LOCATION = "mock_location";
    field public static final String ANDROID_ID = "android_id";
    field public static final String BACKGROUND_DATA = "background_data";
    field public static final String BLUETOOTH_ON = "bluetooth_on";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DATA_ROAMING = "data_roaming";
    field public static final String DEFAULT_INPUT_METHOD = "default_input_method";
    field public static final String DEVICE_PROVISIONED = "device_provisioned";
    field public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
    field public static final String HTTP_PROXY = "http_proxy";
    field public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
    field public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
    field public static final String LOGGING_ID = "logging_id";
    field public static final String NETWORK_PREFERENCE = "network_preference";
    field public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
    field public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
    field public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
    field public static final String SETTINGS_CLASSNAME = "settings_classname";
    field public static final String SYS_PROP_SETTING_VERSION = "sys.settings_secure_version";
    field public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
    field public static final String USE_GOOGLE_MAIL = "use_google_mail";
    field public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
    field public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
    field public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
    field public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
    field public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
    field public static final String WIFI_ON = "wifi_on";
    field public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
    field public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
    field public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
    field public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
    field public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
    field public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
    field public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
    field public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
    field public static final String WIFI_WATCHDOG_WATCH_LIST = "wifi_watchdog_watch_list";
  }

  public static class Settings.SettingNotFoundException extends android.util.AndroidException {
    ctor public Settings.SettingNotFoundException(String);
  }

  public static final class Settings.System extends android.provider.Settings.NameValueTable {
    ctor public Settings.System();
    method public static void getConfiguration(android.content.ContentResolver, android.content.res.Configuration);
    method public static float getFloat(android.content.ContentResolver, String, float);
    method public static float getFloat(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static int getInt(android.content.ContentResolver, String, int);
    method public static int getInt(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static long getLong(android.content.ContentResolver, String, long);
    method public static long getLong(android.content.ContentResolver, String) throws android.provider.Settings.SettingNotFoundException;
    method public static boolean getShowGTalkServiceStatus(android.content.ContentResolver);
    method public static String getString(android.content.ContentResolver, String);
    method public static android.net.Uri getUriFor(String);
    method public static boolean putConfiguration(android.content.ContentResolver, android.content.res.Configuration);
    method public static boolean putFloat(android.content.ContentResolver, String, float);
    method public static boolean putInt(android.content.ContentResolver, String, int);
    method public static boolean putLong(android.content.ContentResolver, String, long);
    method public static boolean putString(android.content.ContentResolver, String, String);
    method public static void setShowGTalkServiceStatus(android.content.ContentResolver, boolean);
    field public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";
    field public static final String ADB_ENABLED = "adb_enabled";
    field public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
    field public static final String AIRPLANE_MODE_RADIOS = "airplane_mode_radios";
    field public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
    field public static final String ANDROID_ID = "android_id";
    field public static final String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
    field public static final String AUTO_TIME = "auto_time";
    field public static final String BLUETOOTH_DISCOVERABILITY = "bluetooth_discoverability";
    field public static final String BLUETOOTH_DISCOVERABILITY_TIMEOUT = "bluetooth_discoverability_timeout";
    field public static final String BLUETOOTH_ON = "bluetooth_on";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DATA_ROAMING = "data_roaming";
    field public static final String DATE_FORMAT = "date_format";
    field public static final String DEBUG_APP = "debug_app";
    field public static final android.net.Uri DEFAULT_NOTIFICATION_URI;
    field public static final android.net.Uri DEFAULT_RINGTONE_URI;
    field public static final String DEVICE_PROVISIONED = "device_provisioned";
    field public static final String DIM_SCREEN = "dim_screen";
    field public static final String DTMF_TONE_WHEN_DIALING = "dtmf_tone";
    field public static final String END_BUTTON_BEHAVIOR = "end_button_behavior";
    field public static final String FONT_SCALE = "font_scale";
    field public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
    field public static final String HTTP_PROXY = "http_proxy";
    field public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
    field public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed";
    field public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock";
    field public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled";
    field public static final String LOCK_PATTERN_VISIBLE = "lock_pattern_visible_pattern";
    field public static final String LOGGING_ID = "logging_id";
    field public static final String MODE_RINGER = "mode_ringer";
    field public static final String MODE_RINGER_STREAMS_AFFECTED = "mode_ringer_streams_affected";
    field public static final String MUTE_STREAMS_AFFECTED = "mute_streams_affected";
    field public static final String NETWORK_PREFERENCE = "network_preference";
    field public static final String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
    field public static final String NOTIFICATION_SOUND = "notification_sound";
    field public static final String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
    field public static final String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
    field public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
    field public static final String RADIO_BLUETOOTH = "bluetooth";
    field public static final String RADIO_CELL = "cell";
    field public static final String RADIO_WIFI = "wifi";
    field public static final String RINGTONE = "ringtone";
    field public static final String SCREEN_BRIGHTNESS = "screen_brightness";
    field public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
    field public static final String SETTINGS_CLASSNAME = "settings_classname";
    field public static final String SETUP_WIZARD_HAS_RUN = "setup_wizard_has_run";
    field public static final String SHOW_GTALK_SERVICE_STATUS = "SHOW_GTALK_SERVICE_STATUS";
    field public static final String SHOW_PROCESSES = "show_processes";
    field public static final String SOUND_EFFECTS_ENABLED = "sound_effects_enabled";
    field public static final String STAY_ON_WHILE_PLUGGED_IN = "stay_on_while_plugged_in";
    field public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version";
    field public static final String TEXT_AUTO_CAPS = "auto_caps";
    field public static final String TEXT_AUTO_PUNCTUATE = "auto_punctuate";
    field public static final String TEXT_AUTO_REPLACE = "auto_replace";
    field public static final String TEXT_SHOW_PASSWORD = "show_password";
    field public static final String TIME_12_24 = "time_12_24";
    field public static final String TRANSITION_ANIMATION_SCALE = "transition_animation_scale";
    field public static final String USB_MASS_STORAGE_ENABLED = "usb_mass_storage_enabled";
    field public static final String USE_GOOGLE_MAIL = "use_google_mail";
    field public static final String VIBRATE_ON = "vibrate_on";
    field public static final String VOLUME_ALARM = "volume_alarm";
    field public static final String VOLUME_MUSIC = "volume_music";
    field public static final String VOLUME_NOTIFICATION = "volume_notification";
    field public static final String VOLUME_RING = "volume_ring";
    field public static final String[] VOLUME_SETTINGS;
    field public static final String VOLUME_SYSTEM = "volume_system";
    field public static final String VOLUME_VOICE = "volume_voice";
    field public static final String WAIT_FOR_DEBUGGER = "wait_for_debugger";
    field public static final String WALLPAPER_ACTIVITY = "wallpaper_activity";
    field public static final String WIFI_MAX_DHCP_RETRY_COUNT = "wifi_max_dhcp_retry_count";
    field public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS = "wifi_mobile_data_transition_wakelock_timeout_ms";
    field public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on";
    field public static final String WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY = "wifi_networks_available_repeat_delay";
    field public static final String WIFI_NUM_OPEN_NETWORKS_KEPT = "wifi_num_open_networks_kept";
    field public static final String WIFI_ON = "wifi_on";
    field public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
    field public static final int WIFI_SLEEP_POLICY_DEFAULT = 0; // 0x0
    field public static final int WIFI_SLEEP_POLICY_NEVER = 2; // 0x2
    field public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1; // 0x1
    field public static final String WIFI_STATIC_DNS1 = "wifi_static_dns1";
    field public static final String WIFI_STATIC_DNS2 = "wifi_static_dns2";
    field public static final String WIFI_STATIC_GATEWAY = "wifi_static_gateway";
    field public static final String WIFI_STATIC_IP = "wifi_static_ip";
    field public static final String WIFI_STATIC_NETMASK = "wifi_static_netmask";
    field public static final String WIFI_USE_STATIC_IP = "wifi_use_static_ip";
    field public static final String WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE = "wifi_watchdog_acceptable_packet_loss_percentage";
    field public static final String WIFI_WATCHDOG_AP_COUNT = "wifi_watchdog_ap_count";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS = "wifi_watchdog_background_check_delay_ms";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED = "wifi_watchdog_background_check_enabled";
    field public static final String WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS = "wifi_watchdog_background_check_timeout_ms";
    field public static final String WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT = "wifi_watchdog_initial_ignored_ping_count";
    field public static final String WIFI_WATCHDOG_MAX_AP_CHECKS = "wifi_watchdog_max_ap_checks";
    field public static final String WIFI_WATCHDOG_ON = "wifi_watchdog_on";
    field public static final String WIFI_WATCHDOG_PING_COUNT = "wifi_watchdog_ping_count";
    field public static final String WIFI_WATCHDOG_PING_DELAY_MS = "wifi_watchdog_ping_delay_ms";
    field public static final String WIFI_WATCHDOG_PING_TIMEOUT_MS = "wifi_watchdog_ping_timeout_ms";
    field public static final String WINDOW_ANIMATION_SCALE = "window_animation_scale";
  }

  public class UserDictionary {
    ctor public UserDictionary();
    field public static final String AUTHORITY = "user_dictionary";
    field public static final android.net.Uri CONTENT_URI;
  }

  public static class UserDictionary.Words implements android.provider.BaseColumns {
    ctor public UserDictionary.Words();
    method public static void addWord(android.content.Context, String, int, int);
    field public static final String APP_ID = "appid";
    field public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.userword";
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.userword";
    field public static final android.net.Uri CONTENT_URI;
    field public static final String DEFAULT_SORT_ORDER = "frequency DESC";
    field public static final String FREQUENCY = "frequency";
    field public static final String LOCALE = "locale";
    field public static final int LOCALE_TYPE_ALL = 0; // 0x0
    field public static final int LOCALE_TYPE_CURRENT = 1; // 0x1
    field public static final String WORD = "word";
    field public static final String _ID = "_id";
  }

}

package android.sax {

  public class Element {
    method public android.sax.Element getChild(String);
    method public android.sax.Element getChild(String, String);
    method public android.sax.Element requireChild(String);
    method public android.sax.Element requireChild(String, String);
    method public void setElementListener(android.sax.ElementListener);
    method public void setEndElementListener(android.sax.EndElementListener);
    method public void setEndTextElementListener(android.sax.EndTextElementListener);
    method public void setStartElementListener(android.sax.StartElementListener);
    method public void setTextElementListener(android.sax.TextElementListener);
  }

  public interface ElementListener extends android.sax.StartElementListener android.sax.EndElementListener {
  }

  public interface EndElementListener {
    method public void end();
  }

  public interface EndTextElementListener {
    method public void end(String);
  }

  public class RootElement extends android.sax.Element {
    ctor public RootElement(String, String);
    ctor public RootElement(String);
    method public org.xml.sax.ContentHandler getContentHandler();
  }

  public interface StartElementListener {
    method public void start(org.xml.sax.Attributes);
  }

  public interface TextElementListener extends android.sax.StartElementListener android.sax.EndTextElementListener {
  }

}

package android.speech {

  public class RecognizerIntent {
    field public static final String ACTION_RECOGNIZE_SPEECH = "android.speech.action.RECOGNIZE_SPEECH";
    field public static final String ACTION_WEB_SEARCH = "android.speech.action.WEB_SEARCH";
    field public static final String EXTRA_LANGUAGE = "android.speech.extra.LANGUAGE";
    field public static final String EXTRA_LANGUAGE_MODEL = "android.speech.extra.LANGUAGE_MODEL";
    field public static final String EXTRA_MAX_RESULTS = "android.speech.extra.MAX_RESULTS";
    field public static final String EXTRA_PROMPT = "android.speech.extra.PROMPT";
    field public static final String EXTRA_RESULTS = "android.speech.extra.RESULTS";
    field public static final String EXTRA_RESULTS_PENDINGINTENT = "android.speech.extra.RESULTS_PENDINGINTENT";
    field public static final String EXTRA_RESULTS_PENDINGINTENT_BUNDLE = "android.speech.extra.RESULTS_PENDINGINTENT_BUNDLE";
    field public static final String LANGUAGE_MODEL_FREE_FORM = "free_form";
    field public static final String LANGUAGE_MODEL_WEB_SEARCH = "web_search";
    field public static final int RESULT_AUDIO_ERROR = 5; // 0x5
    field public static final int RESULT_CLIENT_ERROR = 2; // 0x2
    field public static final int RESULT_NETWORK_ERROR = 4; // 0x4
    field public static final int RESULT_NO_MATCH = 1; // 0x1
    field public static final int RESULT_SERVER_ERROR = 3; // 0x3
  }

}

package android.telephony {

  public abstract class CellLocation {
    ctor public CellLocation();
    method public static android.telephony.CellLocation getEmpty();
    method public static void requestLocationUpdate();
  }

  public class NeighboringCellInfo implements android.os.Parcelable {
    ctor public NeighboringCellInfo();
    ctor public NeighboringCellInfo(int, int);
    ctor public NeighboringCellInfo(android.os.Parcel);
    method public int describeContents();
    method public int getCid();
    method public int getRssi();
    method public void setCid(int);
    method public void setRssi(int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.telephony.NeighboringCellInfo> CREATOR;
    field public static final int UNKNOWN_CID = -1; // 0xffffffff
    field public static final int UNKNOWN_RSSI = 99; // 0x63
  }

  public class PhoneNumberFormattingTextWatcher implements android.text.TextWatcher {
    ctor public PhoneNumberFormattingTextWatcher();
    method public void afterTextChanged(android.text.Editable);
    method public void beforeTextChanged(CharSequence, int, int, int);
    method public void onTextChanged(CharSequence, int, int, int);
  }

  public class PhoneNumberUtils {
    ctor public PhoneNumberUtils();
    method public static String calledPartyBCDFragmentToString(byte[], int, int);
    method public static String calledPartyBCDToString(byte[], int, int);
    method public static boolean compare(String, String);
    method public static String convertKeypadLettersToDigits(String);
    method public static String extractNetworkPortion(String);
    method public static String extractPostDialPortion(String);
    method public static void formatJapaneseNumber(android.text.Editable);
    method public static void formatNanpNumber(android.text.Editable);
    method public static String formatNumber(String);
    method public static void formatNumber(android.text.Editable, int);
    method public static int getFormatTypeForLocale(java.util.Locale);
    method public static String getNumberFromIntent(android.content.Intent, android.content.Context);
    method public static String getStrippedReversed(String);
    method public static final boolean is12Key(char);
    method public static final boolean isDialable(char);
    method public static boolean isEmergencyNumber(String);
    method public static boolean isGlobalPhoneNumber(String);
    method public static boolean isISODigit(char);
    method public static final boolean isNonSeparator(char);
    method public static final boolean isReallyDialable(char);
    method public static final boolean isStartsPostDial(char);
    method public static boolean isWellFormedSmsAddress(String);
    method public static byte[] networkPortionToCalledPartyBCD(String);
    method public static byte[] networkPortionToCalledPartyBCDWithLength(String);
    method public static byte[] numberToCalledPartyBCD(String);
    method public static String stringFromStringAndTOA(String, int);
    method public static String stripSeparators(String);
    method public static String toCallerIDMinMatch(String);
    method public static int toaFromString(String);
    field public static final int FORMAT_JAPAN = 2; // 0x2
    field public static final int FORMAT_NANP = 1; // 0x1
    field public static final int FORMAT_UNKNOWN = 0; // 0x0
    field public static final char PAUSE = 44; // 0x002c ','
    field public static final int TOA_International = 145; // 0x91
    field public static final int TOA_Unknown = 129; // 0x81
    field public static final char WAIT = 59; // 0x003b ';'
    field public static final char WILD = 78; // 0x004e 'N'
  }

  public class PhoneStateListener {
    ctor public PhoneStateListener();
    method public void onCallForwardingIndicatorChanged(boolean);
    method public void onCallStateChanged(int, String);
    method public void onCellLocationChanged(android.telephony.CellLocation);
    method public void onDataActivity(int);
    method public void onDataConnectionStateChanged(int);
    method public void onMessageWaitingIndicatorChanged(boolean);
    method public void onServiceStateChanged(android.telephony.ServiceState);
    method public void onSignalStrengthChanged(int);
    field public static final int LISTEN_CALL_FORWARDING_INDICATOR = 8; // 0x8
    field public static final int LISTEN_CALL_STATE = 32; // 0x20
    field public static final int LISTEN_CELL_LOCATION = 16; // 0x10
    field public static final int LISTEN_DATA_ACTIVITY = 128; // 0x80
    field public static final int LISTEN_DATA_CONNECTION_STATE = 64; // 0x40
    field public static final int LISTEN_MESSAGE_WAITING_INDICATOR = 4; // 0x4
    field public static final int LISTEN_NONE = 0; // 0x0
    field public static final int LISTEN_SERVICE_STATE = 1; // 0x1
    field public static final int LISTEN_SIGNAL_STRENGTH = 2; // 0x2
  }

  public class ServiceState implements android.os.Parcelable {
    ctor public ServiceState();
    ctor public ServiceState(android.telephony.ServiceState);
    ctor public ServiceState(android.os.Parcel);
    method protected void copyFrom(android.telephony.ServiceState);
    method public int describeContents();
    method public boolean getIsManualSelection();
    method public String getOperatorAlphaLong();
    method public String getOperatorAlphaShort();
    method public String getOperatorNumeric();
    method public boolean getRoaming();
    method public int getState();
    method public void setIsManualSelection(boolean);
    method public void setOperatorName(String, String, String);
    method public void setRoaming(boolean);
    method public void setState(int);
    method public void setStateOff();
    method public void setStateOutOfService();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.telephony.ServiceState> CREATOR;
    field public static final int STATE_EMERGENCY_ONLY = 2; // 0x2
    field public static final int STATE_IN_SERVICE = 0; // 0x0
    field public static final int STATE_OUT_OF_SERVICE = 1; // 0x1
    field public static final int STATE_POWER_OFF = 3; // 0x3
  }

  public class TelephonyManager {
    method public int getCallState();
    method public android.telephony.CellLocation getCellLocation();
    method public int getDataActivity();
    method public int getDataState();
    method public String getDeviceId();
    method public String getDeviceSoftwareVersion();
    method public String getLine1Number();
    method public java.util.List<android.telephony.NeighboringCellInfo> getNeighboringCellInfo();
    method public String getNetworkCountryIso();
    method public String getNetworkOperator();
    method public String getNetworkOperatorName();
    method public int getNetworkType();
    method public int getPhoneType();
    method public String getSimCountryIso();
    method public String getSimOperator();
    method public String getSimOperatorName();
    method public String getSimSerialNumber();
    method public int getSimState();
    method public String getSubscriberId();
    method public String getVoiceMailAlphaTag();
    method public String getVoiceMailNumber();
    method public boolean isNetworkRoaming();
    method public void listen(android.telephony.PhoneStateListener, int);
    field public static final String ACTION_PHONE_STATE_CHANGED = "android.intent.action.PHONE_STATE";
    field public static final int CALL_STATE_IDLE = 0; // 0x0
    field public static final int CALL_STATE_OFFHOOK = 2; // 0x2
    field public static final int CALL_STATE_RINGING = 1; // 0x1
    field public static final int DATA_ACTIVITY_IN = 1; // 0x1
    field public static final int DATA_ACTIVITY_INOUT = 3; // 0x3
    field public static final int DATA_ACTIVITY_NONE = 0; // 0x0
    field public static final int DATA_ACTIVITY_OUT = 2; // 0x2
    field public static final int DATA_CONNECTED = 2; // 0x2
    field public static final int DATA_CONNECTING = 1; // 0x1
    field public static final int DATA_DISCONNECTED = 0; // 0x0
    field public static final int DATA_SUSPENDED = 3; // 0x3
    field public static final String EXTRA_INCOMING_NUMBER = "incoming_number";
    field public static final String EXTRA_STATE = "state";
    field public static final String EXTRA_STATE_IDLE;
    field public static final String EXTRA_STATE_OFFHOOK;
    field public static final String EXTRA_STATE_RINGING;
    field public static final int NETWORK_TYPE_EDGE = 2; // 0x2
    field public static final int NETWORK_TYPE_GPRS = 1; // 0x1
    field public static final int NETWORK_TYPE_UMTS = 3; // 0x3
    field public static final int NETWORK_TYPE_UNKNOWN = 0; // 0x0
    field public static final int PHONE_TYPE_GSM = 1; // 0x1
    field public static final int PHONE_TYPE_NONE = 0; // 0x0
    field public static final int SIM_STATE_ABSENT = 1; // 0x1
    field public static final int SIM_STATE_NETWORK_LOCKED = 4; // 0x4
    field public static final int SIM_STATE_PIN_REQUIRED = 2; // 0x2
    field public static final int SIM_STATE_PUK_REQUIRED = 3; // 0x3
    field public static final int SIM_STATE_READY = 5; // 0x5
    field public static final int SIM_STATE_UNKNOWN = 0; // 0x0
  }

}

package android.telephony.gsm {

  public class GsmCellLocation extends android.telephony.CellLocation {
    ctor public GsmCellLocation();
    ctor public GsmCellLocation(android.os.Bundle);
    method public void fillInNotifierBundle(android.os.Bundle);
    method public int getCid();
    method public int getLac();
    method public void setLacAndCid(int, int);
    method public void setStateInvalid();
  }

  public final class SmsManager {
    method public java.util.ArrayList<java.lang.String> divideMessage(String);
    method public static android.telephony.gsm.SmsManager getDefault();
    method public void sendDataMessage(String, String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
    method public void sendMultipartTextMessage(String, String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
    method public void sendTextMessage(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
    field public static final int RESULT_ERROR_GENERIC_FAILURE = 1; // 0x1
    field public static final int RESULT_ERROR_NO_SERVICE = 4; // 0x4
    field public static final int RESULT_ERROR_NULL_PDU = 3; // 0x3
    field public static final int RESULT_ERROR_RADIO_OFF = 2; // 0x2
    field public static final int STATUS_ON_SIM_FREE = 0; // 0x0
    field public static final int STATUS_ON_SIM_READ = 1; // 0x1
    field public static final int STATUS_ON_SIM_SENT = 5; // 0x5
    field public static final int STATUS_ON_SIM_UNREAD = 3; // 0x3
    field public static final int STATUS_ON_SIM_UNSENT = 7; // 0x7
  }

  public class SmsMessage {
    ctor public SmsMessage();
    method public static int[] calculateLength(CharSequence, boolean);
    method public static int[] calculateLength(String, boolean);
    method public static android.telephony.gsm.SmsMessage createFromPdu(byte[]);
    method public String getDisplayMessageBody();
    method public String getDisplayOriginatingAddress();
    method public String getEmailBody();
    method public String getEmailFrom();
    method public int getIndexOnSim();
    method public String getMessageBody();
    method public android.telephony.gsm.SmsMessage.MessageClass getMessageClass();
    method public String getOriginatingAddress();
    method public byte[] getPdu();
    method public int getProtocolIdentifier();
    method public String getPseudoSubject();
    method public String getServiceCenterAddress();
    method public int getStatus();
    method public int getStatusOnSim();
    method public static android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(String, String, String, boolean);
    method public static android.telephony.gsm.SmsMessage.SubmitPdu getSubmitPdu(String, String, short, byte[], boolean);
    method public static int getTPLayerLengthForPDU(String);
    method public long getTimestampMillis();
    method public byte[] getUserData();
    method public boolean isCphsMwiMessage();
    method public boolean isEmail();
    method public boolean isMWIClearMessage();
    method public boolean isMWISetMessage();
    method public boolean isMwiDontStore();
    method public boolean isReplace();
    method public boolean isReplyPathPresent();
    method public boolean isStatusReportMessage();
    field public static final int ENCODING_16BIT = 3; // 0x3
    field public static final int ENCODING_7BIT = 1; // 0x1
    field public static final int ENCODING_8BIT = 2; // 0x2
    field public static final int ENCODING_UNKNOWN = 0; // 0x0
    field public static final int MAX_USER_DATA_BYTES = 140; // 0x8c
    field public static final int MAX_USER_DATA_SEPTETS = 160; // 0xa0
    field public static final int MAX_USER_DATA_SEPTETS_WITH_HEADER = 153; // 0x99
  }

  public enum SmsMessage.MessageClass {
    enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_0;
    enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_1;
    enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_2;
    enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass CLASS_3;
    enum_constant public static final android.telephony.gsm.SmsMessage.MessageClass UNKNOWN;
  }

  public static class SmsMessage.SubmitPdu {
    ctor public SmsMessage.SubmitPdu();
    field public byte[] encodedMessage;
    field public byte[] encodedScAddress;
  }

}

package android.test {

  @Deprecated public abstract class ActivityInstrumentationTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
    ctor public ActivityInstrumentationTestCase(String, Class<T>);
    ctor public ActivityInstrumentationTestCase(String, Class<T>, boolean);
    method public T getActivity();
    method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
  }

  public abstract class ActivityInstrumentationTestCase2<T extends android.app.Activity> extends android.test.ActivityTestCase {
    ctor public ActivityInstrumentationTestCase2(String, Class<T>);
    method public T getActivity();
    method public void setActivityInitialTouchMode(boolean);
    method public void setActivityIntent(android.content.Intent);
  }

  public abstract class ActivityTestCase extends android.test.InstrumentationTestCase {
    ctor public ActivityTestCase();
    method protected android.app.Activity getActivity();
    method protected void scrubClass(Class<?>) throws java.lang.IllegalAccessException;
    method protected void setActivity(android.app.Activity);
  }

  public abstract class ActivityUnitTestCase<T extends android.app.Activity> extends android.test.ActivityTestCase {
    ctor public ActivityUnitTestCase(Class<T>);
    method public T getActivity();
    method public int getFinishedActivityRequest();
    method public int getRequestedOrientation();
    method public android.content.Intent getStartedActivityIntent();
    method public int getStartedActivityRequest();
    method public boolean isFinishCalled();
    method public void setActivityContext(android.content.Context);
    method public void setApplication(android.app.Application);
    method protected T startActivity(android.content.Intent, android.os.Bundle, Object);
  }

  public class AndroidTestCase extends junit.framework.TestCase {
    ctor public AndroidTestCase();
    method public android.content.Context getContext();
    method protected void scrubClass(Class<?>) throws java.lang.IllegalAccessException;
    method public void setContext(android.content.Context);
    method public void testAndroidTestCaseSetupProperly();
    field protected android.content.Context mContext;
  }

  public class AndroidTestRunner extends junit.runner.BaseTestRunner {
    ctor public AndroidTestRunner();
    method public void addTestListener(junit.framework.TestListener);
    method public void clearTestListeners();
    method protected junit.framework.TestResult createTestResult();
    method public java.util.List<junit.framework.TestCase> getTestCases();
    method public String getTestClassName();
    method public junit.framework.TestResult getTestResult();
    method protected void runFailed(String);
    method public void runTest();
    method public void runTest(junit.framework.TestResult);
    method public void setContext(android.content.Context);
    method public void setInstrumentaiton(android.app.Instrumentation);
    method public void setTest(junit.framework.Test);
    method public void setTestClassName(String, String);
    method public void testEnded(String);
    method public void testFailed(int, junit.framework.Test, Throwable);
    method public void testStarted(String);
  }

  public abstract class ApplicationTestCase<T extends android.app.Application> extends android.test.AndroidTestCase {
    ctor public ApplicationTestCase(Class<T>);
    method protected final void createApplication();
    method public T getApplication();
    method public android.content.Context getSystemContext();
    method protected final void terminateApplication();
    method public final void testApplicationTestCaseSetUpProperly() throws java.lang.Exception;
  }

  public class AssertionFailedError extends java.lang.Error {
    ctor public AssertionFailedError();
    ctor public AssertionFailedError(String);
  }

  public class ComparisonFailure extends android.test.AssertionFailedError {
    ctor public ComparisonFailure(String, String, String);
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface FlakyTest {
    method public abstract int tolerance() default 1;
  }

  public class InstrumentationTestCase extends junit.framework.TestCase {
    ctor public InstrumentationTestCase();
    method public android.app.Instrumentation getInstrumentation();
    method public void injectInsrumentation(android.app.Instrumentation);
    method public final <T extends android.app.Activity> T launchActivity(String, Class<T>, android.os.Bundle);
    method public final <T extends android.app.Activity> T launchActivityWithIntent(String, Class<T>, android.content.Intent);
    method public void runTestOnUiThread(Runnable) throws java.lang.Throwable;
    method public void sendKeys(String);
    method public void sendKeys(int...);
    method public void sendRepeatedKeys(int...);
  }

  public class InstrumentationTestRunner extends android.app.Instrumentation implements android.test.TestSuiteProvider {
    ctor public InstrumentationTestRunner();
    method public junit.framework.TestSuite getAllTests();
    method protected android.test.AndroidTestRunner getAndroidTestRunner();
    method public ClassLoader getLoader();
    method public junit.framework.TestSuite getTestSuite();
    field public static final String REPORT_KEY_NAME_CLASS = "class";
    field public static final String REPORT_KEY_NAME_TEST = "test";
    field public static final String REPORT_KEY_NUM_CURRENT = "current";
    field public static final String REPORT_KEY_NUM_TOTAL = "numtests";
    field public static final String REPORT_KEY_STACK = "stack";
    field public static final String REPORT_VALUE_ID = "InstrumentationTestRunner";
    field public static final int REPORT_VALUE_RESULT_ERROR = -1; // 0xffffffff
    field public static final int REPORT_VALUE_RESULT_FAILURE = -2; // 0xfffffffe
    field public static final int REPORT_VALUE_RESULT_OK = 0; // 0x0
    field public static final int REPORT_VALUE_RESULT_START = 1; // 0x1
  }

  public class InstrumentationTestSuite extends junit.framework.TestSuite {
    ctor public InstrumentationTestSuite(android.app.Instrumentation);
    ctor public InstrumentationTestSuite(String, android.app.Instrumentation);
    ctor public InstrumentationTestSuite(Class, android.app.Instrumentation);
  }

  public class IsolatedContext extends android.content.ContextWrapper {
    ctor public IsolatedContext(android.content.ContentResolver, android.content.Context);
    method public java.util.List<android.content.Intent> getAndClearBroadcastIntents();
  }

  public final class MoreAsserts {
    method public static void assertAssignableFrom(Class<?>, Object);
    method public static void assertAssignableFrom(Class<?>, Class<?>);
    method public static java.util.regex.MatchResult assertContainsRegex(String, String, String);
    method public static java.util.regex.MatchResult assertContainsRegex(String, String);
    method public static void assertContentsInAnyOrder(String, Iterable<?>, java.lang.Object...);
    method public static void assertContentsInAnyOrder(Iterable<?>, java.lang.Object...);
    method public static void assertContentsInOrder(String, Iterable<?>, java.lang.Object...);
    method public static void assertContentsInOrder(Iterable<?>, java.lang.Object...);
    method public static void assertEmpty(String, Iterable<?>);
    method public static void assertEmpty(Iterable<?>);
    method public static void assertEmpty(String, java.util.Map<?,?>);
    method public static void assertEmpty(java.util.Map<?,?>);
    method public static void assertEquals(String, byte[], byte[]);
    method public static void assertEquals(byte[], byte[]);
    method public static void assertEquals(String, int[], int[]);
    method public static void assertEquals(int[], int[]);
    method public static void assertEquals(String, double[], double[]);
    method public static void assertEquals(double[], double[]);
    method public static void assertEquals(String, Object[], Object[]);
    method public static void assertEquals(Object[], Object[]);
    method public static void assertEquals(String, java.util.Set<?>, java.util.Set<?>);
    method public static void assertEquals(java.util.Set<?>, java.util.Set<?>);
    method public static java.util.regex.MatchResult assertMatchesRegex(String, String, String);
    method public static java.util.regex.MatchResult assertMatchesRegex(String, String);
    method public static void assertNotContainsRegex(String, String, String);
    method public static void assertNotContainsRegex(String, String);
    method public static void assertNotEmpty(String, Iterable<?>);
    method public static void assertNotEmpty(Iterable<?>);
    method public static void assertNotEmpty(String, java.util.Map<?,?>);
    method public static void assertNotEmpty(java.util.Map<?,?>);
    method public static void assertNotEqual(String, Object, Object);
    method public static void assertNotEqual(Object, Object);
    method public static void assertNotMatchesRegex(String, String, String);
    method public static void assertNotMatchesRegex(String, String);
    method public static void checkEqualsAndHashCodeMethods(String, Object, Object, boolean);
    method public static void checkEqualsAndHashCodeMethods(Object, Object, boolean);
  }

  public interface PerformanceTestCase {
    method public boolean isPerformanceOnly();
    method public int startPerformance(android.test.PerformanceTestCase.Intermediates);
  }

  public static interface PerformanceTestCase.Intermediates {
    method public void addIntermediate(String);
    method public void addIntermediate(String, long);
    method public void finishTiming(boolean);
    method public void setInternalIterations(int);
    method public void startTiming(boolean);
  }

  public abstract class ProviderTestCase<T extends android.content.ContentProvider> extends android.test.InstrumentationTestCase {
    ctor public ProviderTestCase(Class<T>, String);
    method public android.test.mock.MockContentResolver getMockContentResolver();
    method public android.test.IsolatedContext getMockContext();
    method public T getProvider();
    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, Class<T>, String, String, int, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public abstract class ProviderTestCase2<T extends android.content.ContentProvider> extends android.test.AndroidTestCase {
    ctor public ProviderTestCase2(Class<T>, String);
    method public android.test.mock.MockContentResolver getMockContentResolver();
    method public android.test.IsolatedContext getMockContext();
    method public T getProvider();
    method public static <T extends android.content.ContentProvider> android.content.ContentResolver newResolverWithContentProviderFromSql(android.content.Context, String, Class<T>, String, String, int, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public class RenamingDelegatingContext extends android.content.ContextWrapper {
    ctor public RenamingDelegatingContext(android.content.Context, String);
    ctor public RenamingDelegatingContext(android.content.Context, android.content.Context, String);
    method public String getDatabasePrefix();
    method public void makeExistingFilesAndDbsAccessible();
    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(Class<T>, android.content.Context, String) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public static <T extends android.content.ContentProvider> T providerWithRenamedContext(Class<T>, android.content.Context, String, boolean) throws java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public abstract class ServiceTestCase<T extends android.app.Service> extends android.test.AndroidTestCase {
    ctor public ServiceTestCase(Class<T>);
    method protected android.os.IBinder bindService(android.content.Intent);
    method public android.app.Application getApplication();
    method public T getService();
    method public android.content.Context getSystemContext();
    method public void setApplication(android.app.Application);
    method protected void setupService();
    method protected void shutdownService();
    method protected void startService(android.content.Intent);
    method public void testServiceTestCaseSetUpProperly() throws java.lang.Exception;
  }

  public abstract class SingleLaunchActivityTestCase<T extends android.app.Activity> extends android.test.InstrumentationTestCase {
    ctor public SingleLaunchActivityTestCase(String, Class<T>);
    method public T getActivity();
    method public void testActivityTestCaseSetUpProperly() throws java.lang.Exception;
  }

  public class SyncBaseInstrumentation extends android.test.InstrumentationTestCase {
    ctor public SyncBaseInstrumentation();
    method protected void cancelSyncsandDisableAutoSync();
    method protected void syncProvider(android.net.Uri, String, String) throws java.lang.Exception;
  }

  public interface TestSuiteProvider {
    method public junit.framework.TestSuite getTestSuite();
  }

  public class TouchUtils {
    ctor public TouchUtils();
    method public static void clickView(android.test.InstrumentationTestCase, android.view.View);
    method public static void drag(android.test.ActivityInstrumentationTestCase, float, float, float, float, int);
    method public static void drag(android.test.InstrumentationTestCase, float, float, float, float, int);
    method public static void dragQuarterScreenDown(android.test.ActivityInstrumentationTestCase);
    method public static void dragQuarterScreenDown(android.test.InstrumentationTestCase, android.app.Activity);
    method public static void dragQuarterScreenUp(android.test.ActivityInstrumentationTestCase);
    method public static void dragQuarterScreenUp(android.test.InstrumentationTestCase, android.app.Activity);
    method public static int dragViewBy(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
    method public static int dragViewBy(android.test.InstrumentationTestCase, android.view.View, int, int, int);
    method public static int dragViewTo(android.test.ActivityInstrumentationTestCase, android.view.View, int, int, int);
    method public static int dragViewTo(android.test.InstrumentationTestCase, android.view.View, int, int, int);
    method public static void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View);
    method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View);
    method public static void dragViewToBottom(android.test.ActivityInstrumentationTestCase, android.view.View, int);
    method public static void dragViewToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.View, int);
    method public static void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View);
    method public static void dragViewToTop(android.test.ActivityInstrumentationTestCase, android.view.View, int);
    method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View);
    method public static void dragViewToTop(android.test.InstrumentationTestCase, android.view.View, int);
    method public static int dragViewToX(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
    method public static int dragViewToX(android.test.InstrumentationTestCase, android.view.View, int, int);
    method public static int dragViewToY(android.test.ActivityInstrumentationTestCase, android.view.View, int, int);
    method public static int dragViewToY(android.test.InstrumentationTestCase, android.view.View, int, int);
    method public static void longClickView(android.test.ActivityInstrumentationTestCase, android.view.View);
    method public static void longClickView(android.test.InstrumentationTestCase, android.view.View);
    method public static void scrollToBottom(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
    method public static void scrollToBottom(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
    method public static void scrollToTop(android.test.ActivityInstrumentationTestCase, android.view.ViewGroup);
    method public static void scrollToTop(android.test.InstrumentationTestCase, android.app.Activity, android.view.ViewGroup);
    method public static void tapView(android.test.InstrumentationTestCase, android.view.View);
    method public static void touchAndCancelView(android.test.InstrumentationTestCase, android.view.View);
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface UiThreadTest {
  }

  public class ViewAsserts {
    method public static void assertBaselineAligned(android.view.View, android.view.View);
    method public static void assertBottomAligned(android.view.View, android.view.View);
    method public static void assertBottomAligned(android.view.View, android.view.View, int);
    method public static void assertGroupContains(android.view.ViewGroup, android.view.View);
    method public static void assertGroupIntegrity(android.view.ViewGroup);
    method public static void assertGroupNotContains(android.view.ViewGroup, android.view.View);
    method public static void assertHasScreenCoordinates(android.view.View, android.view.View, int, int);
    method public static void assertHorizontalCenterAligned(android.view.View, android.view.View);
    method public static void assertLeftAligned(android.view.View, android.view.View);
    method public static void assertLeftAligned(android.view.View, android.view.View, int);
    method public static void assertOffScreenAbove(android.view.View, android.view.View);
    method public static void assertOffScreenBelow(android.view.View, android.view.View);
    method public static void assertOnScreen(android.view.View, android.view.View);
    method public static void assertRightAligned(android.view.View, android.view.View);
    method public static void assertRightAligned(android.view.View, android.view.View, int);
    method public static void assertTopAligned(android.view.View, android.view.View);
    method public static void assertTopAligned(android.view.View, android.view.View, int);
    method public static void assertVerticalCenterAligned(android.view.View, android.view.View);
  }

}

package android.test.mock {

  public class MockApplication extends android.app.Application {
    ctor public MockApplication();
  }

  public class MockContentResolver extends android.content.ContentResolver {
    ctor public MockContentResolver();
    method public void addProvider(String, android.content.ContentProvider);
  }

  public class MockContext extends android.content.Context {
    ctor public MockContext();
    method public boolean bindService(android.content.Intent, android.content.ServiceConnection, int);
    method public int checkCallingOrSelfPermission(String);
    method public int checkCallingOrSelfUriPermission(android.net.Uri, int);
    method public int checkCallingPermission(String);
    method public int checkCallingUriPermission(android.net.Uri, int);
    method public int checkPermission(String, int, int);
    method public int checkUriPermission(android.net.Uri, int, int, int);
    method public int checkUriPermission(android.net.Uri, String, String, int, int, int);
    method public void clearWallpaper();
    method public android.content.Context createPackageContext(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public String[] databaseList();
    method public boolean deleteDatabase(String);
    method public boolean deleteFile(String);
    method public void enforceCallingOrSelfPermission(String, String);
    method public void enforceCallingOrSelfUriPermission(android.net.Uri, int, String);
    method public void enforceCallingPermission(String, String);
    method public void enforceCallingUriPermission(android.net.Uri, int, String);
    method public void enforcePermission(String, int, int, String);
    method public void enforceUriPermission(android.net.Uri, int, int, int, String);
    method public void enforceUriPermission(android.net.Uri, String, String, int, int, int, String);
    method public String[] fileList();
    method public android.content.Context getApplicationContext();
    method public android.content.res.AssetManager getAssets();
    method public java.io.File getCacheDir();
    method public ClassLoader getClassLoader();
    method public android.content.ContentResolver getContentResolver();
    method public java.io.File getDatabasePath(String);
    method public java.io.File getDir(String, int);
    method public java.io.File getFileStreamPath(String);
    method public java.io.File getFilesDir();
    method public android.os.Looper getMainLooper();
    method public String getPackageCodePath();
    method public android.content.pm.PackageManager getPackageManager();
    method public String getPackageName();
    method public String getPackageResourcePath();
    method public android.content.res.Resources getResources();
    method public android.content.SharedPreferences getSharedPreferences(String, int);
    method public Object getSystemService(String);
    method public android.content.res.Resources.Theme getTheme();
    method public android.graphics.drawable.Drawable getWallpaper();
    method public int getWallpaperDesiredMinimumHeight();
    method public int getWallpaperDesiredMinimumWidth();
    method public void grantUriPermission(String, android.net.Uri, int);
    method public java.io.FileInputStream openFileInput(String) throws java.io.FileNotFoundException;
    method public java.io.FileOutputStream openFileOutput(String, int) throws java.io.FileNotFoundException;
    method public android.database.sqlite.SQLiteDatabase openOrCreateDatabase(String, int, android.database.sqlite.SQLiteDatabase.CursorFactory);
    method public android.graphics.drawable.Drawable peekWallpaper();
    method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
    method public android.content.Intent registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, String, android.os.Handler);
    method public void removeStickyBroadcast(android.content.Intent);
    method public void revokeUriPermission(android.net.Uri, int);
    method public void sendBroadcast(android.content.Intent);
    method public void sendBroadcast(android.content.Intent, String);
    method public void sendOrderedBroadcast(android.content.Intent, String);
    method public void sendOrderedBroadcast(android.content.Intent, String, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
    method public void sendStickyBroadcast(android.content.Intent);
    method public void setTheme(int);
    method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
    method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
    method public void startActivity(android.content.Intent);
    method public boolean startInstrumentation(android.content.ComponentName, String, android.os.Bundle);
    method public android.content.ComponentName startService(android.content.Intent);
    method public boolean stopService(android.content.Intent);
    method public void unbindService(android.content.ServiceConnection);
    method public void unregisterReceiver(android.content.BroadcastReceiver);
  }

  public class MockDialogInterface implements android.content.DialogInterface {
    ctor public MockDialogInterface();
    method public void cancel();
    method public void dismiss();
  }

  public class MockPackageManager extends android.content.pm.PackageManager {
    ctor public MockPackageManager();
    method public void addPackageToPreferred(String);
    method public boolean addPermission(android.content.pm.PermissionInfo);
    method public void addPreferredActivity(android.content.IntentFilter, int, android.content.ComponentName[], android.content.ComponentName);
    method public int checkPermission(String, String);
    method public int checkSignatures(String, String);
    method public void clearPackagePreferredActivities(String);
    method public android.graphics.drawable.Drawable getActivityIcon(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.graphics.drawable.Drawable getActivityIcon(android.content.Intent) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.ActivityInfo getActivityInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public java.util.List<android.content.pm.PermissionGroupInfo> getAllPermissionGroups(int);
    method public int getApplicationEnabledSetting(String);
    method public android.graphics.drawable.Drawable getApplicationIcon(android.content.pm.ApplicationInfo);
    method public android.graphics.drawable.Drawable getApplicationIcon(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.ApplicationInfo getApplicationInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public CharSequence getApplicationLabel(android.content.pm.ApplicationInfo);
    method public int getComponentEnabledSetting(android.content.ComponentName);
    method public android.graphics.drawable.Drawable getDefaultActivityIcon();
    method public android.graphics.drawable.Drawable getDrawable(String, int, android.content.pm.ApplicationInfo);
    method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplications(int);
    method public java.util.List<android.content.pm.PackageInfo> getInstalledPackages(int);
    method public android.content.pm.InstrumentationInfo getInstrumentationInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.Intent getLaunchIntentForPackage(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public String getNameForUid(int);
    method public int[] getPackageGids(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.PackageInfo getPackageInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public String[] getPackagesForUid(int);
    method public android.content.pm.PermissionGroupInfo getPermissionGroupInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.PermissionInfo getPermissionInfo(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public int getPreferredActivities(java.util.List<android.content.IntentFilter>, java.util.List<android.content.ComponentName>, String);
    method public java.util.List<android.content.pm.PackageInfo> getPreferredPackages(int);
    method public android.content.pm.ActivityInfo getReceiverInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.res.Resources getResourcesForActivity(android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.res.Resources getResourcesForApplication(android.content.pm.ApplicationInfo);
    method public android.content.res.Resources getResourcesForApplication(String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public android.content.pm.ServiceInfo getServiceInfo(android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public String[] getSystemSharedLibraryNames();
    method public CharSequence getText(String, int, android.content.pm.ApplicationInfo);
    method public android.content.res.XmlResourceParser getXml(String, int, android.content.pm.ApplicationInfo);
    method public void installPackage(android.net.Uri, android.content.pm.IPackageInstallObserver, int);
    method public boolean isSafeMode();
    method public java.util.List<android.content.pm.ResolveInfo> queryBroadcastReceivers(android.content.Intent, int);
    method public java.util.List<android.content.pm.ProviderInfo> queryContentProviders(String, int, int);
    method public java.util.List<android.content.pm.InstrumentationInfo> queryInstrumentation(String, int);
    method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivities(android.content.Intent, int);
    method public java.util.List<android.content.pm.ResolveInfo> queryIntentActivityOptions(android.content.ComponentName, android.content.Intent[], android.content.Intent, int);
    method public java.util.List<android.content.pm.ResolveInfo> queryIntentServices(android.content.Intent, int);
    method public java.util.List<android.content.pm.PermissionInfo> queryPermissionsByGroup(String, int) throws android.content.pm.PackageManager.NameNotFoundException;
    method public void removePackageFromPreferred(String);
    method public void removePermission(String);
    method public android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
    method public android.content.pm.ProviderInfo resolveContentProvider(String, int);
    method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
    method public void setApplicationEnabledSetting(String, int, int);
    method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
  }

  public class MockResources extends android.content.res.Resources {
    ctor public MockResources();
  }

}

package android.test.suitebuilder {

  public class TestMethod {
    ctor public TestMethod(java.lang.reflect.Method, Class<? extends junit.framework.TestCase>);
    ctor public TestMethod(String, Class<? extends junit.framework.TestCase>);
    ctor public TestMethod(junit.framework.TestCase);
    method public junit.framework.TestCase createTest() throws java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
    method public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T>);
    method public Class<? extends junit.framework.TestCase> getEnclosingClass();
    method public String getEnclosingClassname();
    method public String getName();
  }

  public class TestSuiteBuilder {
    ctor public TestSuiteBuilder(Class);
    ctor public TestSuiteBuilder(String, ClassLoader);
    method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
    method public final android.test.suitebuilder.TestSuiteBuilder addRequirements(com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>...);
    method public final junit.framework.TestSuite build();
    method public android.test.suitebuilder.TestSuiteBuilder excludePackages(java.lang.String...);
    method protected String getSuiteName();
    method public final android.test.suitebuilder.TestSuiteBuilder includeAllPackagesUnderHere();
    method public android.test.suitebuilder.TestSuiteBuilder includePackages(java.lang.String...);
    method public android.test.suitebuilder.TestSuiteBuilder named(String);
  }

  public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
    ctor public TestSuiteBuilder.FailedToCreateTests(Exception);
    method public void testSuiteConstructionFailed();
  }

}

package android.test.suitebuilder.annotation {

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface LargeTest {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface MediumTest {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface SmallTest {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface Smoke {
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) public @interface Suppress {
  }

}

package android.text {

  public class AlteredCharSequence implements java.lang.CharSequence android.text.GetChars {
    method public char charAt(int);
    method public void getChars(int, int, char[], int);
    method public int length();
    method public static android.text.AlteredCharSequence make(CharSequence, char[], int, int);
    method public CharSequence subSequence(int, int);
  }

  public class AndroidCharacter {
    ctor public AndroidCharacter();
    method public static void getDirectionalities(char[], byte[], int);
    method public static char getMirror(char);
    method public static boolean mirror(char[], int, int);
  }

  public class Annotation implements android.text.ParcelableSpan {
    ctor public Annotation(String, String);
    ctor public Annotation(android.os.Parcel);
    method public int describeContents();
    method public String getKey();
    method public int getSpanTypeId();
    method public String getValue();
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class AutoText {
    method public static String get(CharSequence, int, int, android.view.View);
    method public static int getSize(android.view.View);
  }

  public class BoringLayout extends android.text.Layout implements android.text.TextUtils.EllipsizeCallback {
    ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    ctor public BoringLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    method public void ellipsized(int, int);
    method public int getBottomPadding();
    method public int getEllipsisCount(int);
    method public int getEllipsisStart(int);
    method public boolean getLineContainsTab(int);
    method public int getLineCount();
    method public int getLineDescent(int);
    method public final android.text.Layout.Directions getLineDirections(int);
    method public int getLineStart(int);
    method public int getLineTop(int);
    method public int getParagraphDirection(int);
    method public int getTopPadding();
    method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint);
    method public static android.text.BoringLayout.Metrics isBoring(CharSequence, android.text.TextPaint, android.text.BoringLayout.Metrics);
    method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    method public static android.text.BoringLayout make(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
    method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean);
    method public android.text.BoringLayout replaceOrMake(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, android.text.BoringLayout.Metrics, boolean, android.text.TextUtils.TruncateAt, int);
  }

  public static class BoringLayout.Metrics extends android.graphics.Paint.FontMetricsInt {
    ctor public BoringLayout.Metrics();
    field public int width;
  }

  public class ClipboardManager {
    method public CharSequence getText();
    method public boolean hasText();
    method public void setText(CharSequence);
  }

  public class DynamicLayout extends android.text.Layout {
    ctor public DynamicLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
    ctor public DynamicLayout(CharSequence, CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
    ctor public DynamicLayout(CharSequence, CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean, android.text.TextUtils.TruncateAt, int);
    method public int getBottomPadding();
    method public int getEllipsisCount(int);
    method public int getEllipsisStart(int);
    method public boolean getLineContainsTab(int);
    method public int getLineCount();
    method public int getLineDescent(int);
    method public final android.text.Layout.Directions getLineDirections(int);
    method public int getLineStart(int);
    method public int getLineTop(int);
    method public int getParagraphDirection(int);
    method public int getTopPadding();
  }

  public interface Editable extends java.lang.CharSequence java.lang.Appendable android.text.GetChars android.text.Spannable {
    method public android.text.Editable append(CharSequence);
    method public android.text.Editable append(CharSequence, int, int);
    method public android.text.Editable append(char);
    method public void clear();
    method public void clearSpans();
    method public android.text.Editable delete(int, int);
    method public android.text.InputFilter[] getFilters();
    method public android.text.Editable insert(int, CharSequence, int, int);
    method public android.text.Editable insert(int, CharSequence);
    method public android.text.Editable replace(int, int, CharSequence, int, int);
    method public android.text.Editable replace(int, int, CharSequence);
    method public void setFilters(android.text.InputFilter[]);
  }

  public static class Editable.Factory {
    ctor public Editable.Factory();
    method public static android.text.Editable.Factory getInstance();
    method public android.text.Editable newEditable(CharSequence);
  }

  public interface GetChars extends java.lang.CharSequence {
    method public void getChars(int, int, char[], int);
  }

  public class Html {
    method public static android.text.Spanned fromHtml(String);
    method public static android.text.Spanned fromHtml(String, android.text.Html.ImageGetter, android.text.Html.TagHandler);
    method public static String toHtml(android.text.Spanned);
  }

  public static interface Html.ImageGetter {
    method public android.graphics.drawable.Drawable getDrawable(String);
  }

  public static interface Html.TagHandler {
    method public void handleTag(boolean, String, android.text.Editable, org.xml.sax.XMLReader);
  }

  public interface InputFilter {
    method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
  }

  public static class InputFilter.AllCaps implements android.text.InputFilter {
    ctor public InputFilter.AllCaps();
    method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
  }

  public static class InputFilter.LengthFilter implements android.text.InputFilter {
    ctor public InputFilter.LengthFilter(int);
    method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
  }

  public interface InputType {
    field public static final int TYPE_CLASS_DATETIME = 4; // 0x4
    field public static final int TYPE_CLASS_NUMBER = 2; // 0x2
    field public static final int TYPE_CLASS_PHONE = 3; // 0x3
    field public static final int TYPE_CLASS_TEXT = 1; // 0x1
    field public static final int TYPE_DATETIME_VARIATION_DATE = 16; // 0x10
    field public static final int TYPE_DATETIME_VARIATION_NORMAL = 0; // 0x0
    field public static final int TYPE_DATETIME_VARIATION_TIME = 32; // 0x20
    field public static final int TYPE_MASK_CLASS = 15; // 0xf
    field public static final int TYPE_MASK_FLAGS = 16773120; // 0xfff000
    field public static final int TYPE_MASK_VARIATION = 4080; // 0xff0
    field public static final int TYPE_NULL = 0; // 0x0
    field public static final int TYPE_NUMBER_FLAG_DECIMAL = 8192; // 0x2000
    field public static final int TYPE_NUMBER_FLAG_SIGNED = 4096; // 0x1000
    field public static final int TYPE_TEXT_FLAG_AUTO_COMPLETE = 65536; // 0x10000
    field public static final int TYPE_TEXT_FLAG_AUTO_CORRECT = 32768; // 0x8000
    field public static final int TYPE_TEXT_FLAG_CAP_CHARACTERS = 4096; // 0x1000
    field public static final int TYPE_TEXT_FLAG_CAP_SENTENCES = 16384; // 0x4000
    field public static final int TYPE_TEXT_FLAG_CAP_WORDS = 8192; // 0x2000
    field public static final int TYPE_TEXT_FLAG_IME_MULTI_LINE = 262144; // 0x40000
    field public static final int TYPE_TEXT_FLAG_MULTI_LINE = 131072; // 0x20000
    field public static final int TYPE_TEXT_VARIATION_EMAIL_ADDRESS = 32; // 0x20
    field public static final int TYPE_TEXT_VARIATION_EMAIL_SUBJECT = 48; // 0x30
    field public static final int TYPE_TEXT_VARIATION_FILTER = 176; // 0xb0
    field public static final int TYPE_TEXT_VARIATION_LONG_MESSAGE = 80; // 0x50
    field public static final int TYPE_TEXT_VARIATION_NORMAL = 0; // 0x0
    field public static final int TYPE_TEXT_VARIATION_PASSWORD = 128; // 0x80
    field public static final int TYPE_TEXT_VARIATION_PERSON_NAME = 96; // 0x60
    field public static final int TYPE_TEXT_VARIATION_PHONETIC = 192; // 0xc0
    field public static final int TYPE_TEXT_VARIATION_POSTAL_ADDRESS = 112; // 0x70
    field public static final int TYPE_TEXT_VARIATION_SHORT_MESSAGE = 64; // 0x40
    field public static final int TYPE_TEXT_VARIATION_URI = 16; // 0x10
    field public static final int TYPE_TEXT_VARIATION_VISIBLE_PASSWORD = 144; // 0x90
    field public static final int TYPE_TEXT_VARIATION_WEB_EDIT_TEXT = 160; // 0xa0
  }

  public abstract class Layout {
    ctor protected Layout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float);
    method public void draw(android.graphics.Canvas);
    method public void draw(android.graphics.Canvas, android.graphics.Path, android.graphics.Paint, int);
    method public final android.text.Layout.Alignment getAlignment();
    method public abstract int getBottomPadding();
    method public void getCursorPath(int, android.graphics.Path, CharSequence);
    method public static float getDesiredWidth(CharSequence, android.text.TextPaint);
    method public static float getDesiredWidth(CharSequence, int, int, android.text.TextPaint);
    method public abstract int getEllipsisCount(int);
    method public abstract int getEllipsisStart(int);
    method public int getEllipsizedWidth();
    method public int getHeight();
    method public final int getLineAscent(int);
    method public final int getLineBaseline(int);
    method public final int getLineBottom(int);
    method public int getLineBounds(int, android.graphics.Rect);
    method public abstract boolean getLineContainsTab(int);
    method public abstract int getLineCount();
    method public abstract int getLineDescent(int);
    method public abstract android.text.Layout.Directions getLineDirections(int);
    method public final int getLineEnd(int);
    method public int getLineForOffset(int);
    method public int getLineForVertical(int);
    method public float getLineLeft(int);
    method public float getLineMax(int);
    method public float getLineRight(int);
    method public abstract int getLineStart(int);
    method public abstract int getLineTop(int);
    method public int getLineVisibleEnd(int);
    method public float getLineWidth(int);
    method public int getOffsetForHorizontal(int, float);
    method public int getOffsetToLeftOf(int);
    method public int getOffsetToRightOf(int);
    method public final android.text.TextPaint getPaint();
    method public final android.text.Layout.Alignment getParagraphAlignment(int);
    method public abstract int getParagraphDirection(int);
    method public final int getParagraphLeft(int);
    method public final int getParagraphRight(int);
    method public float getPrimaryHorizontal(int);
    method public float getSecondaryHorizontal(int);
    method public void getSelectionPath(int, int, android.graphics.Path);
    method public final float getSpacingAdd();
    method public final float getSpacingMultiplier();
    method public final CharSequence getText();
    method public abstract int getTopPadding();
    method public final int getWidth();
    method public final void increaseWidthTo(int);
    method protected final boolean isSpanned();
    field public static final int DIR_LEFT_TO_RIGHT = 1; // 0x1
    field public static final int DIR_RIGHT_TO_LEFT = -1; // 0xffffffff
  }

  public enum Layout.Alignment {
    enum_constant public static final android.text.Layout.Alignment ALIGN_CENTER;
    enum_constant public static final android.text.Layout.Alignment ALIGN_NORMAL;
    enum_constant public static final android.text.Layout.Alignment ALIGN_OPPOSITE;
  }

  public static class Layout.Directions {
  }

  public abstract class LoginFilter implements android.text.InputFilter {
    method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
    method public abstract boolean isAllowed(char);
    method public void onInvalidCharacter(char);
    method public void onStart();
    method public void onStop();
  }

  public static class LoginFilter.PasswordFilterGMail extends android.text.LoginFilter {
    ctor public LoginFilter.PasswordFilterGMail();
    ctor public LoginFilter.PasswordFilterGMail(boolean);
    method public boolean isAllowed(char);
  }

  public static class LoginFilter.UsernameFilterGMail extends android.text.LoginFilter {
    ctor public LoginFilter.UsernameFilterGMail();
    ctor public LoginFilter.UsernameFilterGMail(boolean);
    method public boolean isAllowed(char);
  }

  public static class LoginFilter.UsernameFilterGeneric extends android.text.LoginFilter {
    ctor public LoginFilter.UsernameFilterGeneric();
    ctor public LoginFilter.UsernameFilterGeneric(boolean);
    method public boolean isAllowed(char);
  }

  public interface NoCopySpan {
  }

  public static class NoCopySpan.Concrete implements android.text.NoCopySpan {
    ctor public NoCopySpan.Concrete();
  }

  public interface ParcelableSpan extends android.os.Parcelable {
    method public int getSpanTypeId();
  }

  public class Selection {
    method public static boolean extendDown(android.text.Spannable, android.text.Layout);
    method public static boolean extendLeft(android.text.Spannable, android.text.Layout);
    method public static boolean extendRight(android.text.Spannable, android.text.Layout);
    method public static final void extendSelection(android.text.Spannable, int);
    method public static boolean extendToLeftEdge(android.text.Spannable, android.text.Layout);
    method public static boolean extendToRightEdge(android.text.Spannable, android.text.Layout);
    method public static boolean extendUp(android.text.Spannable, android.text.Layout);
    method public static final int getSelectionEnd(CharSequence);
    method public static final int getSelectionStart(CharSequence);
    method public static boolean moveDown(android.text.Spannable, android.text.Layout);
    method public static boolean moveLeft(android.text.Spannable, android.text.Layout);
    method public static boolean moveRight(android.text.Spannable, android.text.Layout);
    method public static boolean moveToLeftEdge(android.text.Spannable, android.text.Layout);
    method public static boolean moveToRightEdge(android.text.Spannable, android.text.Layout);
    method public static boolean moveUp(android.text.Spannable, android.text.Layout);
    method public static final void removeSelection(android.text.Spannable);
    method public static final void selectAll(android.text.Spannable);
    method public static void setSelection(android.text.Spannable, int, int);
    method public static final void setSelection(android.text.Spannable, int);
    field public static final Object SELECTION_END;
    field public static final Object SELECTION_START;
  }

  public interface SpanWatcher extends android.text.NoCopySpan {
    method public void onSpanAdded(android.text.Spannable, Object, int, int);
    method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
    method public void onSpanRemoved(android.text.Spannable, Object, int, int);
  }

  public interface Spannable extends android.text.Spanned {
    method public void removeSpan(Object);
    method public void setSpan(Object, int, int, int);
  }

  public static class Spannable.Factory {
    ctor public Spannable.Factory();
    method public static android.text.Spannable.Factory getInstance();
    method public android.text.Spannable newSpannable(CharSequence);
  }

  public class SpannableString implements java.lang.CharSequence android.text.GetChars android.text.Spannable {
    ctor public SpannableString(CharSequence);
    method public final char charAt(int);
    method public final void getChars(int, int, char[], int);
    method public int getSpanEnd(Object);
    method public int getSpanFlags(Object);
    method public int getSpanStart(Object);
    method public <T> T[] getSpans(int, int, Class<T>);
    method public final int length();
    method public int nextSpanTransition(int, int, Class);
    method public void removeSpan(Object);
    method public void setSpan(Object, int, int, int);
    method public final CharSequence subSequence(int, int);
    method public final String toString();
    method public static android.text.SpannableString valueOf(CharSequence);
  }

  public class SpannableStringBuilder implements java.lang.Appendable java.lang.CharSequence android.text.Editable android.text.GetChars android.text.Spannable {
    ctor public SpannableStringBuilder();
    ctor public SpannableStringBuilder(CharSequence);
    ctor public SpannableStringBuilder(CharSequence, int, int);
    method public android.text.SpannableStringBuilder append(CharSequence);
    method public android.text.SpannableStringBuilder append(CharSequence, int, int);
    method public android.text.SpannableStringBuilder append(char);
    method public char charAt(int);
    method public void clear();
    method public void clearSpans();
    method public android.text.SpannableStringBuilder delete(int, int);
    method public void getChars(int, int, char[], int);
    method public android.text.InputFilter[] getFilters();
    method public int getSpanEnd(Object);
    method public int getSpanFlags(Object);
    method public int getSpanStart(Object);
    method public <T> T[] getSpans(int, int, Class<T>);
    method public android.text.SpannableStringBuilder insert(int, CharSequence, int, int);
    method public android.text.SpannableStringBuilder insert(int, CharSequence);
    method public int length();
    method public int nextSpanTransition(int, int, Class);
    method public void removeSpan(Object);
    method public android.text.SpannableStringBuilder replace(int, int, CharSequence);
    method public android.text.SpannableStringBuilder replace(int, int, CharSequence, int, int);
    method public void setFilters(android.text.InputFilter[]);
    method public void setSpan(Object, int, int, int);
    method public CharSequence subSequence(int, int);
    method public static android.text.SpannableStringBuilder valueOf(CharSequence);
  }

  public interface Spanned extends java.lang.CharSequence {
    method public int getSpanEnd(Object);
    method public int getSpanFlags(Object);
    method public int getSpanStart(Object);
    method public <T> T[] getSpans(int, int, Class<T>);
    method public int nextSpanTransition(int, int, Class);
    field public static final int SPAN_COMPOSING = 256; // 0x100
    field public static final int SPAN_EXCLUSIVE_EXCLUSIVE = 33; // 0x21
    field public static final int SPAN_EXCLUSIVE_INCLUSIVE = 34; // 0x22
    field public static final int SPAN_INCLUSIVE_EXCLUSIVE = 17; // 0x11
    field public static final int SPAN_INCLUSIVE_INCLUSIVE = 18; // 0x12
    field public static final int SPAN_INTERMEDIATE = 512; // 0x200
    field public static final int SPAN_MARK_MARK = 17; // 0x11
    field public static final int SPAN_MARK_POINT = 18; // 0x12
    field public static final int SPAN_PARAGRAPH = 51; // 0x33
    field public static final int SPAN_POINT_MARK = 33; // 0x21
    field public static final int SPAN_POINT_MARK_MASK = 51; // 0x33
    field public static final int SPAN_POINT_POINT = 34; // 0x22
    field public static final int SPAN_PRIORITY = 16711680; // 0xff0000
    field public static final int SPAN_PRIORITY_SHIFT = 16; // 0x10
    field public static final int SPAN_USER = -16777216; // 0xff000000
    field public static final int SPAN_USER_SHIFT = 24; // 0x18
  }

  public final class SpannedString implements java.lang.CharSequence android.text.GetChars android.text.Spanned {
    ctor public SpannedString(CharSequence);
    method public final char charAt(int);
    method public final void getChars(int, int, char[], int);
    method public int getSpanEnd(Object);
    method public int getSpanFlags(Object);
    method public int getSpanStart(Object);
    method public <T> T[] getSpans(int, int, Class<T>);
    method public final int length();
    method public int nextSpanTransition(int, int, Class);
    method public CharSequence subSequence(int, int);
    method public static android.text.SpannedString valueOf(CharSequence);
  }

  public class StaticLayout extends android.text.Layout {
    ctor public StaticLayout(CharSequence, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
    ctor public StaticLayout(CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean);
    ctor public StaticLayout(CharSequence, int, int, android.text.TextPaint, int, android.text.Layout.Alignment, float, float, boolean, android.text.TextUtils.TruncateAt, int);
    method public int getBottomPadding();
    method public int getEllipsisCount(int);
    method public int getEllipsisStart(int);
    method public boolean getLineContainsTab(int);
    method public int getLineCount();
    method public int getLineDescent(int);
    method public final android.text.Layout.Directions getLineDirections(int);
    method public int getLineStart(int);
    method public int getLineTop(int);
    method public int getParagraphDirection(int);
    method public int getTopPadding();
  }

  public class TextPaint extends android.graphics.Paint {
    ctor public TextPaint();
    ctor public TextPaint(int);
    ctor public TextPaint(android.graphics.Paint);
    method public void set(android.text.TextPaint);
    field public int baselineShift;
    field public int bgColor;
    field public int[] drawableState;
    field public int linkColor;
  }

  public class TextUtils {
    method public static CharSequence commaEllipsize(CharSequence, android.text.TextPaint, float, String, String);
    method public static CharSequence concat(java.lang.CharSequence...);
    method public static void copySpansFrom(android.text.Spanned, int, int, Class, android.text.Spannable, int);
    method public static void dumpSpans(CharSequence, android.util.Printer, String);
    method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt);
    method public static CharSequence ellipsize(CharSequence, android.text.TextPaint, float, android.text.TextUtils.TruncateAt, boolean, android.text.TextUtils.EllipsizeCallback);
    method public static boolean equals(CharSequence, CharSequence);
    method public static CharSequence expandTemplate(CharSequence, java.lang.CharSequence...);
    method public static int getCapsMode(CharSequence, int, int);
    method public static void getChars(CharSequence, int, int, char[], int);
    method public static int getOffsetAfter(CharSequence, int);
    method public static int getOffsetBefore(CharSequence, int);
    method public static CharSequence getReverse(CharSequence, int, int);
    method public static int getTrimmedLength(CharSequence);
    method public static String htmlEncode(String);
    method public static int indexOf(CharSequence, char);
    method public static int indexOf(CharSequence, char, int);
    method public static int indexOf(CharSequence, char, int, int);
    method public static int indexOf(CharSequence, CharSequence);
    method public static int indexOf(CharSequence, CharSequence, int);
    method public static int indexOf(CharSequence, CharSequence, int, int);
    method public static boolean isDigitsOnly(CharSequence);
    method public static boolean isEmpty(CharSequence);
    method public static boolean isGraphic(CharSequence);
    method public static boolean isGraphic(char);
    method public static String join(CharSequence, Object[]);
    method public static String join(CharSequence, Iterable);
    method public static int lastIndexOf(CharSequence, char);
    method public static int lastIndexOf(CharSequence, char, int);
    method public static int lastIndexOf(CharSequence, char, int, int);
    method public static boolean regionMatches(CharSequence, int, CharSequence, int, int);
    method public static CharSequence replace(CharSequence, String[], CharSequence[]);
    method public static String[] split(String, String);
    method public static String[] split(String, java.util.regex.Pattern);
    method public static CharSequence stringOrSpannedString(CharSequence);
    method public static String substring(CharSequence, int, int);
    method public static void writeToParcel(CharSequence, android.os.Parcel, int);
    field public static final int CAP_MODE_CHARACTERS = 4096; // 0x1000
    field public static final int CAP_MODE_SENTENCES = 16384; // 0x4000
    field public static final int CAP_MODE_WORDS = 8192; // 0x2000
    field public static final android.os.Parcelable.Creator<java.lang.CharSequence> CHAR_SEQUENCE_CREATOR;
  }

  public static interface TextUtils.EllipsizeCallback {
    method public void ellipsized(int, int);
  }

  public static class TextUtils.SimpleStringSplitter implements java.util.Iterator<java.lang.String> android.text.TextUtils.StringSplitter {
    ctor public TextUtils.SimpleStringSplitter(char);
    method public boolean hasNext();
    method public java.util.Iterator<java.lang.String> iterator();
    method public String next();
    method public void remove();
    method public void setString(String);
  }

  public static interface TextUtils.StringSplitter extends java.lang.Iterable<java.lang.String> {
    method public void setString(String);
  }

  public enum TextUtils.TruncateAt {
    enum_constant public static final android.text.TextUtils.TruncateAt END;
    enum_constant public static final android.text.TextUtils.TruncateAt MARQUEE;
    enum_constant public static final android.text.TextUtils.TruncateAt MIDDLE;
    enum_constant public static final android.text.TextUtils.TruncateAt START;
  }

  public interface TextWatcher extends android.text.NoCopySpan {
    method public void afterTextChanged(android.text.Editable);
    method public void beforeTextChanged(CharSequence, int, int, int);
    method public void onTextChanged(CharSequence, int, int, int);
  }

}

package android.text.format {

  public class DateFormat {
    ctor public DateFormat();
    method public static final CharSequence format(CharSequence, long);
    method public static final CharSequence format(CharSequence, java.util.Date);
    method public static final CharSequence format(CharSequence, java.util.Calendar);
    method public static final java.text.DateFormat getDateFormat(android.content.Context);
    method public static final char[] getDateFormatOrder(android.content.Context);
    method public static final java.text.DateFormat getLongDateFormat(android.content.Context);
    method public static final java.text.DateFormat getMediumDateFormat(android.content.Context);
    method public static final java.text.DateFormat getTimeFormat(android.content.Context);
    method public static boolean is24HourFormat(android.content.Context);
    field public static final char AM_PM = 97; // 0x0061 'a'
    field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
    field public static final char DATE = 100; // 0x0064 'd'
    field public static final char DAY = 69; // 0x0045 'E'
    field public static final char HOUR = 104; // 0x0068 'h'
    field public static final char HOUR_OF_DAY = 107; // 0x006b 'k'
    field public static final char MINUTE = 109; // 0x006d 'm'
    field public static final char MONTH = 77; // 0x004d 'M'
    field public static final char QUOTE = 39; // 0x0027 '\''
    field public static final char SECONDS = 115; // 0x0073 's'
    field public static final char TIME_ZONE = 122; // 0x007a 'z'
    field public static final char YEAR = 121; // 0x0079 'y'
  }

  public class DateUtils {
    ctor public DateUtils();
    method public static String formatDateRange(android.content.Context, long, long, int);
    method public static String formatDateTime(android.content.Context, long, int);
    method public static String formatElapsedTime(long);
    method public static String formatElapsedTime(StringBuilder, long);
    method public static final CharSequence formatSameDayTime(long, long, int, int);
    method public static String getAMPMString(int);
    method public static String getDayOfWeekString(int, int);
    method public static String getMonthString(int, int);
    method public static CharSequence getRelativeDateTimeString(android.content.Context, long, long, long, int);
    method public static CharSequence getRelativeTimeSpanString(long);
    method public static CharSequence getRelativeTimeSpanString(long, long, long);
    method public static CharSequence getRelativeTimeSpanString(long, long, long, int);
    method public static CharSequence getRelativeTimeSpanString(android.content.Context, long, boolean);
    method public static CharSequence getRelativeTimeSpanString(android.content.Context, long);
    method public static boolean isToday(long);
    field public static final String ABBREV_MONTH_FORMAT = "%b";
    field public static final String ABBREV_WEEKDAY_FORMAT = "%a";
    field public static final long DAY_IN_MILLIS = 86400000L; // 0x5265c00L
    field public static final int FORMAT_12HOUR = 64; // 0x40
    field public static final int FORMAT_24HOUR = 128; // 0x80
    field public static final int FORMAT_ABBREV_ALL = 524288; // 0x80000
    field public static final int FORMAT_ABBREV_MONTH = 65536; // 0x10000
    field public static final int FORMAT_ABBREV_RELATIVE = 262144; // 0x40000
    field public static final int FORMAT_ABBREV_TIME = 16384; // 0x4000
    field public static final int FORMAT_ABBREV_WEEKDAY = 32768; // 0x8000
    field public static final int FORMAT_CAP_AMPM = 256; // 0x100
    field public static final int FORMAT_CAP_MIDNIGHT = 4096; // 0x1000
    field public static final int FORMAT_CAP_NOON = 1024; // 0x400
    field public static final int FORMAT_CAP_NOON_MIDNIGHT = 5120; // 0x1400
    field public static final int FORMAT_NO_MIDNIGHT = 2048; // 0x800
    field public static final int FORMAT_NO_MONTH_DAY = 32; // 0x20
    field public static final int FORMAT_NO_NOON = 512; // 0x200
    field public static final int FORMAT_NO_NOON_MIDNIGHT = 2560; // 0xa00
    field public static final int FORMAT_NO_YEAR = 8; // 0x8
    field public static final int FORMAT_NUMERIC_DATE = 131072; // 0x20000
    field public static final int FORMAT_SHOW_DATE = 16; // 0x10
    field public static final int FORMAT_SHOW_TIME = 1; // 0x1
    field public static final int FORMAT_SHOW_WEEKDAY = 2; // 0x2
    field public static final int FORMAT_SHOW_YEAR = 4; // 0x4
    field public static final int FORMAT_UTC = 8192; // 0x2000
    field public static final long HOUR_IN_MILLIS = 3600000L; // 0x36ee80L
    field public static final String HOUR_MINUTE_24 = "%H:%M";
    field public static final int LENGTH_LONG = 10; // 0xa
    field public static final int LENGTH_MEDIUM = 20; // 0x14
    field public static final int LENGTH_SHORT = 30; // 0x1e
    field public static final int LENGTH_SHORTER = 40; // 0x28
    field public static final int LENGTH_SHORTEST = 50; // 0x32
    field public static final long MINUTE_IN_MILLIS = 60000L; // 0xea60L
    field public static final String MONTH_DAY_FORMAT = "%-d";
    field public static final String MONTH_FORMAT = "%B";
    field public static final String NUMERIC_MONTH_FORMAT = "%m";
    field public static final long SECOND_IN_MILLIS = 1000L; // 0x3e8L
    field public static final String WEEKDAY_FORMAT = "%A";
    field public static final long WEEK_IN_MILLIS = 604800000L; // 0x240c8400L
    field public static final String YEAR_FORMAT = "%Y";
    field public static final String YEAR_FORMAT_TWO_DIGITS = "%g";
    field public static final long YEAR_IN_MILLIS = 31449600000L; // 0x7528ad000L
    field public static final int[] sameMonthTable;
    field public static final int[] sameYearTable;
  }

  public final class Formatter {
    ctor public Formatter();
    method public static String formatFileSize(android.content.Context, long);
    method public static String formatIpAddress(int);
  }

  public class Time {
    ctor public Time(String);
    ctor public Time();
    ctor public Time(android.text.format.Time);
    method public boolean after(android.text.format.Time);
    method public boolean before(android.text.format.Time);
    method public void clear(String);
    method public static int compare(android.text.format.Time, android.text.format.Time);
    method public String format(String);
    method public String format2445();
    method public String format3339(boolean);
    method public int getActualMaximum(int);
    method public static String getCurrentTimezone();
    method public static int getJulianDay(long, long);
    method public int getWeekNumber();
    method public static boolean isEpoch(android.text.format.Time);
    method public long normalize(boolean);
    method public boolean parse(String);
    method public boolean parse3339(String);
    method public void set(long);
    method public void set(android.text.format.Time);
    method public void set(int, int, int, int, int, int);
    method public void set(int, int, int);
    method public long setJulianDay(int);
    method public void setToNow();
    method public void switchTimezone(String);
    method public long toMillis(boolean);
    field public static final int EPOCH_JULIAN_DAY = 2440588; // 0x253d8c
    field public static final int FRIDAY = 5; // 0x5
    field public static final int HOUR = 3; // 0x3
    field public static final int MINUTE = 2; // 0x2
    field public static final int MONDAY = 1; // 0x1
    field public static final int MONTH = 5; // 0x5
    field public static final int MONTH_DAY = 4; // 0x4
    field public static final int SATURDAY = 6; // 0x6
    field public static final int SECOND = 1; // 0x1
    field public static final int SUNDAY = 0; // 0x0
    field public static final int THURSDAY = 4; // 0x4
    field public static final String TIMEZONE_UTC = "UTC";
    field public static final int TUESDAY = 2; // 0x2
    field public static final int WEDNESDAY = 3; // 0x3
    field public static final int WEEK_DAY = 7; // 0x7
    field public static final int WEEK_NUM = 9; // 0x9
    field public static final int YEAR = 6; // 0x6
    field public static final int YEAR_DAY = 8; // 0x8
    field public boolean allDay;
    field public long gmtoff;
    field public int hour;
    field public int isDst;
    field public int minute;
    field public int month;
    field public int monthDay;
    field public int second;
    field public String timezone;
    field public int weekDay;
    field public int year;
    field public int yearDay;
  }

}

package android.text.method {

  public class ArrowKeyMovementMethod implements android.text.method.MovementMethod {
    ctor public ArrowKeyMovementMethod();
    method public boolean canSelectArbitrarily();
    method public static android.text.method.MovementMethod getInstance();
    method public void initialize(android.widget.TextView, android.text.Spannable);
    method public boolean onKeyDown(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public boolean onKeyOther(android.widget.TextView, android.text.Spannable, android.view.KeyEvent);
    method public boolean onKeyUp(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public void onTakeFocus(android.widget.TextView, android.text.Spannable, int);
    method public boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
    method public boolean onTrackballEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
  }

  public abstract class BaseKeyListener extends android.text.method.MetaKeyKeyListener implements android.text.method.KeyListener {
    ctor public BaseKeyListener();
    method public boolean backspace(android.view.View, android.text.Editable, int, android.view.KeyEvent);
    method public boolean onKeyOther(android.view.View, android.text.Editable, android.view.KeyEvent);
  }

  public class CharacterPickerDialog extends android.app.Dialog implements android.widget.AdapterView.OnItemClickListener android.view.View.OnClickListener {
    ctor public CharacterPickerDialog(android.content.Context, android.view.View, android.text.Editable, String, boolean);
    method public void onClick(android.view.View);
    method public void onItemClick(android.widget.AdapterView, android.view.View, int, long);
  }

  public class DateKeyListener extends android.text.method.NumberKeyListener {
    ctor public DateKeyListener();
    method protected char[] getAcceptedChars();
    method public int getInputType();
    method public static android.text.method.DateKeyListener getInstance();
    field public static final char[] CHARACTERS;
  }

  public class DateTimeKeyListener extends android.text.method.NumberKeyListener {
    ctor public DateTimeKeyListener();
    method protected char[] getAcceptedChars();
    method public int getInputType();
    method public static android.text.method.DateTimeKeyListener getInstance();
    field public static final char[] CHARACTERS;
  }

  public class DialerKeyListener extends android.text.method.NumberKeyListener {
    ctor public DialerKeyListener();
    method protected char[] getAcceptedChars();
    method public int getInputType();
    method public static android.text.method.DialerKeyListener getInstance();
    field public static final char[] CHARACTERS;
  }

  public class DigitsKeyListener extends android.text.method.NumberKeyListener {
    ctor public DigitsKeyListener();
    ctor public DigitsKeyListener(boolean, boolean);
    method protected char[] getAcceptedChars();
    method public int getInputType();
    method public static android.text.method.DigitsKeyListener getInstance();
    method public static android.text.method.DigitsKeyListener getInstance(boolean, boolean);
    method public static android.text.method.DigitsKeyListener getInstance(String);
  }

  public class HideReturnsTransformationMethod extends android.text.method.ReplacementTransformationMethod {
    ctor public HideReturnsTransformationMethod();
    method public static android.text.method.HideReturnsTransformationMethod getInstance();
    method protected char[] getOriginal();
    method protected char[] getReplacement();
  }

  public interface KeyListener {
    method public void clearMetaKeyState(android.view.View, android.text.Editable, int);
    method public int getInputType();
    method public boolean onKeyDown(android.view.View, android.text.Editable, int, android.view.KeyEvent);
    method public boolean onKeyOther(android.view.View, android.text.Editable, android.view.KeyEvent);
    method public boolean onKeyUp(android.view.View, android.text.Editable, int, android.view.KeyEvent);
  }

  public class LinkMovementMethod extends android.text.method.ScrollingMovementMethod {
    ctor public LinkMovementMethod();
    method public static android.text.method.MovementMethod getInstance();
  }

  public abstract class MetaKeyKeyListener {
    ctor public MetaKeyKeyListener();
    method public static void adjustMetaAfterKeypress(android.text.Spannable);
    method public static long adjustMetaAfterKeypress(long);
    method public void clearMetaKeyState(android.view.View, android.text.Editable, int);
    method public static void clearMetaKeyState(android.text.Editable, int);
    method public long clearMetaKeyState(long, int);
    method public static final int getMetaState(CharSequence);
    method public static final int getMetaState(CharSequence, int);
    method public static final int getMetaState(long);
    method public static final int getMetaState(long, int);
    method public static long handleKeyDown(long, int, android.view.KeyEvent);
    method public static long handleKeyUp(long, int, android.view.KeyEvent);
    method public static boolean isMetaTracker(CharSequence, Object);
    method public static boolean isSelectingMetaTracker(CharSequence, Object);
    method public boolean onKeyDown(android.view.View, android.text.Editable, int, android.view.KeyEvent);
    method public boolean onKeyUp(android.view.View, android.text.Editable, int, android.view.KeyEvent);
    method protected static void resetLockedMeta(android.text.Spannable);
    method public static long resetLockedMeta(long);
    method public static void resetMetaState(android.text.Spannable);
    field public static final int META_ALT_LOCKED = 512; // 0x200
    field public static final int META_ALT_ON = 2; // 0x2
    field public static final int META_CAP_LOCKED = 256; // 0x100
    field public static final int META_SHIFT_ON = 1; // 0x1
    field public static final int META_SYM_LOCKED = 1024; // 0x400
    field public static final int META_SYM_ON = 4; // 0x4
  }

  public interface MovementMethod {
    method public boolean canSelectArbitrarily();
    method public void initialize(android.widget.TextView, android.text.Spannable);
    method public boolean onKeyDown(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public boolean onKeyOther(android.widget.TextView, android.text.Spannable, android.view.KeyEvent);
    method public boolean onKeyUp(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public void onTakeFocus(android.widget.TextView, android.text.Spannable, int);
    method public boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
    method public boolean onTrackballEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
  }

  public class MultiTapKeyListener extends android.text.method.BaseKeyListener implements android.text.SpanWatcher {
    ctor public MultiTapKeyListener(android.text.method.TextKeyListener.Capitalize, boolean);
    method public int getInputType();
    method public static android.text.method.MultiTapKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
    method public void onSpanAdded(android.text.Spannable, Object, int, int);
    method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
    method public void onSpanRemoved(android.text.Spannable, Object, int, int);
  }

  public abstract class NumberKeyListener extends android.text.method.BaseKeyListener implements android.text.InputFilter {
    ctor public NumberKeyListener();
    method public CharSequence filter(CharSequence, int, int, android.text.Spanned, int, int);
    method protected abstract char[] getAcceptedChars();
    method protected int lookup(android.view.KeyEvent, android.text.Spannable);
    method protected static boolean ok(char[], char);
  }

  public class PasswordTransformationMethod implements android.text.TextWatcher android.text.method.TransformationMethod {
    ctor public PasswordTransformationMethod();
    method public void afterTextChanged(android.text.Editable);
    method public void beforeTextChanged(CharSequence, int, int, int);
    method public static android.text.method.PasswordTransformationMethod getInstance();
    method public CharSequence getTransformation(CharSequence, android.view.View);
    method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
    method public void onTextChanged(CharSequence, int, int, int);
  }

  public class QwertyKeyListener extends android.text.method.BaseKeyListener {
    ctor public QwertyKeyListener(android.text.method.TextKeyListener.Capitalize, boolean);
    method public int getInputType();
    method public static android.text.method.QwertyKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
    method public static void markAsReplaced(android.text.Spannable, int, int, String);
  }

  public abstract class ReplacementTransformationMethod implements android.text.method.TransformationMethod {
    ctor public ReplacementTransformationMethod();
    method protected abstract char[] getOriginal();
    method protected abstract char[] getReplacement();
    method public CharSequence getTransformation(CharSequence, android.view.View);
    method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
  }

  public class ScrollingMovementMethod implements android.text.method.MovementMethod {
    ctor public ScrollingMovementMethod();
    method public boolean canSelectArbitrarily();
    method protected boolean down(android.widget.TextView, android.text.Spannable);
    method public static android.text.method.MovementMethod getInstance();
    method public void initialize(android.widget.TextView, android.text.Spannable);
    method protected boolean left(android.widget.TextView, android.text.Spannable);
    method public boolean onKeyDown(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public boolean onKeyOther(android.widget.TextView, android.text.Spannable, android.view.KeyEvent);
    method public boolean onKeyUp(android.widget.TextView, android.text.Spannable, int, android.view.KeyEvent);
    method public void onTakeFocus(android.widget.TextView, android.text.Spannable, int);
    method public boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
    method public boolean onTrackballEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
    method protected boolean right(android.widget.TextView, android.text.Spannable);
    method protected boolean up(android.widget.TextView, android.text.Spannable);
  }

  public class SingleLineTransformationMethod extends android.text.method.ReplacementTransformationMethod {
    ctor public SingleLineTransformationMethod();
    method public static android.text.method.SingleLineTransformationMethod getInstance();
    method protected char[] getOriginal();
    method protected char[] getReplacement();
  }

  public class TextKeyListener extends android.text.method.BaseKeyListener implements android.text.SpanWatcher {
    ctor public TextKeyListener(android.text.method.TextKeyListener.Capitalize, boolean);
    method public static void clear(android.text.Editable);
    method public int getInputType();
    method public static android.text.method.TextKeyListener getInstance(boolean, android.text.method.TextKeyListener.Capitalize);
    method public static android.text.method.TextKeyListener getInstance();
    method public void onSpanAdded(android.text.Spannable, Object, int, int);
    method public void onSpanChanged(android.text.Spannable, Object, int, int, int, int);
    method public void onSpanRemoved(android.text.Spannable, Object, int, int);
    method public void release();
    method public static boolean shouldCap(android.text.method.TextKeyListener.Capitalize, CharSequence, int);
  }

  public enum TextKeyListener.Capitalize {
    enum_constant public static final android.text.method.TextKeyListener.Capitalize CHARACTERS;
    enum_constant public static final android.text.method.TextKeyListener.Capitalize NONE;
    enum_constant public static final android.text.method.TextKeyListener.Capitalize SENTENCES;
    enum_constant public static final android.text.method.TextKeyListener.Capitalize WORDS;
  }

  public class TimeKeyListener extends android.text.method.NumberKeyListener {
    ctor public TimeKeyListener();
    method protected char[] getAcceptedChars();
    method public int getInputType();
    method public static android.text.method.TimeKeyListener getInstance();
    field public static final char[] CHARACTERS;
  }

  public class Touch {
    method public static int getInitialScrollX(android.widget.TextView, android.text.Spannable);
    method public static int getInitialScrollY(android.widget.TextView, android.text.Spannable);
    method public static boolean onTouchEvent(android.widget.TextView, android.text.Spannable, android.view.MotionEvent);
    method public static void scrollTo(android.widget.TextView, android.text.Layout, int, int);
  }

  public interface TransformationMethod {
    method public CharSequence getTransformation(CharSequence, android.view.View);
    method public void onFocusChanged(android.view.View, CharSequence, boolean, int, android.graphics.Rect);
  }

}

package android.text.style {

  public class AbsoluteSizeSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public AbsoluteSizeSpan(int);
    ctor public AbsoluteSizeSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSize();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public interface AlignmentSpan extends android.text.style.ParagraphStyle {
    method public android.text.Layout.Alignment getAlignment();
  }

  public static class AlignmentSpan.Standard implements android.text.style.AlignmentSpan android.text.ParcelableSpan {
    ctor public AlignmentSpan.Standard(android.text.Layout.Alignment);
    ctor public AlignmentSpan.Standard(android.os.Parcel);
    method public int describeContents();
    method public android.text.Layout.Alignment getAlignment();
    method public int getSpanTypeId();
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class BackgroundColorSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
    ctor public BackgroundColorSpan(int);
    ctor public BackgroundColorSpan(android.os.Parcel);
    method public int describeContents();
    method public int getBackgroundColor();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class BulletSpan implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
    ctor public BulletSpan();
    ctor public BulletSpan(int);
    ctor public BulletSpan(int, int);
    ctor public BulletSpan(android.os.Parcel);
    method public int describeContents();
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getLeadingMargin(boolean);
    method public int getSpanTypeId();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int STANDARD_GAP_WIDTH = 2; // 0x2
  }

  public abstract class CharacterStyle {
    ctor public CharacterStyle();
    method public android.text.style.CharacterStyle getUnderlying();
    method public abstract void updateDrawState(android.text.TextPaint);
    method public static android.text.style.CharacterStyle wrap(android.text.style.CharacterStyle);
  }

  public abstract class ClickableSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateAppearance {
    ctor public ClickableSpan();
    method public abstract void onClick(android.view.View);
    method public void updateDrawState(android.text.TextPaint);
  }

  public class DrawableMarginSpan implements android.text.style.LeadingMarginSpan android.text.style.LineHeightSpan {
    ctor public DrawableMarginSpan(android.graphics.drawable.Drawable);
    ctor public DrawableMarginSpan(android.graphics.drawable.Drawable, int);
    method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getLeadingMargin(boolean);
  }

  public abstract class DynamicDrawableSpan extends android.text.style.ReplacementSpan {
    ctor public DynamicDrawableSpan();
    ctor protected DynamicDrawableSpan(int);
    method public void draw(android.graphics.Canvas, CharSequence, int, int, float, int, int, int, android.graphics.Paint);
    method public abstract android.graphics.drawable.Drawable getDrawable();
    method public int getSize(android.graphics.Paint, CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
    method public int getVerticalAlignment();
    field public static final int ALIGN_BASELINE = 1; // 0x1
    field public static final int ALIGN_BOTTOM = 0; // 0x0
    field protected final int mVerticalAlignment;
  }

  public class ForegroundColorSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
    ctor public ForegroundColorSpan(int);
    ctor public ForegroundColorSpan(android.os.Parcel);
    method public int describeContents();
    method public int getForegroundColor();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class IconMarginSpan implements android.text.style.LeadingMarginSpan android.text.style.LineHeightSpan {
    ctor public IconMarginSpan(android.graphics.Bitmap);
    ctor public IconMarginSpan(android.graphics.Bitmap, int);
    method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getLeadingMargin(boolean);
  }

  public class ImageSpan extends android.text.style.DynamicDrawableSpan {
    ctor public ImageSpan(android.graphics.Bitmap);
    ctor public ImageSpan(android.graphics.Bitmap, int);
    ctor public ImageSpan(android.graphics.drawable.Drawable);
    ctor public ImageSpan(android.graphics.drawable.Drawable, int);
    ctor public ImageSpan(android.graphics.drawable.Drawable, String);
    ctor public ImageSpan(android.graphics.drawable.Drawable, String, int);
    ctor public ImageSpan(android.content.Context, android.net.Uri);
    ctor public ImageSpan(android.content.Context, android.net.Uri, int);
    ctor public ImageSpan(android.content.Context, int);
    ctor public ImageSpan(android.content.Context, int, int);
    method public android.graphics.drawable.Drawable getDrawable();
    method public String getSource();
  }

  public interface LeadingMarginSpan extends android.text.style.ParagraphStyle {
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getLeadingMargin(boolean);
  }

  public static class LeadingMarginSpan.Standard implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
    ctor public LeadingMarginSpan.Standard(int, int);
    ctor public LeadingMarginSpan.Standard(int);
    ctor public LeadingMarginSpan.Standard(android.os.Parcel);
    method public int describeContents();
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getLeadingMargin(boolean);
    method public int getSpanTypeId();
    method public void writeToParcel(android.os.Parcel, int);
  }

  public interface LineBackgroundSpan extends android.text.style.ParagraphStyle {
    method public void drawBackground(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, int);
  }

  public interface LineHeightSpan extends android.text.style.ParagraphStyle android.text.style.WrapTogetherSpan {
    method public void chooseHeight(CharSequence, int, int, int, int, android.graphics.Paint.FontMetricsInt);
  }

  public class MaskFilterSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateAppearance {
    ctor public MaskFilterSpan(android.graphics.MaskFilter);
    method public android.graphics.MaskFilter getMaskFilter();
    method public void updateDrawState(android.text.TextPaint);
  }

  public abstract class MetricAffectingSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateLayout {
    ctor public MetricAffectingSpan();
    method public android.text.style.MetricAffectingSpan getUnderlying();
    method public abstract void updateMeasureState(android.text.TextPaint);
  }

  public interface ParagraphStyle {
  }

  public class QuoteSpan implements android.text.style.LeadingMarginSpan android.text.ParcelableSpan {
    ctor public QuoteSpan();
    ctor public QuoteSpan(int);
    ctor public QuoteSpan(android.os.Parcel);
    method public int describeContents();
    method public void drawLeadingMargin(android.graphics.Canvas, android.graphics.Paint, int, int, int, int, int, CharSequence, int, int, boolean, android.text.Layout);
    method public int getColor();
    method public int getLeadingMargin(boolean);
    method public int getSpanTypeId();
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class RasterizerSpan extends android.text.style.CharacterStyle implements android.text.style.UpdateAppearance {
    ctor public RasterizerSpan(android.graphics.Rasterizer);
    method public android.graphics.Rasterizer getRasterizer();
    method public void updateDrawState(android.text.TextPaint);
  }

  public class RelativeSizeSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public RelativeSizeSpan(float);
    ctor public RelativeSizeSpan(android.os.Parcel);
    method public int describeContents();
    method public float getSizeChange();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public abstract class ReplacementSpan extends android.text.style.MetricAffectingSpan {
    ctor public ReplacementSpan();
    method public abstract void draw(android.graphics.Canvas, CharSequence, int, int, float, int, int, int, android.graphics.Paint);
    method public abstract int getSize(android.graphics.Paint, CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
  }

  public class ScaleXSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public ScaleXSpan(float);
    ctor public ScaleXSpan(android.os.Parcel);
    method public int describeContents();
    method public float getScaleX();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class StrikethroughSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
    ctor public StrikethroughSpan();
    ctor public StrikethroughSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class StyleSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public StyleSpan(int);
    ctor public StyleSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public int getStyle();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class SubscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public SubscriptSpan();
    ctor public SubscriptSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class SuperscriptSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public SuperscriptSpan();
    ctor public SuperscriptSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public interface TabStopSpan extends android.text.style.ParagraphStyle {
    method public int getTabStop();
  }

  public static class TabStopSpan.Standard implements android.text.style.TabStopSpan {
    ctor public TabStopSpan.Standard(int);
    method public int getTabStop();
  }

  public class TextAppearanceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public TextAppearanceSpan(android.content.Context, int);
    ctor public TextAppearanceSpan(android.content.Context, int, int);
    ctor public TextAppearanceSpan(String, int, int, android.content.res.ColorStateList, android.content.res.ColorStateList);
    ctor public TextAppearanceSpan(android.os.Parcel);
    method public int describeContents();
    method public String getFamily();
    method public android.content.res.ColorStateList getLinkTextColor();
    method public int getSpanTypeId();
    method public android.content.res.ColorStateList getTextColor();
    method public int getTextSize();
    method public int getTextStyle();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class TypefaceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
    ctor public TypefaceSpan(String);
    ctor public TypefaceSpan(android.os.Parcel);
    method public int describeContents();
    method public String getFamily();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void updateMeasureState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class URLSpan extends android.text.style.ClickableSpan implements android.text.ParcelableSpan {
    ctor public URLSpan(String);
    ctor public URLSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public String getURL();
    method public void onClick(android.view.View);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public class UnderlineSpan extends android.text.style.CharacterStyle implements android.text.ParcelableSpan android.text.style.UpdateAppearance {
    ctor public UnderlineSpan();
    ctor public UnderlineSpan(android.os.Parcel);
    method public int describeContents();
    method public int getSpanTypeId();
    method public void updateDrawState(android.text.TextPaint);
    method public void writeToParcel(android.os.Parcel, int);
  }

  public interface UpdateAppearance {
  }

  public interface UpdateLayout extends android.text.style.UpdateAppearance {
  }

  public interface WrapTogetherSpan extends android.text.style.ParagraphStyle {
  }

}

package android.text.util {

  public class Linkify {
    ctor public Linkify();
    method public static final boolean addLinks(android.text.Spannable, int);
    method public static final boolean addLinks(android.widget.TextView, int);
    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, String);
    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String);
    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
    field public static final int ALL = 15; // 0xf
    field public static final int EMAIL_ADDRESSES = 2; // 0x2
    field public static final int MAP_ADDRESSES = 8; // 0x8
    field public static final int PHONE_NUMBERS = 4; // 0x4
    field public static final int WEB_URLS = 1; // 0x1
    field public static final android.text.util.Linkify.MatchFilter sPhoneNumberMatchFilter;
    field public static final android.text.util.Linkify.TransformFilter sPhoneNumberTransformFilter;
    field public static final android.text.util.Linkify.MatchFilter sUrlMatchFilter;
  }

  public static interface Linkify.MatchFilter {
    method public boolean acceptMatch(CharSequence, int, int);
  }

  public static interface Linkify.TransformFilter {
    method public String transformUrl(java.util.regex.Matcher, String);
  }

  public class Rfc822Token {
    ctor public Rfc822Token(String, String, String);
    method public String getAddress();
    method public String getComment();
    method public String getName();
    method public static String quoteComment(String);
    method public static String quoteName(String);
    method public static String quoteNameIfNecessary(String);
    method public void setAddress(String);
    method public void setComment(String);
    method public void setName(String);
  }

  public class Rfc822Tokenizer implements android.widget.MultiAutoCompleteTextView.Tokenizer {
    ctor public Rfc822Tokenizer();
    method public int findTokenEnd(CharSequence, int);
    method public int findTokenStart(CharSequence, int);
    method public CharSequence terminateToken(CharSequence);
    method public static android.text.util.Rfc822Token[] tokenize(CharSequence);
  }

}

package android.util {

  public class AndroidException extends java.lang.Exception {
    ctor public AndroidException();
    ctor public AndroidException(String);
    ctor public AndroidException(Exception);
  }

  public class AndroidRuntimeException extends java.lang.RuntimeException {
    ctor public AndroidRuntimeException();
    ctor public AndroidRuntimeException(String);
    ctor public AndroidRuntimeException(Exception);
  }

  public interface AttributeSet {
    method public boolean getAttributeBooleanValue(String, String, boolean);
    method public boolean getAttributeBooleanValue(int, boolean);
    method public int getAttributeCount();
    method public float getAttributeFloatValue(String, String, float);
    method public float getAttributeFloatValue(int, float);
    method public int getAttributeIntValue(String, String, int);
    method public int getAttributeIntValue(int, int);
    method public int getAttributeListValue(String, String, String[], int);
    method public int getAttributeListValue(int, String[], int);
    method public String getAttributeName(int);
    method public int getAttributeNameResource(int);
    method public int getAttributeResourceValue(String, String, int);
    method public int getAttributeResourceValue(int, int);
    method public int getAttributeUnsignedIntValue(String, String, int);
    method public int getAttributeUnsignedIntValue(int, int);
    method public String getAttributeValue(int);
    method public String getAttributeValue(String, String);
    method public String getClassAttribute();
    method public String getIdAttribute();
    method public int getIdAttributeResourceValue(int);
    method public String getPositionDescription();
    method public int getStyleAttribute();
  }

  public final class Config {
    ctor public Config();
    field public static final boolean DEBUG = false;
    field public static final boolean LOGD = true;
    field public static final boolean LOGV = false;
    field public static final boolean PROFILE = false;
    field public static final boolean RELEASE = true;
  }

  public class DebugUtils {
    ctor public DebugUtils();
    method public static boolean isObjectSelected(Object);
  }

  public class DisplayMetrics {
    ctor public DisplayMetrics();
    method public void setTo(android.util.DisplayMetrics);
    method public void setToDefaults();
    field public float density;
    field public int heightPixels;
    field public float scaledDensity;
    field public int widthPixels;
    field public float xdpi;
    field public float ydpi;
  }

  public class EventLogTags {
    ctor public EventLogTags() throws java.io.IOException;
    ctor public EventLogTags(java.io.BufferedReader) throws java.io.IOException;
    method public android.util.EventLogTags.Description get(String);
    method public android.util.EventLogTags.Description get(int);
  }

  public static class EventLogTags.Description {
    field public final String mName;
    field public final int mTag;
  }

  public class FloatMath {
    method public static float ceil(float);
    method public static float cos(float);
    method public static float floor(float);
    method public static float sin(float);
    method public static float sqrt(float);
  }

  public final class Log {
    method public static int d(String, String);
    method public static int d(String, String, Throwable);
    method public static int e(String, String);
    method public static int e(String, String, Throwable);
    method public static String getStackTraceString(Throwable);
    method public static int i(String, String);
    method public static int i(String, String, Throwable);
    method public static boolean isLoggable(String, int);
    method public static int println(int, String, String);
    method public static int v(String, String);
    method public static int v(String, String, Throwable);
    method public static int w(String, String);
    method public static int w(String, String, Throwable);
    method public static int w(String, Throwable);
    field public static final int ASSERT = 7; // 0x7
    field public static final int DEBUG = 3; // 0x3
    field public static final int ERROR = 6; // 0x6
    field public static final int INFO = 4; // 0x4
    field public static final int VERBOSE = 2; // 0x2
    field public static final int WARN = 5; // 0x5
  }

  public class LogPrinter implements android.util.Printer {
    ctor public LogPrinter(int, String);
    method public void println(String);
  }

  public class MonthDisplayHelper {
    ctor public MonthDisplayHelper(int, int, int);
    ctor public MonthDisplayHelper(int, int);
    method public int getColumnOf(int);
    method public int getDayAt(int, int);
    method public int[] getDigitsForRow(int);
    method public int getFirstDayOfMonth();
    method public int getMonth();
    method public int getNumberOfDaysInMonth();
    method public int getOffset();
    method public int getRowOf(int);
    method public int getWeekStartDay();
    method public int getYear();
    method public boolean isWithinCurrentMonth(int, int);
    method public void nextMonth();
    method public void previousMonth();
  }

  public class PrintStreamPrinter implements android.util.Printer {
    ctor public PrintStreamPrinter(java.io.PrintStream);
    method public void println(String);
  }

  public class PrintWriterPrinter implements android.util.Printer {
    ctor public PrintWriterPrinter(java.io.PrintWriter);
    method public void println(String);
  }

  public interface Printer {
    method public void println(String);
  }

  public class SparseArray<E> {
    ctor public SparseArray();
    ctor public SparseArray(int);
    method public void append(int, E);
    method public void clear();
    method public void delete(int);
    method public E get(int);
    method public E get(int, E);
    method public int indexOfKey(int);
    method public int indexOfValue(E);
    method public int keyAt(int);
    method public void put(int, E);
    method public void remove(int);
    method public void setValueAt(int, E);
    method public int size();
    method public E valueAt(int);
  }

  public class SparseBooleanArray {
    ctor public SparseBooleanArray();
    ctor public SparseBooleanArray(int);
    method public void append(int, boolean);
    method public void clear();
    method public void delete(int);
    method public boolean get(int);
    method public boolean get(int, boolean);
    method public int indexOfKey(int);
    method public int indexOfValue(boolean);
    method public int keyAt(int);
    method public void put(int, boolean);
    method public int size();
    method public boolean valueAt(int);
  }

  public class SparseIntArray {
    ctor public SparseIntArray();
    ctor public SparseIntArray(int);
    method public void append(int, int);
    method public void clear();
    method public void delete(int);
    method public int get(int);
    method public int get(int, int);
    method public int indexOfKey(int);
    method public int indexOfValue(int);
    method public int keyAt(int);
    method public void put(int, int);
    method public void removeAt(int);
    method public int size();
    method public int valueAt(int);
  }

  public class StateSet {
    ctor public StateSet();
    method public static String dump(int[]);
    method public static boolean isWildCard(int[]);
    method public static boolean stateSetMatches(int[], int[]);
    method public static boolean stateSetMatches(int[], int);
    method public static int[] trimStateSet(int[], int);
    field public static final int[] WILD_CARD;
  }

  public class StringBuilderPrinter implements android.util.Printer {
    ctor public StringBuilderPrinter(StringBuilder);
    method public void println(String);
  }

  public class TimeFormatException extends java.lang.RuntimeException {
  }

  public class TimeUtils {
    ctor public TimeUtils();
    method public static java.util.TimeZone getTimeZone(int, boolean, long, String);
    method public static String getTimeZoneDatabaseVersion();
  }

  public class TimingLogger {
    ctor public TimingLogger(String, String);
    method public void addSplit(String);
    method public void dumpToLog();
    method public void reset(String, String);
    method public void reset();
  }

  public class TypedValue {
    ctor public TypedValue();
    method public static float applyDimension(int, float, android.util.DisplayMetrics);
    method public final CharSequence coerceToString();
    method public static final String coerceToString(int, int);
    method public static float complexToDimension(int, android.util.DisplayMetrics);
    method public static float complexToDimensionNoisy(int, android.util.DisplayMetrics);
    method public static int complexToDimensionPixelOffset(int, android.util.DisplayMetrics);
    method public static int complexToDimensionPixelSize(int, android.util.DisplayMetrics);
    method public static float complexToFloat(int);
    method public static float complexToFraction(int, float, float);
    method public float getDimension(android.util.DisplayMetrics);
    method public final float getFloat();
    method public float getFraction(float, float);
    method public void setTo(android.util.TypedValue);
    field public static final int COMPLEX_MANTISSA_MASK = 16777215; // 0xffffff
    field public static final int COMPLEX_MANTISSA_SHIFT = 8; // 0x8
    field public static final int COMPLEX_RADIX_0p23 = 3; // 0x3
    field public static final int COMPLEX_RADIX_16p7 = 1; // 0x1
    field public static final int COMPLEX_RADIX_23p0 = 0; // 0x0
    field public static final int COMPLEX_RADIX_8p15 = 2; // 0x2
    field public static final int COMPLEX_RADIX_MASK = 3; // 0x3
    field public static final int COMPLEX_RADIX_SHIFT = 4; // 0x4
    field public static final int COMPLEX_UNIT_DIP = 1; // 0x1
    field public static final int COMPLEX_UNIT_FRACTION = 0; // 0x0
    field public static final int COMPLEX_UNIT_FRACTION_PARENT = 1; // 0x1
    field public static final int COMPLEX_UNIT_IN = 4; // 0x4
    field public static final int COMPLEX_UNIT_MASK = 15; // 0xf
    field public static final int COMPLEX_UNIT_MM = 5; // 0x5
    field public static final int COMPLEX_UNIT_PT = 3; // 0x3
    field public static final int COMPLEX_UNIT_PX = 0; // 0x0
    field public static final int COMPLEX_UNIT_SHIFT = 0; // 0x0
    field public static final int COMPLEX_UNIT_SP = 2; // 0x2
    field public static final int TYPE_ATTRIBUTE = 2; // 0x2
    field public static final int TYPE_DIMENSION = 5; // 0x5
    field public static final int TYPE_FIRST_COLOR_INT = 28; // 0x1c
    field public static final int TYPE_FIRST_INT = 16; // 0x10
    field public static final int TYPE_FLOAT = 4; // 0x4
    field public static final int TYPE_FRACTION = 6; // 0x6
    field public static final int TYPE_INT_BOOLEAN = 18; // 0x12
    field public static final int TYPE_INT_COLOR_ARGB4 = 30; // 0x1e
    field public static final int TYPE_INT_COLOR_ARGB8 = 28; // 0x1c
    field public static final int TYPE_INT_COLOR_RGB4 = 31; // 0x1f
    field public static final int TYPE_INT_COLOR_RGB8 = 29; // 0x1d
    field public static final int TYPE_INT_DEC = 16; // 0x10
    field public static final int TYPE_INT_HEX = 17; // 0x11
    field public static final int TYPE_LAST_COLOR_INT = 31; // 0x1f
    field public static final int TYPE_LAST_INT = 31; // 0x1f
    field public static final int TYPE_NULL = 0; // 0x0
    field public static final int TYPE_REFERENCE = 1; // 0x1
    field public static final int TYPE_STRING = 3; // 0x3
    field public int assetCookie;
    field public int changingConfigurations;
    field public int data;
    field public int resourceId;
    field public CharSequence string;
    field public int type;
  }

  public class Xml {
    ctor public Xml();
    method public static android.util.AttributeSet asAttributeSet(org.xmlpull.v1.XmlPullParser);
    method public static android.util.Xml.Encoding findEncodingByName(String) throws java.io.UnsupportedEncodingException;
    method public static org.xmlpull.v1.XmlPullParser newPullParser();
    method public static org.xmlpull.v1.XmlSerializer newSerializer();
    method public static void parse(String, org.xml.sax.ContentHandler) throws org.xml.sax.SAXException;
    method public static void parse(java.io.Reader, org.xml.sax.ContentHandler) throws java.io.IOException, org.xml.sax.SAXException;
    method public static void parse(java.io.InputStream, android.util.Xml.Encoding, org.xml.sax.ContentHandler) throws java.io.IOException, org.xml.sax.SAXException;
    field public static String FEATURE_RELAXED;
  }

  public enum Xml.Encoding {
    enum_constant public static final android.util.Xml.Encoding ISO_8859_1;
    enum_constant public static final android.util.Xml.Encoding US_ASCII;
    enum_constant public static final android.util.Xml.Encoding UTF_16;
    enum_constant public static final android.util.Xml.Encoding UTF_8;
  }

}

package android.view {

  public abstract class AbsSavedState implements android.os.Parcelable {
    ctor protected AbsSavedState(android.os.Parcelable);
    ctor protected AbsSavedState(android.os.Parcel);
    method public int describeContents();
    method public final android.os.Parcelable getSuperState();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.AbsSavedState> CREATOR;
    field public static final android.view.AbsSavedState EMPTY_STATE;
  }

  public interface ContextMenu extends android.view.Menu {
    method public void clearHeader();
    method public android.view.ContextMenu setHeaderIcon(int);
    method public android.view.ContextMenu setHeaderIcon(android.graphics.drawable.Drawable);
    method public android.view.ContextMenu setHeaderTitle(int);
    method public android.view.ContextMenu setHeaderTitle(CharSequence);
    method public android.view.ContextMenu setHeaderView(android.view.View);
  }

  public static interface ContextMenu.ContextMenuInfo {
  }

  public class ContextThemeWrapper extends android.content.ContextWrapper {
    ctor public ContextThemeWrapper();
    ctor public ContextThemeWrapper(android.content.Context, int);
    method protected void onApplyThemeResource(android.content.res.Resources.Theme, int, boolean);
  }

  public class Display {
    method public int getDisplayId();
    method public int getHeight();
    method public void getMetrics(android.util.DisplayMetrics);
    method public int getOrientation();
    method public int getPixelFormat();
    method public float getRefreshRate();
    method public int getWidth();
    field public static final int DEFAULT_DISPLAY = 0; // 0x0
  }

  public class FocusFinder {
    method public android.view.View findNearestTouchable(android.view.ViewGroup, int, int, int, int[]);
    method public final android.view.View findNextFocus(android.view.ViewGroup, android.view.View, int);
    method public android.view.View findNextFocusFromRect(android.view.ViewGroup, android.graphics.Rect, int);
    method public static android.view.FocusFinder getInstance();
  }

  public class GestureDetector {
    ctor public GestureDetector(android.view.GestureDetector.OnGestureListener, android.os.Handler);
    ctor public GestureDetector(android.view.GestureDetector.OnGestureListener);
    ctor public GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener);
    ctor public GestureDetector(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
    method public boolean isLongpressEnabled();
    method public boolean onTouchEvent(android.view.MotionEvent);
    method public void setIsLongpressEnabled(boolean);
    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
  }

  public static interface GestureDetector.OnDoubleTapListener {
    method public boolean onDoubleTap(android.view.MotionEvent);
    method public boolean onDoubleTapEvent(android.view.MotionEvent);
    method public boolean onSingleTapConfirmed(android.view.MotionEvent);
  }

  public static interface GestureDetector.OnGestureListener {
    method public boolean onDown(android.view.MotionEvent);
    method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onLongPress(android.view.MotionEvent);
    method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onShowPress(android.view.MotionEvent);
    method public boolean onSingleTapUp(android.view.MotionEvent);
  }

  public static class GestureDetector.SimpleOnGestureListener implements android.view.GestureDetector.OnDoubleTapListener android.view.GestureDetector.OnGestureListener {
    ctor public GestureDetector.SimpleOnGestureListener();
    method public boolean onDoubleTap(android.view.MotionEvent);
    method public boolean onDoubleTapEvent(android.view.MotionEvent);
    method public boolean onDown(android.view.MotionEvent);
    method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onLongPress(android.view.MotionEvent);
    method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onShowPress(android.view.MotionEvent);
    method public boolean onSingleTapConfirmed(android.view.MotionEvent);
    method public boolean onSingleTapUp(android.view.MotionEvent);
  }

  public class Gravity {
    ctor public Gravity();
    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect);
    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect);
    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect);
    method public static boolean isHorizontal(int);
    method public static boolean isVertical(int);
    field public static final int AXIS_CLIP = 8; // 0x8
    field public static final int AXIS_PULL_AFTER = 4; // 0x4
    field public static final int AXIS_PULL_BEFORE = 2; // 0x2
    field public static final int AXIS_SPECIFIED = 1; // 0x1
    field public static final int AXIS_X_SHIFT = 0; // 0x0
    field public static final int AXIS_Y_SHIFT = 4; // 0x4
    field public static final int BOTTOM = 80; // 0x50
    field public static final int CENTER = 17; // 0x11
    field public static final int CENTER_HORIZONTAL = 1; // 0x1
    field public static final int CENTER_VERTICAL = 16; // 0x10
    field public static final int CLIP_HORIZONTAL = 8; // 0x8
    field public static final int CLIP_VERTICAL = 128; // 0x80
    field public static final int DISPLAY_CLIP_HORIZONTAL = 16777216; // 0x1000000
    field public static final int DISPLAY_CLIP_VERTICAL = 268435456; // 0x10000000
    field public static final int FILL = 119; // 0x77
    field public static final int FILL_HORIZONTAL = 7; // 0x7
    field public static final int FILL_VERTICAL = 112; // 0x70
    field public static final int HORIZONTAL_GRAVITY_MASK = 7; // 0x7
    field public static final int LEFT = 3; // 0x3
    field public static final int NO_GRAVITY = 0; // 0x0
    field public static final int RIGHT = 5; // 0x5
    field public static final int TOP = 48; // 0x30
    field public static final int VERTICAL_GRAVITY_MASK = 112; // 0x70
  }

  public class HapticFeedbackConstants {
    field public static final int FLAG_IGNORE_GLOBAL_SETTING = 2; // 0x2
    field public static final int FLAG_IGNORE_VIEW_SETTING = 1; // 0x1
    field public static final int LONG_PRESS = 0; // 0x0
  }

  public class InflateException extends java.lang.RuntimeException {
    ctor public InflateException();
    ctor public InflateException(String, Throwable);
    ctor public InflateException(String);
    ctor public InflateException(Throwable);
  }

  public class KeyCharacterMap {
    method public static boolean deviceHasKey(int);
    method public static boolean[] deviceHasKeys(int[]);
    method public int get(int, int);
    method public static int getDeadChar(int, int);
    method public char getDisplayLabel(int);
    method public android.view.KeyEvent[] getEvents(char[]);
    method public boolean getKeyData(int, android.view.KeyCharacterMap.KeyData);
    method public int getKeyboardType();
    method public char getMatch(int, char[]);
    method public char getMatch(int, char[], int);
    method public char getNumber(int);
    method public boolean isPrintingKey(int);
    method public static android.view.KeyCharacterMap load(int);
    field public static final int ALPHA = 3; // 0x3
    field public static final int BUILT_IN_KEYBOARD = 0; // 0x0
    field public static final int COMBINING_ACCENT = -2147483648; // 0x80000000
    field public static final int COMBINING_ACCENT_MASK = 2147483647; // 0x7fffffff
    field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
    field public static final int NUMERIC = 1; // 0x1
    field public static final char PICKER_DIALOG_INPUT = 61185; // 0xef01 '\uef01'
    field public static final int PREDICTIVE = 2; // 0x2
  }

  public static class KeyCharacterMap.KeyData {
    ctor public KeyCharacterMap.KeyData();
    field public static final int META_LENGTH = 4; // 0x4
    field public char displayLabel;
    field public char[] meta;
    field public char number;
  }

  public class KeyEvent implements android.os.Parcelable {
    ctor public KeyEvent(int, int);
    ctor public KeyEvent(long, long, int, int, int);
    ctor public KeyEvent(long, long, int, int, int, int);
    ctor public KeyEvent(long, long, int, int, int, int, int, int);
    ctor public KeyEvent(long, long, int, int, int, int, int, int, int);
    ctor public KeyEvent(long, String, int, int);
    ctor public KeyEvent(android.view.KeyEvent);
    ctor public KeyEvent(android.view.KeyEvent, long, int);
    method public static android.view.KeyEvent changeAction(android.view.KeyEvent, int);
    method public static android.view.KeyEvent changeFlags(android.view.KeyEvent, int);
    method public static android.view.KeyEvent changeTimeRepeat(android.view.KeyEvent, long, int);
    method public int describeContents();
    method public final boolean dispatch(android.view.KeyEvent.Callback);
    method public final int getAction();
    method public final String getCharacters();
    method public static int getDeadChar(int, int);
    method public final int getDeviceId();
    method public char getDisplayLabel();
    method public final long getDownTime();
    method public final long getEventTime();
    method public final int getFlags();
    method public final int getKeyCode();
    method public boolean getKeyData(android.view.KeyCharacterMap.KeyData);
    method public char getMatch(char[]);
    method public char getMatch(char[], int);
    method public static int getMaxKeyCode();
    method public final int getMetaState();
    method public char getNumber();
    method public final int getRepeatCount();
    method public final int getScanCode();
    method public int getUnicodeChar();
    method public int getUnicodeChar(int);
    method public final boolean isAltPressed();
    method public static boolean isModifierKey(int);
    method public boolean isPrintingKey();
    method public final boolean isShiftPressed();
    method public final boolean isSymPressed();
    method public final boolean isSystem();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int ACTION_DOWN = 0; // 0x0
    field public static final int ACTION_MULTIPLE = 2; // 0x2
    field public static final int ACTION_UP = 1; // 0x1
    field public static final android.os.Parcelable.Creator<android.view.KeyEvent> CREATOR;
    field public static final int FLAG_EDITOR_ACTION = 16; // 0x10
    field public static final int FLAG_FROM_SYSTEM = 8; // 0x8
    field public static final int FLAG_KEEP_TOUCH_MODE = 4; // 0x4
    field public static final int FLAG_SOFT_KEYBOARD = 2; // 0x2
    field public static final int FLAG_WOKE_HERE = 1; // 0x1
    field public static final int KEYCODE_0 = 7; // 0x7
    field public static final int KEYCODE_1 = 8; // 0x8
    field public static final int KEYCODE_2 = 9; // 0x9
    field public static final int KEYCODE_3 = 10; // 0xa
    field public static final int KEYCODE_4 = 11; // 0xb
    field public static final int KEYCODE_5 = 12; // 0xc
    field public static final int KEYCODE_6 = 13; // 0xd
    field public static final int KEYCODE_7 = 14; // 0xe
    field public static final int KEYCODE_8 = 15; // 0xf
    field public static final int KEYCODE_9 = 16; // 0x10
    field public static final int KEYCODE_A = 29; // 0x1d
    field public static final int KEYCODE_ALT_LEFT = 57; // 0x39
    field public static final int KEYCODE_ALT_RIGHT = 58; // 0x3a
    field public static final int KEYCODE_APOSTROPHE = 75; // 0x4b
    field public static final int KEYCODE_AT = 77; // 0x4d
    field public static final int KEYCODE_B = 30; // 0x1e
    field public static final int KEYCODE_BACK = 4; // 0x4
    field public static final int KEYCODE_BACKSLASH = 73; // 0x49
    field public static final int KEYCODE_C = 31; // 0x1f
    field public static final int KEYCODE_CALL = 5; // 0x5
    field public static final int KEYCODE_CAMERA = 27; // 0x1b
    field public static final int KEYCODE_CLEAR = 28; // 0x1c
    field public static final int KEYCODE_COMMA = 55; // 0x37
    field public static final int KEYCODE_D = 32; // 0x20
    field public static final int KEYCODE_DEL = 67; // 0x43
    field public static final int KEYCODE_DPAD_CENTER = 23; // 0x17
    field public static final int KEYCODE_DPAD_DOWN = 20; // 0x14
    field public static final int KEYCODE_DPAD_LEFT = 21; // 0x15
    field public static final int KEYCODE_DPAD_RIGHT = 22; // 0x16
    field public static final int KEYCODE_DPAD_UP = 19; // 0x13
    field public static final int KEYCODE_E = 33; // 0x21
    field public static final int KEYCODE_ENDCALL = 6; // 0x6
    field public static final int KEYCODE_ENTER = 66; // 0x42
    field public static final int KEYCODE_ENVELOPE = 65; // 0x41
    field public static final int KEYCODE_EQUALS = 70; // 0x46
    field public static final int KEYCODE_EXPLORER = 64; // 0x40
    field public static final int KEYCODE_F = 34; // 0x22
    field public static final int KEYCODE_FOCUS = 80; // 0x50
    field public static final int KEYCODE_G = 35; // 0x23
    field public static final int KEYCODE_GRAVE = 68; // 0x44
    field public static final int KEYCODE_H = 36; // 0x24
    field public static final int KEYCODE_HEADSETHOOK = 79; // 0x4f
    field public static final int KEYCODE_HOME = 3; // 0x3
    field public static final int KEYCODE_I = 37; // 0x25
    field public static final int KEYCODE_J = 38; // 0x26
    field public static final int KEYCODE_K = 39; // 0x27
    field public static final int KEYCODE_L = 40; // 0x28
    field public static final int KEYCODE_LEFT_BRACKET = 71; // 0x47
    field public static final int KEYCODE_M = 41; // 0x29
    field public static final int KEYCODE_MEDIA_FAST_FORWARD = 90; // 0x5a
    field public static final int KEYCODE_MEDIA_NEXT = 87; // 0x57
    field public static final int KEYCODE_MEDIA_PLAY_PAUSE = 85; // 0x55
    field public static final int KEYCODE_MEDIA_PREVIOUS = 88; // 0x58
    field public static final int KEYCODE_MEDIA_REWIND = 89; // 0x59
    field public static final int KEYCODE_MEDIA_STOP = 86; // 0x56
    field public static final int KEYCODE_MENU = 82; // 0x52
    field public static final int KEYCODE_MINUS = 69; // 0x45
    field public static final int KEYCODE_MUTE = 91; // 0x5b
    field public static final int KEYCODE_N = 42; // 0x2a
    field public static final int KEYCODE_NOTIFICATION = 83; // 0x53
    field public static final int KEYCODE_NUM = 78; // 0x4e
    field public static final int KEYCODE_O = 43; // 0x2b
    field public static final int KEYCODE_P = 44; // 0x2c
    field public static final int KEYCODE_PERIOD = 56; // 0x38
    field public static final int KEYCODE_PLUS = 81; // 0x51
    field public static final int KEYCODE_POUND = 18; // 0x12
    field public static final int KEYCODE_POWER = 26; // 0x1a
    field public static final int KEYCODE_Q = 45; // 0x2d
    field public static final int KEYCODE_R = 46; // 0x2e
    field public static final int KEYCODE_RIGHT_BRACKET = 72; // 0x48
    field public static final int KEYCODE_S = 47; // 0x2f
    field public static final int KEYCODE_SEARCH = 84; // 0x54
    field public static final int KEYCODE_SEMICOLON = 74; // 0x4a
    field public static final int KEYCODE_SHIFT_LEFT = 59; // 0x3b
    field public static final int KEYCODE_SHIFT_RIGHT = 60; // 0x3c
    field public static final int KEYCODE_SLASH = 76; // 0x4c
    field public static final int KEYCODE_SOFT_LEFT = 1; // 0x1
    field public static final int KEYCODE_SOFT_RIGHT = 2; // 0x2
    field public static final int KEYCODE_SPACE = 62; // 0x3e
    field public static final int KEYCODE_STAR = 17; // 0x11
    field public static final int KEYCODE_SYM = 63; // 0x3f
    field public static final int KEYCODE_T = 48; // 0x30
    field public static final int KEYCODE_TAB = 61; // 0x3d
    field public static final int KEYCODE_U = 49; // 0x31
    field public static final int KEYCODE_UNKNOWN = 0; // 0x0
    field public static final int KEYCODE_V = 50; // 0x32
    field public static final int KEYCODE_VOLUME_DOWN = 25; // 0x19
    field public static final int KEYCODE_VOLUME_UP = 24; // 0x18
    field public static final int KEYCODE_W = 51; // 0x33
    field public static final int KEYCODE_X = 52; // 0x34
    field public static final int KEYCODE_Y = 53; // 0x35
    field public static final int KEYCODE_Z = 54; // 0x36
    field public static final int MAX_KEYCODE = 84; // 0x54
    field public static final int META_ALT_LEFT_ON = 16; // 0x10
    field public static final int META_ALT_ON = 2; // 0x2
    field public static final int META_ALT_RIGHT_ON = 32; // 0x20
    field public static final int META_SHIFT_LEFT_ON = 64; // 0x40
    field public static final int META_SHIFT_ON = 1; // 0x1
    field public static final int META_SHIFT_RIGHT_ON = 128; // 0x80
    field public static final int META_SYM_ON = 4; // 0x4
  }

  public static interface KeyEvent.Callback {
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
  }

  public abstract class LayoutInflater {
    ctor protected LayoutInflater(android.content.Context);
    ctor protected LayoutInflater(android.view.LayoutInflater, android.content.Context);
    method public abstract android.view.LayoutInflater cloneInContext(android.content.Context);
    method public final android.view.View createView(String, String, android.util.AttributeSet) throws java.lang.ClassNotFoundException, android.view.InflateException;
    method public static android.view.LayoutInflater from(android.content.Context);
    method public android.content.Context getContext();
    method public final android.view.LayoutInflater.Factory getFactory();
    method public android.view.LayoutInflater.Filter getFilter();
    method public android.view.View inflate(int, android.view.ViewGroup);
    method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup);
    method public android.view.View inflate(int, android.view.ViewGroup, boolean);
    method public android.view.View inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean);
    method protected android.view.View onCreateView(String, android.util.AttributeSet) throws java.lang.ClassNotFoundException;
    method public void setFactory(android.view.LayoutInflater.Factory);
    method public void setFilter(android.view.LayoutInflater.Filter);
  }

  public static interface LayoutInflater.Factory {
    method public android.view.View onCreateView(String, android.content.Context, android.util.AttributeSet);
  }

  public static interface LayoutInflater.Filter {
    method public boolean onLoadClass(Class);
  }

  public interface Menu {
    method public android.view.MenuItem add(CharSequence);
    method public android.view.MenuItem add(int);
    method public android.view.MenuItem add(int, int, int, CharSequence);
    method public android.view.MenuItem add(int, int, int, int);
    method public int addIntentOptions(int, int, int, android.content.ComponentName, android.content.Intent[], android.content.Intent, int, android.view.MenuItem[]);
    method public android.view.SubMenu addSubMenu(CharSequence);
    method public android.view.SubMenu addSubMenu(int);
    method public android.view.SubMenu addSubMenu(int, int, int, CharSequence);
    method public android.view.SubMenu addSubMenu(int, int, int, int);
    method public void clear();
    method public void close();
    method public android.view.MenuItem findItem(int);
    method public android.view.MenuItem getItem(int);
    method public boolean hasVisibleItems();
    method public boolean isShortcutKey(int, android.view.KeyEvent);
    method public boolean performIdentifierAction(int, int);
    method public boolean performShortcut(int, android.view.KeyEvent, int);
    method public void removeGroup(int);
    method public void removeItem(int);
    method public void setGroupCheckable(int, boolean, boolean);
    method public void setGroupEnabled(int, boolean);
    method public void setGroupVisible(int, boolean);
    method public void setQwertyMode(boolean);
    method public int size();
    field public static final int CATEGORY_ALTERNATIVE = 262144; // 0x40000
    field public static final int CATEGORY_CONTAINER = 65536; // 0x10000
    field public static final int CATEGORY_SECONDARY = 196608; // 0x30000
    field public static final int CATEGORY_SYSTEM = 131072; // 0x20000
    field public static final int FIRST = 1; // 0x1
    field public static final int FLAG_ALWAYS_PERFORM_CLOSE = 2; // 0x2
    field public static final int FLAG_APPEND_TO_GROUP = 1; // 0x1
    field public static final int FLAG_PERFORM_NO_CLOSE = 1; // 0x1
    field public static final int NONE = 0; // 0x0
  }

  public class MenuInflater {
    ctor public MenuInflater(android.content.Context);
    method public void inflate(int, android.view.Menu);
  }

  public interface MenuItem {
    method public char getAlphabeticShortcut();
    method public int getGroupId();
    method public android.graphics.drawable.Drawable getIcon();
    method public android.content.Intent getIntent();
    method public int getItemId();
    method public android.view.ContextMenu.ContextMenuInfo getMenuInfo();
    method public char getNumericShortcut();
    method public int getOrder();
    method public android.view.SubMenu getSubMenu();
    method public CharSequence getTitle();
    method public CharSequence getTitleCondensed();
    method public boolean hasSubMenu();
    method public boolean isCheckable();
    method public boolean isChecked();
    method public boolean isEnabled();
    method public boolean isVisible();
    method public android.view.MenuItem setAlphabeticShortcut(char);
    method public android.view.MenuItem setCheckable(boolean);
    method public android.view.MenuItem setChecked(boolean);
    method public android.view.MenuItem setEnabled(boolean);
    method public android.view.MenuItem setIcon(android.graphics.drawable.Drawable);
    method public android.view.MenuItem setIcon(int);
    method public android.view.MenuItem setIntent(android.content.Intent);
    method public android.view.MenuItem setNumericShortcut(char);
    method public android.view.MenuItem setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener);
    method public android.view.MenuItem setShortcut(char, char);
    method public android.view.MenuItem setTitle(CharSequence);
    method public android.view.MenuItem setTitle(int);
    method public android.view.MenuItem setTitleCondensed(CharSequence);
    method public android.view.MenuItem setVisible(boolean);
  }

  public static interface MenuItem.OnMenuItemClickListener {
    method public boolean onMenuItemClick(android.view.MenuItem);
  }

  public final class MotionEvent implements android.os.Parcelable {
    method public void addBatch(long, float, float, float, float, int);
    method public int describeContents();
    method public int getAction();
    method public int getDeviceId();
    method public long getDownTime();
    method public int getEdgeFlags();
    method public long getEventTime();
    method public long getHistoricalEventTime(int);
    method public float getHistoricalPressure(int);
    method public float getHistoricalSize(int);
    method public float getHistoricalX(int);
    method public float getHistoricalY(int);
    method public int getHistorySize();
    method public int getMetaState();
    method public float getPressure();
    method public float getRawX();
    method public float getRawY();
    method public float getSize();
    method public float getX();
    method public float getXPrecision();
    method public float getY();
    method public float getYPrecision();
    method public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
    method public static android.view.MotionEvent obtain(long, long, int, float, float, int);
    method public static android.view.MotionEvent obtain(android.view.MotionEvent);
    method public void offsetLocation(float, float);
    method public void recycle();
    method public void setAction(int);
    method public void setEdgeFlags(int);
    method public void setLocation(float, float);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int ACTION_CANCEL = 3; // 0x3
    field public static final int ACTION_DOWN = 0; // 0x0
    field public static final int ACTION_MOVE = 2; // 0x2
    field public static final int ACTION_OUTSIDE = 4; // 0x4
    field public static final int ACTION_UP = 1; // 0x1
    field public static final android.os.Parcelable.Creator<android.view.MotionEvent> CREATOR;
    field public static final int EDGE_BOTTOM = 2; // 0x2
    field public static final int EDGE_LEFT = 4; // 0x4
    field public static final int EDGE_RIGHT = 8; // 0x8
    field public static final int EDGE_TOP = 1; // 0x1
  }

  public abstract class OrientationEventListener {
    ctor public OrientationEventListener(android.content.Context);
    ctor public OrientationEventListener(android.content.Context, int);
    method public boolean canDetectOrientation();
    method public void disable();
    method public void enable();
    method public abstract void onOrientationChanged(int);
    field public static final int ORIENTATION_UNKNOWN = -1; // 0xffffffff
  }

  @Deprecated public abstract class OrientationListener implements android.hardware.SensorListener {
    ctor public OrientationListener(android.content.Context);
    ctor public OrientationListener(android.content.Context, int);
    method public void disable();
    method public void enable();
    method public void onAccuracyChanged(int, int);
    method public abstract void onOrientationChanged(int);
    method public void onSensorChanged(int, float[]);
    field public static final int ORIENTATION_UNKNOWN = -1; // 0xffffffff
  }

  public class SoundEffectConstants {
    method public static int getContantForFocusDirection(int);
    field public static final int CLICK = 0; // 0x0
    field public static final int NAVIGATION_DOWN = 4; // 0x4
    field public static final int NAVIGATION_LEFT = 1; // 0x1
    field public static final int NAVIGATION_RIGHT = 3; // 0x3
    field public static final int NAVIGATION_UP = 2; // 0x2
  }

  public interface SubMenu extends android.view.Menu {
    method public void clearHeader();
    method public android.view.MenuItem getItem();
    method public android.view.SubMenu setHeaderIcon(int);
    method public android.view.SubMenu setHeaderIcon(android.graphics.drawable.Drawable);
    method public android.view.SubMenu setHeaderTitle(int);
    method public android.view.SubMenu setHeaderTitle(CharSequence);
    method public android.view.SubMenu setHeaderView(android.view.View);
    method public android.view.SubMenu setIcon(int);
    method public android.view.SubMenu setIcon(android.graphics.drawable.Drawable);
  }

  public class Surface implements android.os.Parcelable {
    method public int describeContents();
    method public void freeze();
    method public void hide();
    method public boolean isValid();
    method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws android.view.Surface.OutOfResourcesException;
    method public void readFromParcel(android.os.Parcel);
    method public void setAlpha(float);
    method public void setFlags(int, int);
    method public void setFreezeTint(int);
    method public void setLayer(int);
    method public void setMatrix(float, float, float, float);
    method public static void setOrientation(int, int);
    method public void setPosition(int, int);
    method public void setSize(int, int);
    method public void setTransparentRegionHint(android.graphics.Region);
    method public void show();
    method public void unfreeze();
    method public void unlockCanvas(android.graphics.Canvas);
    method public void unlockCanvasAndPost(android.graphics.Canvas);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.Surface> CREATOR;
    field public static final int FX_SURFACE_BLUR = 65536; // 0x10000
    field public static final int FX_SURFACE_DIM = 131072; // 0x20000
    field public static final int FX_SURFACE_MASK = 983040; // 0xf0000
    field public static final int FX_SURFACE_NORMAL = 0; // 0x0
    field public static final int GPU = 40; // 0x28
    field public static final int HARDWARE = 16; // 0x10
    field public static final int HIDDEN = 4; // 0x4
    field public static final int NON_PREMULTIPLIED = 256; // 0x100
    field public static final int PUSH_BUFFERS = 512; // 0x200
    field public static final int ROTATION_0 = 0; // 0x0
    field public static final int ROTATION_180 = 2; // 0x2
    field public static final int ROTATION_270 = 3; // 0x3
    field public static final int ROTATION_90 = 1; // 0x1
    field public static final int SECURE = 128; // 0x80
    field public static final int SURACE_FROZEN = 2; // 0x2
    field public static final int SURFACE_BLUR_FREEZE = 16; // 0x10
    field public static final int SURFACE_DITHER = 4; // 0x4
    field public static final int SURFACE_HIDDEN = 1; // 0x1
  }

  public static class Surface.OutOfResourcesException extends java.lang.Exception {
    ctor public Surface.OutOfResourcesException();
    ctor public Surface.OutOfResourcesException(String);
  }

  public interface SurfaceHolder {
    method public void addCallback(android.view.SurfaceHolder.Callback);
    method public android.view.Surface getSurface();
    method public android.graphics.Rect getSurfaceFrame();
    method public boolean isCreating();
    method public android.graphics.Canvas lockCanvas();
    method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
    method public void removeCallback(android.view.SurfaceHolder.Callback);
    method public void setFixedSize(int, int);
    method public void setFormat(int);
    method public void setKeepScreenOn(boolean);
    method public void setSizeFromLayout();
    method public void setType(int);
    method public void unlockCanvasAndPost(android.graphics.Canvas);
    field public static final int SURFACE_TYPE_GPU = 2; // 0x2
    field public static final int SURFACE_TYPE_HARDWARE = 1; // 0x1
    field public static final int SURFACE_TYPE_NORMAL = 0; // 0x0
    field public static final int SURFACE_TYPE_PUSH_BUFFERS = 3; // 0x3
  }

  public static class SurfaceHolder.BadSurfaceTypeException extends java.lang.RuntimeException {
    ctor public SurfaceHolder.BadSurfaceTypeException();
    ctor public SurfaceHolder.BadSurfaceTypeException(String);
  }

  public static interface SurfaceHolder.Callback {
    method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
    method public void surfaceCreated(android.view.SurfaceHolder);
    method public void surfaceDestroyed(android.view.SurfaceHolder);
  }

  public class SurfaceView extends android.view.View {
    ctor public SurfaceView(android.content.Context);
    ctor public SurfaceView(android.content.Context, android.util.AttributeSet);
    ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int);
    method public boolean gatherTransparentRegion(android.graphics.Region);
    method public android.view.SurfaceHolder getHolder();
  }

  public class TouchDelegate {
    ctor public TouchDelegate(android.graphics.Rect, android.view.View);
    method public boolean onTouchEvent(android.view.MotionEvent);
    field public static final int ABOVE = 1; // 0x1
    field public static final int BELOW = 2; // 0x2
    field public static final int TO_LEFT = 4; // 0x4
    field public static final int TO_RIGHT = 8; // 0x8
  }

  public final class VelocityTracker {
    method public void addMovement(android.view.MotionEvent);
    method public void clear();
    method public void computeCurrentVelocity(int);
    method public float getXVelocity();
    method public float getYVelocity();
    method public static android.view.VelocityTracker obtain();
    method public void recycle();
  }

  public class View implements android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback {
    ctor public View(android.content.Context);
    ctor public View(android.content.Context, android.util.AttributeSet);
    ctor public View(android.content.Context, android.util.AttributeSet, int);
    method public void addFocusables(java.util.ArrayList<android.view.View>, int);
    method public void addTouchables(java.util.ArrayList<android.view.View>);
    method public void bringToFront();
    method public void buildDrawingCache();
    method public void cancelLongPress();
    method public boolean checkInputConnectionProxy(android.view.View);
    method public void clearAnimation();
    method public void clearFocus();
    method protected int computeHorizontalScrollExtent();
    method protected int computeHorizontalScrollOffset();
    method protected int computeHorizontalScrollRange();
    method public void computeScroll();
    method protected int computeVerticalScrollExtent();
    method protected int computeVerticalScrollOffset();
    method protected int computeVerticalScrollRange();
    method public void createContextMenu(android.view.ContextMenu);
    method public void destroyDrawingCache();
    method protected void dispatchDraw(android.graphics.Canvas);
    method public boolean dispatchKeyEvent(android.view.KeyEvent);
    method public boolean dispatchKeyEventPreIme(android.view.KeyEvent);
    method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
    method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>);
    method protected void dispatchSetPressed(boolean);
    method protected void dispatchSetSelected(boolean);
    method public boolean dispatchTouchEvent(android.view.MotionEvent);
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public boolean dispatchUnhandledMove(android.view.View, int);
    method public void dispatchWindowFocusChanged(boolean);
    method public void dispatchWindowVisibilityChanged(int);
    method public void draw(android.graphics.Canvas);
    method protected void drawableStateChanged();
    method public android.view.View findFocus();
    method public final android.view.View findViewById(int);
    method public final android.view.View findViewWithTag(Object);
    method protected boolean fitSystemWindows(android.graphics.Rect);
    method public android.view.View focusSearch(int);
    method public void forceLayout();
    method public android.view.animation.Animation getAnimation();
    method public android.os.IBinder getApplicationWindowToken();
    method public android.graphics.drawable.Drawable getBackground();
    method public int getBaseline();
    method public final int getBottom();
    method protected float getBottomFadingEdgeStrength();
    method protected int getBottomPaddingOffset();
    method public final android.content.Context getContext();
    method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo();
    method public static int getDefaultSize(int, int);
    method public final int[] getDrawableState();
    method public android.graphics.Bitmap getDrawingCache();
    method public int getDrawingCacheBackgroundColor();
    method public int getDrawingCacheQuality();
    method public void getDrawingRect(android.graphics.Rect);
    method public long getDrawingTime();
    method public java.util.ArrayList<android.view.View> getFocusables(int);
    method public void getFocusedRect(android.graphics.Rect);
    method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
    method public final boolean getGlobalVisibleRect(android.graphics.Rect);
    method public android.os.Handler getHandler();
    method public final int getHeight();
    method public void getHitRect(android.graphics.Rect);
    method public int getHorizontalFadingEdgeLength();
    method protected int getHorizontalScrollbarHeight();
    method public int getId();
    method public boolean getKeepScreenOn();
    method public android.view.ViewGroup.LayoutParams getLayoutParams();
    method public final int getLeft();
    method protected float getLeftFadingEdgeStrength();
    method protected int getLeftPaddingOffset();
    method public final boolean getLocalVisibleRect(android.graphics.Rect);
    method public void getLocationInWindow(int[]);
    method public void getLocationOnScreen(int[]);
    method public final int getMeasuredHeight();
    method public final int getMeasuredWidth();
    method public int getNextFocusDownId();
    method public int getNextFocusLeftId();
    method public int getNextFocusRightId();
    method public int getNextFocusUpId();
    method public android.view.View.OnFocusChangeListener getOnFocusChangeListener();
    method public int getPaddingBottom();
    method public int getPaddingLeft();
    method public int getPaddingRight();
    method public int getPaddingTop();
    method public final android.view.ViewParent getParent();
    method public android.content.res.Resources getResources();
    method public final int getRight();
    method protected float getRightFadingEdgeStrength();
    method protected int getRightPaddingOffset();
    method public android.view.View getRootView();
    method public int getScrollBarStyle();
    method public final int getScrollX();
    method public final int getScrollY();
    method public int getSolidColor();
    method protected int getSuggestedMinimumHeight();
    method protected int getSuggestedMinimumWidth();
    method public Object getTag();
    method public final int getTop();
    method protected float getTopFadingEdgeStrength();
    method protected int getTopPaddingOffset();
    method public android.view.TouchDelegate getTouchDelegate();
    method public java.util.ArrayList<android.view.View> getTouchables();
    method public int getVerticalFadingEdgeLength();
    method public int getVerticalScrollbarWidth();
    method public android.view.ViewTreeObserver getViewTreeObserver();
    method public int getVisibility();
    method public final int getWidth();
    method protected int getWindowAttachCount();
    method public android.os.IBinder getWindowToken();
    method public int getWindowVisibility();
    method public void getWindowVisibleDisplayFrame(android.graphics.Rect);
    method public boolean hasFocus();
    method public boolean hasFocusable();
    method public boolean hasWindowFocus();
    method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
    method protected void initializeFadingEdge(android.content.res.TypedArray);
    method protected void initializeScrollbars(android.content.res.TypedArray);
    method public void invalidate(android.graphics.Rect);
    method public void invalidate(int, int, int, int);
    method public void invalidate();
    method public void invalidateDrawable(android.graphics.drawable.Drawable);
    method public boolean isClickable();
    method public boolean isDrawingCacheEnabled();
    method public boolean isDuplicateParentStateEnabled();
    method public boolean isEnabled();
    method public final boolean isFocusable();
    method public final boolean isFocusableInTouchMode();
    method public boolean isFocused();
    method public boolean isHapticFeedbackEnabled();
    method public boolean isHorizontalFadingEdgeEnabled();
    method public boolean isHorizontalScrollBarEnabled();
    method public boolean isInEditMode();
    method public boolean isInTouchMode();
    method public boolean isLayoutRequested();
    method public boolean isLongClickable();
    method protected boolean isPaddingOffsetRequired();
    method public boolean isPressed();
    method public boolean isSaveEnabled();
    method public boolean isSelected();
    method public boolean isShown();
    method public boolean isSoundEffectsEnabled();
    method public boolean isVerticalFadingEdgeEnabled();
    method public boolean isVerticalScrollBarEnabled();
    method public final void layout(int, int, int, int);
    method public final void measure(int, int);
    method protected static int[] mergeDrawableStates(int[], int[]);
    method public void offsetLeftAndRight(int);
    method public void offsetTopAndBottom(int);
    method protected void onAnimationEnd();
    method protected void onAnimationStart();
    method protected void onAttachedToWindow();
    method public boolean onCheckIsTextEditor();
    method protected void onCreateContextMenu(android.view.ContextMenu);
    method protected int[] onCreateDrawableState(int);
    method public android.view.inputmethod.InputConnection onCreateInputConnection(android.view.inputmethod.EditorInfo);
    method protected void onDetachedFromWindow();
    method protected void onDraw(android.graphics.Canvas);
    method protected void onFinishInflate();
    method public void onFinishTemporaryDetach();
    method protected void onFocusChanged(boolean, int, android.graphics.Rect);
    method public boolean onKeyDown(int, android.view.KeyEvent);
    method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
    method public boolean onKeyPreIme(int, android.view.KeyEvent);
    method public boolean onKeyShortcut(int, android.view.KeyEvent);
    method public boolean onKeyUp(int, android.view.KeyEvent);
    method protected void onLayout(boolean, int, int, int, int);
    method protected void onMeasure(int, int);
    method protected void onRestoreInstanceState(android.os.Parcelable);
    method protected android.os.Parcelable onSaveInstanceState();
    method protected void onScrollChanged(int, int, int, int);
    method protected boolean onSetAlpha(int);
    method protected void onSizeChanged(int, int, int, int);
    method public void onStartTemporaryDetach();
    method public boolean onTouchEvent(android.view.MotionEvent);
    method public boolean onTrackballEvent(android.view.MotionEvent);
    method public void onWindowFocusChanged(boolean);
    method protected void onWindowVisibilityChanged(int);
    method public boolean performClick();
    method public boolean performHapticFeedback(int);
    method public boolean performHapticFeedback(int, int);
    method public boolean performLongClick();
    method public void playSoundEffect(int);
    method public boolean post(Runnable);
    method public boolean postDelayed(Runnable, long);
    method public void postInvalidate();
    method public void postInvalidate(int, int, int, int);
    method public void postInvalidateDelayed(long);
    method public void postInvalidateDelayed(long, int, int, int, int);
    method public void refreshDrawableState();
    method public boolean removeCallbacks(Runnable);
    method public final boolean requestFocus();
    method public final boolean requestFocus(int);
    method public boolean requestFocus(int, android.graphics.Rect);
    method public final boolean requestFocusFromTouch();
    method public void requestLayout();
    method public boolean requestRectangleOnScreen(android.graphics.Rect);
    method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
    method public static int resolveSize(int, int);
    method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable>);
    method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable>);
    method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
    method public void scrollBy(int, int);
    method public void scrollTo(int, int);
    method public void setAnimation(android.view.animation.Animation);
    method public void setBackgroundColor(int);
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
    method public void setBackgroundResource(int);
    method public void setClickable(boolean);
    method public void setDrawingCacheBackgroundColor(int);
    method public void setDrawingCacheEnabled(boolean);
    method public void setDrawingCacheQuality(int);
    method public void setDuplicateParentStateEnabled(boolean);
    method public void setEnabled(boolean);
    method public void setFadingEdgeLength(int);
    method public void setFocusable(boolean);
    method public void setFocusableInTouchMode(boolean);
    method public void setHapticFeedbackEnabled(boolean);
    method public void setHorizontalFadingEdgeEnabled(boolean);
    method public void setHorizontalScrollBarEnabled(boolean);
    method public void setId(int);
    method public void setKeepScreenOn(boolean);
    method public void setLayoutParams(android.view.ViewGroup.LayoutParams);
    method public void setLongClickable(boolean);
    method protected final void setMeasuredDimension(int, int);
    method public void setMinimumHeight(int);
    method public void setMinimumWidth(int);
    method public void setNextFocusDownId(int);
    method public void setNextFocusLeftId(int);
    method public void setNextFocusRightId(int);
    method public void setNextFocusUpId(int);
    method public void setOnClickListener(android.view.View.OnClickListener);
    method public void setOnCreateContextMenuListener(android.view.View.OnCreateContextMenuListener);
    method public void setOnFocusChangeListener(android.view.View.OnFocusChangeListener);
    method public void setOnKeyListener(android.view.View.OnKeyListener);
    method public void setOnLongClickListener(android.view.View.OnLongClickListener);
    method public void setOnTouchListener(android.view.View.OnTouchListener);
    method public void setPadding(int, int, int, int);
    method public void setPressed(boolean);
    method public void setSaveEnabled(boolean);
    method public void setScrollBarStyle(int);
    method public void setScrollContainer(boolean);
    method public void setSelected(boolean);
    method public void setSoundEffectsEnabled(boolean);
    method public void setTag(Object);
    method public void setTouchDelegate(android.view.TouchDelegate);
    method public void setVerticalFadingEdgeEnabled(boolean);
    method public void setVerticalScrollBarEnabled(boolean);
    method public void setVisibility(int);
    method public void setWillNotCacheDrawing(boolean);
    method public void setWillNotDraw(boolean);
    method public boolean showContextMenu();
    method public void startAnimation(android.view.animation.Animation);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
    method public void unscheduleDrawable(android.graphics.drawable.Drawable);
    method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
    method public boolean willNotCacheDrawing();
    method public boolean willNotDraw();
    field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
    field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
    field public static final int DRAWING_CACHE_QUALITY_LOW = 524288; // 0x80000
    field protected static final int[] EMPTY_STATE_SET;
    field protected static final int[] ENABLED_FOCUSED_SELECTED_STATE_SET;
    field protected static final int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] ENABLED_FOCUSED_STATE_SET;
    field protected static final int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] ENABLED_SELECTED_STATE_SET;
    field protected static final int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] ENABLED_STATE_SET;
    field protected static final int[] ENABLED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] FOCUSED_SELECTED_STATE_SET;
    field protected static final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] FOCUSED_STATE_SET;
    field protected static final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
    field public static final int FOCUS_BACKWARD = 1; // 0x1
    field public static final int FOCUS_DOWN = 130; // 0x82
    field public static final int FOCUS_FORWARD = 2; // 0x2
    field public static final int FOCUS_LEFT = 17; // 0x11
    field public static final int FOCUS_RIGHT = 66; // 0x42
    field public static final int FOCUS_UP = 33; // 0x21
    field public static final int GONE = 8; // 0x8
    field public static final int HAPTIC_FEEDBACK_ENABLED = 268435456; // 0x10000000
    field public static final int INVISIBLE = 4; // 0x4
    field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
    field public static final int NO_ID = -1; // 0xffffffff
    field protected static final int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_SELECTED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_STATE_SET;
    field protected static final int[] PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_FOCUSED_SELECTED_STATE_SET;
    field protected static final int[] PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_SELECTED_STATE_SET;
    field protected static final int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
    field protected static final int[] PRESSED_WINDOW_FOCUSED_STATE_SET;
    field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
    field public static final int SCROLLBARS_INSIDE_OVERLAY = 0; // 0x0
    field public static final int SCROLLBARS_OUTSIDE_INSET = 50331648; // 0x3000000
    field public static final int SCROLLBARS_OUTSIDE_OVERLAY = 33554432; // 0x2000000
    field protected static final int[] SELECTED_STATE_SET;
    field protected static final int[] SELECTED_WINDOW_FOCUSED_STATE_SET;
    field public static final int SOUND_EFFECTS_ENABLED = 134217728; // 0x8000000
    field protected static final String VIEW_LOG_TAG = "View";
    field public static final int VISIBLE = 0; // 0x0
    field protected static final int[] WINDOW_FOCUSED_STATE_SET;
  }

  public static class View.BaseSavedState extends android.view.AbsSavedState {
    ctor public View.BaseSavedState(android.os.Parcel);
    ctor public View.BaseSavedState(android.os.Parcelable);
    field public static final android.os.Parcelable.Creator<android.view.View.BaseSavedState> CREATOR;
  }

  public static class View.MeasureSpec {
    ctor public View.MeasureSpec();
    method public static int getMode(int);
    method public static int getSize(int);
    method public static int makeMeasureSpec(int, int);
    method public static String toString(int);
    field public static final int AT_MOST = -2147483648; // 0x80000000
    field public static final int EXACTLY = 1073741824; // 0x40000000
    field public static final int UNSPECIFIED = 0; // 0x0
  }

  public static interface View.OnClickListener {
    method public void onClick(android.view.View);
  }

  public static interface View.OnCreateContextMenuListener {
    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
  }

  public static interface View.OnFocusChangeListener {
    method public void onFocusChange(android.view.View, boolean);
  }

  public static interface View.OnKeyListener {
    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
  }

  public static interface View.OnLongClickListener {
    method public boolean onLongClick(android.view.View);
  }

  public static interface View.OnTouchListener {
    method public boolean onTouch(android.view.View, android.view.MotionEvent);
  }

  public class ViewConfiguration {
    ctor public ViewConfiguration();
    method public static android.view.ViewConfiguration get(android.content.Context);
    method public static int getDoubleTapTimeout();
    method public static int getEdgeSlop();
    method public static int getFadingEdgeLength();
    method public static long getGlobalActionKeyTimeout();
    method public static int getJumpTapTimeout();
    method public static int getLongPressTimeout();
    method public static int getMaximumDrawingCacheSize();
    method public static int getMinimumFlingVelocity();
    method public static int getPressedStateDuration();
    method public int getScaledDoubleTapSlop();
    method public int getScaledEdgeSlop();
    method public int getScaledFadingEdgeLength();
    method public int getScaledMaximumDrawingCacheSize();
    method public int getScaledMinimumFlingVelocity();
    method public int getScaledScrollBarSize();
    method public int getScaledTouchSlop();
    method public int getScaledWindowTouchSlop();
    method public static int getScrollBarSize();
    method public static float getScrollFriction();
    method public static int getTapTimeout();
    method public static int getTouchSlop();
    method public static int getWindowTouchSlop();
    method public static long getZoomControlsTimeout();
  }

  public class ViewDebug {
    ctor public ViewDebug();
    method public static void dumpCapturedView(String, Object);
    method public static void startHierarchyTracing(String, android.view.View);
    method public static void startRecyclerTracing(String, android.view.View);
    method public static void stopHierarchyTracing();
    method public static void stopRecyclerTracing();
    method public static void trace(android.view.View, android.view.ViewDebug.RecyclerTraceType, int...);
    method public static void trace(android.view.View, android.view.ViewDebug.HierarchyTraceType);
    field public static final boolean TRACE_HIERARCHY = false;
    field public static final boolean TRACE_RECYCLER = false;
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.CapturedViewProperty {
    method public abstract boolean retrieveReturn() default false;
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.ExportedProperty {
    method public abstract boolean deepExport() default false;
    method public abstract android.view.ViewDebug.IntToString[] indexMapping() default {};
    method public abstract android.view.ViewDebug.IntToString[] mapping() default {};
    method public abstract String prefix() default "";
    method public abstract boolean resolveId() default false;
  }

  public enum ViewDebug.HierarchyTraceType {
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType BUILD_CACHE;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType DRAW;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType INVALIDATE_CHILD_IN_PARENT;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType ON_LAYOUT;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType ON_MEASURE;
    enum_constant public static final android.view.ViewDebug.HierarchyTraceType REQUEST_LAYOUT;
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface ViewDebug.IntToString {
    method public abstract int from();
    method public abstract String to();
  }

  public enum ViewDebug.RecyclerTraceType {
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType BIND_VIEW;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType MOVE_FROM_ACTIVE_TO_SCRAP_HEAP;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType MOVE_TO_ACTIVE_HEAP;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType MOVE_TO_SCRAP_HEAP;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType NEW_VIEW;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_ACTIVE_HEAP;
    enum_constant public static final android.view.ViewDebug.RecyclerTraceType RECYCLE_FROM_SCRAP_HEAP;
  }

  public abstract class ViewGroup extends android.view.View implements android.view.ViewManager android.view.ViewParent {
    ctor public ViewGroup(android.content.Context);
    ctor public ViewGroup(android.content.Context, android.util.AttributeSet);
    ctor public ViewGroup(android.content.Context, android.util.AttributeSet, int);
    method public boolean addStatesFromChildren();
    method public void addView(android.view.View);
    method public void addView(android.view.View, int);
    method public void addView(android.view.View, int, int);
    method public void addView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void addView(android.view.View, int, android.view.ViewGroup.LayoutParams);
    method protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup.LayoutParams);
    method protected boolean addViewInLayout(android.view.View, int, android.view.ViewGroup.LayoutParams, boolean);
    method protected void attachLayoutAnimationParameters(android.view.View, android.view.ViewGroup.LayoutParams, int, int);
    method protected void attachViewToParent(android.view.View, int, android.view.ViewGroup.LayoutParams);
    method public void bringChildToFront(android.view.View);
    method protected boolean canAnimate();
    method protected boolean checkLayoutParams(android.view.ViewGroup.LayoutParams);
    method public void childDrawableStateChanged(android.view.View);
    method protected void cleanupLayoutState(android.view.View);
    method public void clearChildFocus(android.view.View);
    method public void clearDisappearingChildren();
    method protected void debug(int);
    method protected void detachAllViewsFromParent();
    method protected void detachViewFromParent(android.view.View);
    method protected void detachViewFromParent(int);
    method protected void detachViewsFromParent(int, int);
    method protected void dispatchFreezeSelfOnly(android.util.SparseArray<android.os.Parcelable>);
    method public void dispatchSetSelected(boolean);
    method protected void dispatchThawSelfOnly(android.util.SparseArray<android.os.Parcelable>);
    method protected boolean drawChild(android.graphics.Canvas, android.view.View, long);
    method public android.view.View focusSearch(android.view.View, int);
    method public void focusableViewAvailable(android.view.View);
    method public boolean gatherTransparentRegion(android.graphics.Region);
    method protected android.view.ViewGroup.LayoutParams generateDefaultLayoutParams();
    method public android.view.ViewGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method protected android.view.ViewGroup.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
    method public android.view.View getChildAt(int);
    method public int getChildCount();
    method protected int getChildDrawingOrder(int, int);
    method public static int getChildMeasureSpec(int, int, int);
    method protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation);
    method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    method public int getDescendantFocusability();
    method public android.view.View getFocusedChild();
    method public android.view.animation.LayoutAnimationController getLayoutAnimation();
    method public android.view.animation.Animation.AnimationListener getLayoutAnimationListener();
    method public int getPersistentDrawingCache();
    method public int indexOfChild(android.view.View);
    method public final void invalidateChild(android.view.View, android.graphics.Rect);
    method public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    method public boolean isAlwaysDrawnWithCacheEnabled();
    method public boolean isAnimationCacheEnabled();
    method protected boolean isChildrenDrawnWithCacheEnabled();
    method protected void measureChild(android.view.View, int, int);
    method protected void measureChildWithMargins(android.view.View, int, int, int, int);
    method protected void measureChildren(int, int);
    method public final void offsetDescendantRectToMyCoords(android.view.View, android.graphics.Rect);
    method public final void offsetRectIntoDescendantCoords(android.view.View, android.graphics.Rect);
    method public boolean onInterceptTouchEvent(android.view.MotionEvent);
    method protected abstract void onLayout(boolean, int, int, int, int);
    method protected boolean onRequestFocusInDescendants(int, android.graphics.Rect);
    method public void recomputeViewAttributes(android.view.View);
    method public void removeAllViews();
    method public void removeAllViewsInLayout();
    method protected void removeDetachedView(android.view.View, boolean);
    method public void removeView(android.view.View);
    method public void removeViewAt(int);
    method public void removeViewInLayout(android.view.View);
    method public void removeViews(int, int);
    method public void removeViewsInLayout(int, int);
    method public void requestChildFocus(android.view.View, android.view.View);
    method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    method public void requestDisallowInterceptTouchEvent(boolean);
    method public void requestTransparentRegion(android.view.View);
    method public void scheduleLayoutAnimation();
    method public void setAddStatesFromChildren(boolean);
    method public void setAlwaysDrawnWithCacheEnabled(boolean);
    method public void setAnimationCacheEnabled(boolean);
    method protected void setChildrenDrawingCacheEnabled(boolean);
    method protected void setChildrenDrawnWithCacheEnabled(boolean);
    method public void setClipChildren(boolean);
    method public void setClipToPadding(boolean);
    method public void setDescendantFocusability(int);
    method public void setLayoutAnimation(android.view.animation.LayoutAnimationController);
    method public void setLayoutAnimationListener(android.view.animation.Animation.AnimationListener);
    method public void setOnHierarchyChangeListener(android.view.ViewGroup.OnHierarchyChangeListener);
    method public void setPersistentDrawingCache(int);
    method protected void setStaticTransformationsEnabled(boolean);
    method public boolean showContextMenuForChild(android.view.View);
    method public void startLayoutAnimation();
    method public void updateViewLayout(android.view.View, android.view.ViewGroup.LayoutParams);
    field protected static final int CLIP_TO_PADDING_MASK = 34; // 0x22
    field protected static final int FLAG_USE_CHILD_DRAWING_ORDER = 1024; // 0x400
    field public static final int FOCUS_AFTER_DESCENDANTS = 262144; // 0x40000
    field public static final int FOCUS_BEFORE_DESCENDANTS = 131072; // 0x20000
    field public static final int FOCUS_BLOCK_DESCENDANTS = 393216; // 0x60000
    field public static final int PERSISTENT_ALL_CACHES = 3; // 0x3
    field public static final int PERSISTENT_ANIMATION_CACHE = 1; // 0x1
    field public static final int PERSISTENT_NO_CACHE = 0; // 0x0
    field public static final int PERSISTENT_SCROLLING_CACHE = 2; // 0x2
  }

  public static class ViewGroup.LayoutParams {
    ctor public ViewGroup.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public ViewGroup.LayoutParams(int, int);
    ctor public ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams);
    method protected void setBaseAttributes(android.content.res.TypedArray, int, int);
    field public static final int FILL_PARENT = -1; // 0xffffffff
    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
    field public int height;
    field public android.view.animation.LayoutAnimationController.AnimationParameters layoutAnimationParameters;
    field public int width;
  }

  public static class ViewGroup.MarginLayoutParams extends android.view.ViewGroup.LayoutParams {
    ctor public ViewGroup.MarginLayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public ViewGroup.MarginLayoutParams(int, int);
    ctor public ViewGroup.MarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
    ctor public ViewGroup.MarginLayoutParams(android.view.ViewGroup.LayoutParams);
    method public void setMargins(int, int, int, int);
    field public int bottomMargin;
    field public int leftMargin;
    field public int rightMargin;
    field public int topMargin;
  }

  public static interface ViewGroup.OnHierarchyChangeListener {
    method public void onChildViewAdded(android.view.View, android.view.View);
    method public void onChildViewRemoved(android.view.View, android.view.View);
  }

  public interface ViewManager {
    method public void addView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void removeView(android.view.View);
    method public void updateViewLayout(android.view.View, android.view.ViewGroup.LayoutParams);
  }

  public interface ViewParent {
    method public void bringChildToFront(android.view.View);
    method public void childDrawableStateChanged(android.view.View);
    method public void clearChildFocus(android.view.View);
    method public void createContextMenu(android.view.ContextMenu);
    method public android.view.View focusSearch(android.view.View, int);
    method public void focusableViewAvailable(android.view.View);
    method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
    method public android.view.ViewParent getParent();
    method public void invalidateChild(android.view.View, android.graphics.Rect);
    method public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
    method public boolean isLayoutRequested();
    method public void recomputeViewAttributes(android.view.View);
    method public void requestChildFocus(android.view.View, android.view.View);
    method public boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
    method public void requestDisallowInterceptTouchEvent(boolean);
    method public void requestLayout();
    method public void requestTransparentRegion(android.view.View);
    method public boolean showContextMenuForChild(android.view.View);
  }

  public final class ViewStub extends android.view.View {
    ctor public ViewStub(android.content.Context);
    ctor public ViewStub(android.content.Context, int);
    ctor public ViewStub(android.content.Context, android.util.AttributeSet);
    ctor public ViewStub(android.content.Context, android.util.AttributeSet, int);
    method public int getInflatedId();
    method public int getLayoutResource();
    method public android.view.View inflate();
    method public void setInflatedId(int);
    method public void setLayoutResource(int);
    method public void setOnInflateListener(android.view.ViewStub.OnInflateListener);
  }

  public static interface ViewStub.OnInflateListener {
    method public void onInflate(android.view.ViewStub, android.view.View);
  }

  public final class ViewTreeObserver {
    method public void addOnGlobalFocusChangeListener(android.view.ViewTreeObserver.OnGlobalFocusChangeListener);
    method public void addOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
    method public void addOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
    method public void addOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
    method public void addOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
    method public void dispatchOnGlobalLayout();
    method public boolean dispatchOnPreDraw();
    method public boolean isAlive();
    method public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
    method public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver.OnGlobalFocusChangeListener);
    method public void removeOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
    method public void removeOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
    method public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
  }

  public static interface ViewTreeObserver.OnGlobalFocusChangeListener {
    method public void onGlobalFocusChanged(android.view.View, android.view.View);
  }

  public static interface ViewTreeObserver.OnGlobalLayoutListener {
    method public void onGlobalLayout();
  }

  public static interface ViewTreeObserver.OnPreDrawListener {
    method public boolean onPreDraw();
  }

  public static interface ViewTreeObserver.OnScrollChangedListener {
    method public void onScrollChanged();
  }

  public static interface ViewTreeObserver.OnTouchModeChangeListener {
    method public void onTouchModeChanged(boolean);
  }

  public abstract class Window {
    ctor public Window(android.content.Context);
    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method public void addFlags(int);
    method public void clearFlags(int);
    method public abstract void closeAllPanels();
    method public abstract void closePanel(int);
    method public android.view.View findViewById(int);
    method public final android.view.WindowManager.LayoutParams getAttributes();
    method public final android.view.Window.Callback getCallback();
    method public final android.view.Window getContainer();
    method public final android.content.Context getContext();
    method public abstract android.view.View getCurrentFocus();
    method public abstract android.view.View getDecorView();
    method protected final int getFeatures();
    method protected final int getForcedWindowFlags();
    method public abstract android.view.LayoutInflater getLayoutInflater();
    method protected final int getLocalFeatures();
    method public abstract int getVolumeControlStream();
    method public android.view.WindowManager getWindowManager();
    method public final android.content.res.TypedArray getWindowStyle();
    method public final boolean hasChildren();
    method protected final boolean hasSoftInputMode();
    method public final boolean isActive();
    method public abstract boolean isFloating();
    method public abstract boolean isShortcutKey(int, android.view.KeyEvent);
    method public final void makeActive();
    method protected abstract void onActive();
    method public abstract void onConfigurationChanged(android.content.res.Configuration);
    method public abstract void openPanel(int, android.view.KeyEvent);
    method public abstract android.view.View peekDecorView();
    method public abstract boolean performContextMenuIdentifierAction(int, int);
    method public abstract boolean performPanelIdentifierAction(int, int, int);
    method public abstract boolean performPanelShortcut(int, int, android.view.KeyEvent, int);
    method public boolean requestFeature(int);
    method public abstract void restoreHierarchyState(android.os.Bundle);
    method public abstract android.os.Bundle saveHierarchyState();
    method public void setAttributes(android.view.WindowManager.LayoutParams);
    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
    method public void setBackgroundDrawableResource(int);
    method public void setCallback(android.view.Window.Callback);
    method public abstract void setChildDrawable(int, android.graphics.drawable.Drawable);
    method public abstract void setChildInt(int, int);
    method public void setContainer(android.view.Window);
    method public abstract void setContentView(int);
    method public abstract void setContentView(android.view.View);
    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
    method protected void setDefaultWindowFormat(int);
    method public abstract void setFeatureDrawable(int, android.graphics.drawable.Drawable);
    method public abstract void setFeatureDrawableAlpha(int, int);
    method public abstract void setFeatureDrawableResource(int, int);
    method public abstract void setFeatureDrawableUri(int, android.net.Uri);
    method public abstract void setFeatureInt(int, int);
    method public void setFlags(int, int);
    method public void setFormat(int);
    method public void setGravity(int);
    method public void setLayout(int, int);
    method public void setSoftInputMode(int);
    method public abstract void setTitle(CharSequence);
    method public abstract void setTitleColor(int);
    method public void setType(int);
    method public abstract void setVolumeControlStream(int);
    method public void setWindowAnimations(int);
    method public void setWindowManager(android.view.WindowManager, android.os.IBinder, String);
    method public abstract boolean superDispatchKeyEvent(android.view.KeyEvent);
    method public abstract boolean superDispatchTouchEvent(android.view.MotionEvent);
    method public abstract boolean superDispatchTrackballEvent(android.view.MotionEvent);
    method public abstract void takeKeyEvents(boolean);
    method public abstract void togglePanel(int, android.view.KeyEvent);
    field protected static final int DEFAULT_FEATURES = 65; // 0x41
    field public static final int FEATURE_CONTEXT_MENU = 6; // 0x6
    field public static final int FEATURE_CUSTOM_TITLE = 7; // 0x7
    field public static final int FEATURE_INDETERMINATE_PROGRESS = 5; // 0x5
    field public static final int FEATURE_LEFT_ICON = 3; // 0x3
    field public static final int FEATURE_NO_TITLE = 1; // 0x1
    field public static final int FEATURE_OPTIONS_PANEL = 0; // 0x0
    field public static final int FEATURE_PROGRESS = 2; // 0x2
    field public static final int FEATURE_RIGHT_ICON = 4; // 0x4
    field public static final int ID_ANDROID_CONTENT = 16908290; // 0x1020002
    field public static final int PROGRESS_END = 10000; // 0x2710
    field public static final int PROGRESS_INDETERMINATE_OFF = -4; // 0xfffffffc
    field public static final int PROGRESS_INDETERMINATE_ON = -3; // 0xfffffffd
    field public static final int PROGRESS_SECONDARY_END = 30000; // 0x7530
    field public static final int PROGRESS_SECONDARY_START = 20000; // 0x4e20
    field public static final int PROGRESS_START = 0; // 0x0
    field public static final int PROGRESS_VISIBILITY_OFF = -2; // 0xfffffffe
    field public static final int PROGRESS_VISIBILITY_ON = -1; // 0xffffffff
  }

  public static interface Window.Callback {
    method public boolean dispatchKeyEvent(android.view.KeyEvent);
    method public boolean dispatchTouchEvent(android.view.MotionEvent);
    method public boolean dispatchTrackballEvent(android.view.MotionEvent);
    method public void onContentChanged();
    method public boolean onCreatePanelMenu(int, android.view.Menu);
    method public android.view.View onCreatePanelView(int);
    method public boolean onMenuItemSelected(int, android.view.MenuItem);
    method public boolean onMenuOpened(int, android.view.Menu);
    method public void onPanelClosed(int, android.view.Menu);
    method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
    method public boolean onSearchRequested();
    method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams);
    method public void onWindowFocusChanged(boolean);
  }

  public interface WindowManager extends android.view.ViewManager {
    method public android.view.Display getDefaultDisplay();
    method public void removeViewImmediate(android.view.View);
  }

  public static class WindowManager.BadTokenException extends java.lang.RuntimeException {
    ctor public WindowManager.BadTokenException();
    ctor public WindowManager.BadTokenException(String);
  }

  public static class WindowManager.LayoutParams extends android.view.ViewGroup.LayoutParams implements android.os.Parcelable {
    ctor public WindowManager.LayoutParams();
    ctor public WindowManager.LayoutParams(int);
    ctor public WindowManager.LayoutParams(int, int);
    ctor public WindowManager.LayoutParams(int, int, int);
    ctor public WindowManager.LayoutParams(int, int, int, int, int);
    ctor public WindowManager.LayoutParams(int, int, int, int, int, int, int);
    ctor public WindowManager.LayoutParams(android.os.Parcel);
    method public final int copyFrom(android.view.WindowManager.LayoutParams);
    method public String debug(String);
    method public int describeContents();
    method public final CharSequence getTitle();
    method public static boolean mayUseInputMethod(int);
    method public final void setTitle(CharSequence);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int ALPHA_CHANGED = 128; // 0x80
    field public static final int ANIMATION_CHANGED = 16; // 0x10
    field public static final android.os.Parcelable.Creator<android.view.WindowManager.LayoutParams> CREATOR;
    field public static final int DIM_AMOUNT_CHANGED = 32; // 0x20
    field public static final int FIRST_APPLICATION_WINDOW = 1; // 0x1
    field public static final int FIRST_SUB_WINDOW = 1000; // 0x3e8
    field public static final int FIRST_SYSTEM_WINDOW = 2000; // 0x7d0
    field public static final int FLAGS_CHANGED = 4; // 0x4
    field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
    field public static final int FLAG_BLUR_BEHIND = 4; // 0x4
    field public static final int FLAG_DIM_BEHIND = 2; // 0x2
    field public static final int FLAG_DITHER = 4096; // 0x1000
    field public static final int FLAG_FORCE_NOT_FULLSCREEN = 2048; // 0x800
    field public static final int FLAG_FULLSCREEN = 1024; // 0x400
    field public static final int FLAG_IGNORE_CHEEK_PRESSES = 32768; // 0x8000
    field public static final int FLAG_KEEP_SCREEN_ON = 128; // 0x80
    field public static final int FLAG_LAYOUT_INSET_DECOR = 65536; // 0x10000
    field public static final int FLAG_LAYOUT_IN_SCREEN = 256; // 0x100
    field public static final int FLAG_LAYOUT_NO_LIMITS = 512; // 0x200
    field public static final int FLAG_NOT_FOCUSABLE = 8; // 0x8
    field public static final int FLAG_NOT_TOUCHABLE = 16; // 0x10
    field public static final int FLAG_NOT_TOUCH_MODAL = 32; // 0x20
    field public static final int FLAG_SCALED = 16384; // 0x4000
    field public static final int FLAG_SECURE = 8192; // 0x2000
    field public static final int FLAG_TOUCHABLE_WHEN_WAKING = 64; // 0x40
    field public static final int FLAG_WATCH_OUTSIDE_TOUCH = 262144; // 0x40000
    field public static final int FORMAT_CHANGED = 8; // 0x8
    field public static final int LAST_APPLICATION_WINDOW = 99; // 0x63
    field public static final int LAST_SUB_WINDOW = 1999; // 0x7cf
    field public static final int LAST_SYSTEM_WINDOW = 2999; // 0xbb7
    field public static final int LAYOUT_CHANGED = 1; // 0x1
    field public static final int MEMORY_TYPE_CHANGED = 256; // 0x100
    field public static final int MEMORY_TYPE_GPU = 2; // 0x2
    field public static final int MEMORY_TYPE_HARDWARE = 1; // 0x1
    field public static final int MEMORY_TYPE_NORMAL = 0; // 0x0
    field public static final int MEMORY_TYPE_PUSH_BUFFERS = 3; // 0x3
    field public static final int SCREEN_BRIGHTNESS_CHANGED = 2048; // 0x800
    field public static final int SCREEN_ORIENTATION_CHANGED = 1024; // 0x400
    field public static final int SOFT_INPUT_ADJUST_PAN = 32; // 0x20
    field public static final int SOFT_INPUT_ADJUST_RESIZE = 16; // 0x10
    field public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0; // 0x0
    field public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 256; // 0x100
    field public static final int SOFT_INPUT_MASK_ADJUST = 240; // 0xf0
    field public static final int SOFT_INPUT_MASK_STATE = 15; // 0xf
    field public static final int SOFT_INPUT_MODE_CHANGED = 512; // 0x200
    field public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3; // 0x3
    field public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5; // 0x5
    field public static final int SOFT_INPUT_STATE_HIDDEN = 2; // 0x2
    field public static final int SOFT_INPUT_STATE_UNCHANGED = 1; // 0x1
    field public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0; // 0x0
    field public static final int SOFT_INPUT_STATE_VISIBLE = 4; // 0x4
    field public static final int TITLE_CHANGED = 64; // 0x40
    field public static final int TYPE_APPLICATION = 2; // 0x2
    field public static final int TYPE_APPLICATION_ATTACHED_DIALOG = 1003; // 0x3eb
    field public static final int TYPE_APPLICATION_MEDIA = 1001; // 0x3e9
    field public static final int TYPE_APPLICATION_PANEL = 1000; // 0x3e8
    field public static final int TYPE_APPLICATION_STARTING = 3; // 0x3
    field public static final int TYPE_APPLICATION_SUB_PANEL = 1002; // 0x3ea
    field public static final int TYPE_BASE_APPLICATION = 1; // 0x1
    field public static final int TYPE_CHANGED = 2; // 0x2
    field public static final int TYPE_INPUT_METHOD = 2011; // 0x7db
    field public static final int TYPE_INPUT_METHOD_DIALOG = 2012; // 0x7dc
    field public static final int TYPE_KEYGUARD = 2004; // 0x7d4
    field public static final int TYPE_KEYGUARD_DIALOG = 2009; // 0x7d9
    field public static final int TYPE_PHONE = 2002; // 0x7d2
    field public static final int TYPE_PRIORITY_PHONE = 2007; // 0x7d7
    field public static final int TYPE_SEARCH_BAR = 2001; // 0x7d1
    field public static final int TYPE_STATUS_BAR = 2000; // 0x7d0
    field public static final int TYPE_STATUS_BAR_PANEL = 2008; // 0x7d8
    field public static final int TYPE_SYSTEM_ALERT = 2003; // 0x7d3
    field public static final int TYPE_SYSTEM_DIALOG = 2008; // 0x7d8
    field public static final int TYPE_SYSTEM_ERROR = 2010; // 0x7da
    field public static final int TYPE_SYSTEM_OVERLAY = 2006; // 0x7d6
    field public static final int TYPE_TOAST = 2005; // 0x7d5
    field public float alpha;
    field public float dimAmount;
    field public int flags;
    field public int format;
    field public int gravity;
    field public float horizontalMargin;
    field public float horizontalWeight;
    field public int memoryType;
    field public String packageName;
    field public float screenBrightness;
    field public int screenOrientation;
    field public int softInputMode;
    field public android.os.IBinder token;
    field public int type;
    field public float verticalMargin;
    field public float verticalWeight;
    field public int windowAnimations;
    field public int x;
    field public int y;
  }

}

package android.view.animation {

  public class AccelerateDecelerateInterpolator implements android.view.animation.Interpolator {
    ctor public AccelerateDecelerateInterpolator();
    ctor public AccelerateDecelerateInterpolator(android.content.Context, android.util.AttributeSet);
    method public float getInterpolation(float);
  }

  public class AccelerateInterpolator implements android.view.animation.Interpolator {
    ctor public AccelerateInterpolator();
    ctor public AccelerateInterpolator(float);
    ctor public AccelerateInterpolator(android.content.Context, android.util.AttributeSet);
    method public float getInterpolation(float);
  }

  public class AlphaAnimation extends android.view.animation.Animation {
    ctor public AlphaAnimation(android.content.Context, android.util.AttributeSet);
    ctor public AlphaAnimation(float, float);
  }

  public abstract class Animation implements java.lang.Cloneable {
    ctor public Animation();
    ctor public Animation(android.content.Context, android.util.AttributeSet);
    method protected void applyTransformation(float, android.view.animation.Transformation);
    method protected android.view.animation.Animation clone() throws java.lang.CloneNotSupportedException;
    method public long computeDurationHint();
    method protected void ensureInterpolator();
    method public long getDuration();
    method public boolean getFillAfter();
    method public boolean getFillBefore();
    method public android.view.animation.Interpolator getInterpolator();
    method public int getRepeatCount();
    method public int getRepeatMode();
    method public long getStartOffset();
    method public long getStartTime();
    method public boolean getTransformation(long, android.view.animation.Transformation);
    method public int getZAdjustment();
    method public boolean hasEnded();
    method public boolean hasStarted();
    method public void initialize(int, int, int, int);
    method public boolean isFillEnabled();
    method public boolean isInitialized();
    method public void reset();
    method protected float resolveSize(int, float, int, int);
    method public void restrictDuration(long);
    method public void scaleCurrentDuration(float);
    method public void setAnimationListener(android.view.animation.Animation.AnimationListener);
    method public void setDuration(long);
    method public void setFillAfter(boolean);
    method public void setFillBefore(boolean);
    method public void setFillEnabled(boolean);
    method public void setInterpolator(android.content.Context, int);
    method public void setInterpolator(android.view.animation.Interpolator);
    method public void setRepeatCount(int);
    method public void setRepeatMode(int);
    method public void setStartOffset(long);
    method public void setStartTime(long);
    method public void setZAdjustment(int);
    method public void start();
    method public void startNow();
    method public boolean willChangeBounds();
    method public boolean willChangeTransformationMatrix();
    field public static final int ABSOLUTE = 0; // 0x0
    field public static final int INFINITE = -1; // 0xffffffff
    field public static final int RELATIVE_TO_PARENT = 2; // 0x2
    field public static final int RELATIVE_TO_SELF = 1; // 0x1
    field public static final int RESTART = 1; // 0x1
    field public static final int REVERSE = 2; // 0x2
    field public static final int START_ON_FIRST_FRAME = -1; // 0xffffffff
    field public static final int ZORDER_BOTTOM = -1; // 0xffffffff
    field public static final int ZORDER_NORMAL = 0; // 0x0
    field public static final int ZORDER_TOP = 1; // 0x1
  }

  public static interface Animation.AnimationListener {
    method public void onAnimationEnd(android.view.animation.Animation);
    method public void onAnimationRepeat(android.view.animation.Animation);
    method public void onAnimationStart(android.view.animation.Animation);
  }

  protected static class Animation.Description {
    ctor protected Animation.Description();
    field public int type;
    field public float value;
  }

  public class AnimationSet extends android.view.animation.Animation {
    ctor public AnimationSet(android.content.Context, android.util.AttributeSet);
    ctor public AnimationSet(boolean);
    method public void addAnimation(android.view.animation.Animation);
    method protected android.view.animation.AnimationSet clone() throws java.lang.CloneNotSupportedException;
    method public java.util.List<android.view.animation.Animation> getAnimations();
  }

  public class AnimationUtils {
    ctor public AnimationUtils();
    method public static long currentAnimationTimeMillis();
    method public static android.view.animation.Animation loadAnimation(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
    method public static android.view.animation.Interpolator loadInterpolator(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
    method public static android.view.animation.LayoutAnimationController loadLayoutAnimation(android.content.Context, int) throws android.content.res.Resources.NotFoundException;
    method public static android.view.animation.Animation makeInAnimation(android.content.Context, boolean);
    method public static android.view.animation.Animation makeInChildBottomAnimation(android.content.Context);
    method public static android.view.animation.Animation makeOutAnimation(android.content.Context, boolean);
  }

  public class CycleInterpolator implements android.view.animation.Interpolator {
    ctor public CycleInterpolator(float);
    ctor public CycleInterpolator(android.content.Context, android.util.AttributeSet);
    method public float getInterpolation(float);
  }

  public class DecelerateInterpolator implements android.view.animation.Interpolator {
    ctor public DecelerateInterpolator();
    ctor public DecelerateInterpolator(float);
    ctor public DecelerateInterpolator(android.content.Context, android.util.AttributeSet);
    method public float getInterpolation(float);
  }

  public class GridLayoutAnimationController extends android.view.animation.LayoutAnimationController {
    ctor public GridLayoutAnimationController(android.content.Context, android.util.AttributeSet);
    ctor public GridLayoutAnimationController(android.view.animation.Animation);
    ctor public GridLayoutAnimationController(android.view.animation.Animation, float, float);
    method public float getColumnDelay();
    method public int getDirection();
    method public int getDirectionPriority();
    method public float getRowDelay();
    method public void setColumnDelay(float);
    method public void setDirection(int);
    method public void setDirectionPriority(int);
    method public void setRowDelay(float);
    field public static final int DIRECTION_BOTTOM_TO_TOP = 2; // 0x2
    field public static final int DIRECTION_HORIZONTAL_MASK = 1; // 0x1
    field public static final int DIRECTION_LEFT_TO_RIGHT = 0; // 0x0
    field public static final int DIRECTION_RIGHT_TO_LEFT = 1; // 0x1
    field public static final int DIRECTION_TOP_TO_BOTTOM = 0; // 0x0
    field public static final int DIRECTION_VERTICAL_MASK = 2; // 0x2
    field public static final int PRIORITY_COLUMN = 1; // 0x1
    field public static final int PRIORITY_NONE = 0; // 0x0
    field public static final int PRIORITY_ROW = 2; // 0x2
  }

  public static class GridLayoutAnimationController.AnimationParameters extends android.view.animation.LayoutAnimationController.AnimationParameters {
    ctor public GridLayoutAnimationController.AnimationParameters();
    field public int column;
    field public int columnsCount;
    field public int row;
    field public int rowsCount;
  }

  public interface Interpolator {
    method public float getInterpolation(float);
  }

  public class LayoutAnimationController {
    ctor public LayoutAnimationController(android.content.Context, android.util.AttributeSet);
    ctor public LayoutAnimationController(android.view.animation.Animation);
    ctor public LayoutAnimationController(android.view.animation.Animation, float);
    method public android.view.animation.Animation getAnimation();
    method public final android.view.animation.Animation getAnimationForView(android.view.View);
    method public float getDelay();
    method protected long getDelayForView(android.view.View);
    method public android.view.animation.Interpolator getInterpolator();
    method public int getOrder();
    method protected int getTransformedIndex(android.view.animation.LayoutAnimationController.AnimationParameters);
    method public boolean isDone();
    method public void setAnimation(android.content.Context, int);
    method public void setAnimation(android.view.animation.Animation);
    method public void setDelay(float);
    method public void setInterpolator(android.content.Context, int);
    method public void setInterpolator(android.view.animation.Interpolator);
    method public void setOrder(int);
    method public void start();
    method public boolean willOverlap();
    field public static final int ORDER_NORMAL = 0; // 0x0
    field public static final int ORDER_RANDOM = 2; // 0x2
    field public static final int ORDER_REVERSE = 1; // 0x1
    field protected android.view.animation.Animation mAnimation;
    field protected android.view.animation.Interpolator mInterpolator;
    field protected java.util.Random mRandomizer;
  }

  public static class LayoutAnimationController.AnimationParameters {
    ctor public LayoutAnimationController.AnimationParameters();
    field public int count;
    field public int index;
  }

  public class LinearInterpolator implements android.view.animation.Interpolator {
    ctor public LinearInterpolator();
    ctor public LinearInterpolator(android.content.Context, android.util.AttributeSet);
    method public float getInterpolation(float);
  }

  public class RotateAnimation extends android.view.animation.Animation {
    ctor public RotateAnimation(android.content.Context, android.util.AttributeSet);
    ctor public RotateAnimation(float, float);
    ctor public RotateAnimation(float, float, float, float);
    ctor public RotateAnimation(float, float, int, float, int, float);
  }

  public class ScaleAnimation extends android.view.animation.Animation {
    ctor public ScaleAnimation(android.content.Context, android.util.AttributeSet);
    ctor public ScaleAnimation(float, float, float, float);
    ctor public ScaleAnimation(float, float, float, float, float, float);
    ctor public ScaleAnimation(float, float, float, float, int, float, int, float);
  }

  public class Transformation {
    ctor public Transformation();
    method public void clear();
    method public void compose(android.view.animation.Transformation);
    method public float getAlpha();
    method public android.graphics.Matrix getMatrix();
    method public int getTransformationType();
    method public void set(android.view.animation.Transformation);
    method public void setAlpha(float);
    method public void setTransformationType(int);
    method public String toShortString();
    field public static int TYPE_ALPHA;
    field public static int TYPE_BOTH;
    field public static int TYPE_IDENTITY;
    field public static int TYPE_MATRIX;
    field protected float mAlpha;
    field protected android.graphics.Matrix mMatrix;
    field protected int mTransformationType;
  }

  public class TranslateAnimation extends android.view.animation.Animation {
    ctor public TranslateAnimation(android.content.Context, android.util.AttributeSet);
    ctor public TranslateAnimation(float, float, float, float);
    ctor public TranslateAnimation(int, float, int, float, int, float, int, float);
  }

}

package android.view.inputmethod {

  public class BaseInputConnection implements android.view.inputmethod.InputConnection {
    ctor public BaseInputConnection(android.view.View, boolean);
    method public boolean beginBatchEdit();
    method public boolean clearMetaKeyStates(int);
    method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
    method public boolean commitText(CharSequence, int);
    method public boolean deleteSurroundingText(int, int);
    method public boolean endBatchEdit();
    method public boolean finishComposingText();
    method public static int getComposingSpanEnd(android.text.Spannable);
    method public static int getComposingSpanStart(android.text.Spannable);
    method public int getCursorCapsMode(int);
    method public android.text.Editable getEditable();
    method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
    method public CharSequence getTextAfterCursor(int, int);
    method public CharSequence getTextBeforeCursor(int, int);
    method public boolean performContextMenuAction(int);
    method public boolean performEditorAction(int);
    method public boolean performPrivateCommand(String, android.os.Bundle);
    method public static final void removeComposingSpans(android.text.Spannable);
    method public boolean reportFullscreenMode(boolean);
    method public boolean sendKeyEvent(android.view.KeyEvent);
    method public static void setComposingSpans(android.text.Spannable);
    method public boolean setComposingText(CharSequence, int);
    method public boolean setSelection(int, int);
  }

  public final class CompletionInfo implements android.os.Parcelable {
    ctor public CompletionInfo(long, int, CharSequence);
    ctor public CompletionInfo(long, int, CharSequence, CharSequence);
    method public int describeContents();
    method public long getId();
    method public CharSequence getLabel();
    method public int getPosition();
    method public CharSequence getText();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.CompletionInfo> CREATOR;
  }

  public class EditorInfo implements android.text.InputType android.os.Parcelable {
    ctor public EditorInfo();
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.EditorInfo> CREATOR;
    field public static final int IME_ACTION_DONE = 6; // 0x6
    field public static final int IME_ACTION_GO = 2; // 0x2
    field public static final int IME_ACTION_NEXT = 5; // 0x5
    field public static final int IME_ACTION_NONE = 1; // 0x1
    field public static final int IME_ACTION_SEARCH = 3; // 0x3
    field public static final int IME_ACTION_SEND = 4; // 0x4
    field public static final int IME_ACTION_UNSPECIFIED = 0; // 0x0
    field public static final int IME_FLAG_NO_ACCESSORY_ACTION = 536870912; // 0x20000000
    field public static final int IME_FLAG_NO_ENTER_ACTION = 1073741824; // 0x40000000
    field public static final int IME_FLAG_NO_EXTRACT_UI = 268435456; // 0x10000000
    field public static final int IME_MASK_ACTION = 255; // 0xff
    field public static final int IME_NULL = 0; // 0x0
    field public int actionId;
    field public CharSequence actionLabel;
    field public android.os.Bundle extras;
    field public int fieldId;
    field public String fieldName;
    field public CharSequence hintText;
    field public int imeOptions;
    field public int initialCapsMode;
    field public int initialSelEnd;
    field public int initialSelStart;
    field public int inputType;
    field public CharSequence label;
    field public String packageName;
    field public String privateImeOptions;
  }

  public class ExtractedText implements android.os.Parcelable {
    ctor public ExtractedText();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.ExtractedText> CREATOR;
    field public static final int FLAG_SELECTING = 2; // 0x2
    field public static final int FLAG_SINGLE_LINE = 1; // 0x1
    field public int flags;
    field public int partialEndOffset;
    field public int partialStartOffset;
    field public int selectionEnd;
    field public int selectionStart;
    field public int startOffset;
    field public CharSequence text;
  }

  public class ExtractedTextRequest implements android.os.Parcelable {
    ctor public ExtractedTextRequest();
    method public int describeContents();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.ExtractedTextRequest> CREATOR;
    field public int flags;
    field public int hintMaxChars;
    field public int hintMaxLines;
    field public int token;
  }

  public final class InputBinding implements android.os.Parcelable {
    ctor public InputBinding(android.view.inputmethod.InputConnection, android.os.IBinder, int, int);
    ctor public InputBinding(android.view.inputmethod.InputConnection, android.view.inputmethod.InputBinding);
    method public int describeContents();
    method public android.view.inputmethod.InputConnection getConnection();
    method public android.os.IBinder getConnectionToken();
    method public int getPid();
    method public int getUid();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputBinding> CREATOR;
  }

  public interface InputConnection {
    method public boolean beginBatchEdit();
    method public boolean clearMetaKeyStates(int);
    method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
    method public boolean commitText(CharSequence, int);
    method public boolean deleteSurroundingText(int, int);
    method public boolean endBatchEdit();
    method public boolean finishComposingText();
    method public int getCursorCapsMode(int);
    method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
    method public CharSequence getTextAfterCursor(int, int);
    method public CharSequence getTextBeforeCursor(int, int);
    method public boolean performContextMenuAction(int);
    method public boolean performEditorAction(int);
    method public boolean performPrivateCommand(String, android.os.Bundle);
    method public boolean reportFullscreenMode(boolean);
    method public boolean sendKeyEvent(android.view.KeyEvent);
    method public boolean setComposingText(CharSequence, int);
    method public boolean setSelection(int, int);
    field public static final int GET_EXTRACTED_TEXT_MONITOR = 1; // 0x1
    field public static final int GET_TEXT_WITH_STYLES = 1; // 0x1
  }

  public class InputConnectionWrapper implements android.view.inputmethod.InputConnection {
    ctor public InputConnectionWrapper(android.view.inputmethod.InputConnection, boolean);
    method public boolean beginBatchEdit();
    method public boolean clearMetaKeyStates(int);
    method public boolean commitCompletion(android.view.inputmethod.CompletionInfo);
    method public boolean commitText(CharSequence, int);
    method public boolean deleteSurroundingText(int, int);
    method public boolean endBatchEdit();
    method public boolean finishComposingText();
    method public int getCursorCapsMode(int);
    method public android.view.inputmethod.ExtractedText getExtractedText(android.view.inputmethod.ExtractedTextRequest, int);
    method public CharSequence getTextAfterCursor(int, int);
    method public CharSequence getTextBeforeCursor(int, int);
    method public boolean performContextMenuAction(int);
    method public boolean performEditorAction(int);
    method public boolean performPrivateCommand(String, android.os.Bundle);
    method public boolean reportFullscreenMode(boolean);
    method public boolean sendKeyEvent(android.view.KeyEvent);
    method public boolean setComposingText(CharSequence, int);
    method public boolean setSelection(int, int);
    method public void setTarget(android.view.inputmethod.InputConnection);
  }

  public interface InputMethod {
    method public void attachToken(android.os.IBinder);
    method public void bindInput(android.view.inputmethod.InputBinding);
    method public void createSession(android.view.inputmethod.InputMethod.SessionCallback);
    method public void hideSoftInput(int, android.os.ResultReceiver);
    method public void restartInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
    method public void revokeSession(android.view.inputmethod.InputMethodSession);
    method public void setSessionEnabled(android.view.inputmethod.InputMethodSession, boolean);
    method public void showSoftInput(int, android.os.ResultReceiver);
    method public void startInput(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
    method public void unbindInput();
    field public static final String SERVICE_INTERFACE = "android.view.InputMethod";
    field public static final String SERVICE_META_DATA = "android.view.im";
    field public static final int SHOW_EXPLICIT = 1; // 0x1
    field public static final int SHOW_FORCED = 2; // 0x2
  }

  public static interface InputMethod.SessionCallback {
    method public void sessionCreated(android.view.inputmethod.InputMethodSession);
  }

  public final class InputMethodInfo implements android.os.Parcelable {
    ctor public InputMethodInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    ctor public InputMethodInfo(String, String, CharSequence, String);
    method public int describeContents();
    method public void dump(android.util.Printer, String);
    method public android.content.ComponentName getComponent();
    method public String getId();
    method public int getIsDefaultResourceId();
    method public String getPackageName();
    method public android.content.pm.ServiceInfo getServiceInfo();
    method public String getServiceName();
    method public String getSettingsActivity();
    method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager);
    method public CharSequence loadLabel(android.content.pm.PackageManager);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.inputmethod.InputMethodInfo> CREATOR;
  }

  public final class InputMethodManager {
    method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
    method public java.util.List<android.view.inputmethod.InputMethodInfo> getEnabledInputMethodList();
    method public java.util.List<android.view.inputmethod.InputMethodInfo> getInputMethodList();
    method public void hideSoftInputFromInputMethod(android.os.IBinder, int);
    method public boolean hideSoftInputFromWindow(android.os.IBinder, int);
    method public boolean hideSoftInputFromWindow(android.os.IBinder, int, android.os.ResultReceiver);
    method public void hideStatusIcon(android.os.IBinder);
    method public boolean isAcceptingText();
    method public boolean isActive(android.view.View);
    method public boolean isActive();
    method public boolean isFullscreenMode();
    method public boolean isWatchingCursor(android.view.View);
    method public void restartInput(android.view.View);
    method public void sendAppPrivateCommand(android.view.View, String, android.os.Bundle);
    method public void setInputMethod(android.os.IBinder, String);
    method public void showInputMethodPicker();
    method public boolean showSoftInput(android.view.View, int);
    method public boolean showSoftInput(android.view.View, int, android.os.ResultReceiver);
    method public void showSoftInputFromInputMethod(android.os.IBinder, int);
    method public void showStatusIcon(android.os.IBinder, String, int);
    method public void toggleSoftInput(int, int);
    method public void toggleSoftInputFromWindow(android.os.IBinder, int, int);
    method public void updateCursor(android.view.View, int, int, int, int);
    method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
    method public void updateSelection(android.view.View, int, int, int, int);
    field public static final int HIDE_IMPLICIT_ONLY = 1; // 0x1
    field public static final int HIDE_NOT_ALWAYS = 2; // 0x2
    field public static final int RESULT_HIDDEN = 3; // 0x3
    field public static final int RESULT_SHOWN = 2; // 0x2
    field public static final int RESULT_UNCHANGED_HIDDEN = 1; // 0x1
    field public static final int RESULT_UNCHANGED_SHOWN = 0; // 0x0
    field public static final int SHOW_FORCED = 2; // 0x2
    field public static final int SHOW_IMPLICIT = 1; // 0x1
  }

  public interface InputMethodSession {
    method public void appPrivateCommand(String, android.os.Bundle);
    method public void dispatchKeyEvent(int, android.view.KeyEvent, android.view.inputmethod.InputMethodSession.EventCallback);
    method public void dispatchTrackballEvent(int, android.view.MotionEvent, android.view.inputmethod.InputMethodSession.EventCallback);
    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
    method public void finishInput();
    method public void toggleSoftInput(int, int);
    method public void updateCursor(android.graphics.Rect);
    method public void updateExtractedText(int, android.view.inputmethod.ExtractedText);
    method public void updateSelection(int, int, int, int, int, int);
  }

  public static interface InputMethodSession.EventCallback {
    method public void finishedEvent(int, boolean);
  }

}

package android.webkit {

  public final class CacheManager {
    ctor public CacheManager();
    method public static boolean cacheDisabled();
    method public static boolean endCacheTransaction();
    method public static android.webkit.CacheManager.CacheResult getCacheFile(String, java.util.Map<java.lang.String,java.lang.String>);
    method public static java.io.File getCacheFileBaseDir();
    method public static void saveCacheFile(String, android.webkit.CacheManager.CacheResult);
    method public static boolean startCacheTransaction();
  }

  public static class CacheManager.CacheResult {
    ctor public CacheManager.CacheResult();
    method public long getContentLength();
    method public String getETag();
    method public String getEncoding();
    method public long getExpires();
    method public int getHttpStatusCode();
    method public java.io.InputStream getInputStream();
    method public String getLastModified();
    method public String getLocalPath();
    method public String getLocation();
    method public String getMimeType();
    method public java.io.OutputStream getOutputStream();
    method public void setEncoding(String);
    method public void setInputStream(java.io.InputStream);
  }

  public final class CookieManager {
    method public boolean acceptCookie();
    method public String getCookie(String);
    method public static android.webkit.CookieManager getInstance();
    method public boolean hasCookies();
    method public void removeAllCookie();
    method public void removeExpiredCookie();
    method public void removeSessionCookie();
    method public void setAcceptCookie(boolean);
    method public void setCookie(String, String);
  }

  public final class CookieSyncManager implements java.lang.Runnable {
    method public static android.webkit.CookieSyncManager createInstance(android.content.Context);
    method public static android.webkit.CookieSyncManager getInstance();
    method public void resetSync();
    method public void run();
    method public void startSync();
    method public void stopSync();
    method public void sync();
    method protected void syncFromRamToFlash();
  }

  public class DateSorter {
    ctor public DateSorter(android.content.Context);
    method public long getBoundary(int);
    method public int getIndex(long);
    method public String getLabel(int);
    field public static final int DAY_COUNT = 5; // 0x5
  }

  public interface DownloadListener {
    method public void onDownloadStart(String, String, String, String, long);
  }

  public class HttpAuthHandler extends android.os.Handler {
    method public void cancel();
    method public void proceed(String, String);
    method public boolean useHttpAuthUsernamePassword();
  }

  public class JsPromptResult extends android.webkit.JsResult {
    method public void confirm(String);
  }

  public class JsResult {
    method public final void cancel();
    method public final void confirm();
    method protected final void wakeUp();
    field protected final android.webkit.CallbackProxy mProxy;
    field protected boolean mResult;
  }

  public class MimeTypeMap {
    method public String getExtensionFromMimeType(String);
    method public static String getFileExtensionFromUrl(String);
    method public String getMimeTypeFromExtension(String);
    method public static android.webkit.MimeTypeMap getSingleton();
    method public boolean hasExtension(String);
    method public boolean hasMimeType(String);
  }

  public class Plugin {
    ctor public Plugin(String, String, String, String);
    method public void dispatchClickEvent(android.content.Context);
    method public String getDescription();
    method public String getFileName();
    method public String getName();
    method public String getPath();
    method public void setClickHandler(android.webkit.Plugin.PreferencesClickHandler);
    method public void setDescription(String);
    method public void setFileName(String);
    method public void setName(String);
    method public void setPath(String);
  }

  public static interface Plugin.PreferencesClickHandler {
    method public void handleClickEvent(android.content.Context);
  }

  public final class PluginData {
    ctor public PluginData(java.io.InputStream, long, java.util.Map<java.lang.String,java.lang.String[]>, int);
    method public long getContentLength();
    method public java.util.Map<java.lang.String,java.lang.String[]> getHeaders();
    method public java.io.InputStream getInputStream();
    method public int getStatusCode();
  }

  public class PluginList {
    ctor public PluginList();
    method public void addPlugin(android.webkit.Plugin);
    method public void clear();
    method public java.util.List getList();
    method public void pluginClicked(android.content.Context, int);
    method public void removePlugin(android.webkit.Plugin);
  }

  public class SslErrorHandler extends android.os.Handler {
    method public void cancel();
    method public void proceed();
  }

  public final class URLUtil {
    ctor public URLUtil();
    method public static String composeSearchUrl(String, String, String);
    method public static byte[] decode(byte[]) throws java.lang.IllegalArgumentException;
    method public static String guessFileName(String, String, String);
    method public static String guessUrl(String);
    method public static boolean isAboutUrl(String);
    method public static boolean isAssetUrl(String);
    method public static boolean isContentUrl(String);
    method public static boolean isCookielessProxyUrl(String);
    method public static boolean isDataUrl(String);
    method public static boolean isFileUrl(String);
    method public static boolean isHttpUrl(String);
    method public static boolean isHttpsUrl(String);
    method public static boolean isJavaScriptUrl(String);
    method public static boolean isNetworkUrl(String);
    method public static boolean isValidUrl(String);
    method public static String stripAnchor(String);
  }

  public interface UrlInterceptHandler {
    method public android.webkit.PluginData getPluginData(String, java.util.Map<java.lang.String,java.lang.String>);
    method public android.webkit.CacheManager.CacheResult service(String, java.util.Map<java.lang.String,java.lang.String>);
  }

  public final class UrlInterceptRegistry {
    ctor public UrlInterceptRegistry();
    method public static android.webkit.PluginData getPluginData(String, java.util.Map<java.lang.String,java.lang.String>);
    method public static android.webkit.CacheManager.CacheResult getSurrogate(String, java.util.Map<java.lang.String,java.lang.String>);
    method public static boolean registerHandler(android.webkit.UrlInterceptHandler);
    method public static void setUrlInterceptDisabled(boolean);
    method public static boolean unregisterHandler(android.webkit.UrlInterceptHandler);
    method public static boolean urlInterceptDisabled();
  }

  public class WebBackForwardList implements java.lang.Cloneable java.io.Serializable {
    method protected android.webkit.WebBackForwardList clone();
    method public int getCurrentIndex();
    method public android.webkit.WebHistoryItem getCurrentItem();
    method public android.webkit.WebHistoryItem getItemAtIndex(int);
    method public int getSize();
  }

  public class WebChromeClient {
    ctor public WebChromeClient();
    method public void onCloseWindow(android.webkit.WebView);
    method public boolean onCreateWindow(android.webkit.WebView, boolean, boolean, android.os.Message);
    method public boolean onJsAlert(android.webkit.WebView, String, String, android.webkit.JsResult);
    method public boolean onJsBeforeUnload(android.webkit.WebView, String, String, android.webkit.JsResult);
    method public boolean onJsConfirm(android.webkit.WebView, String, String, android.webkit.JsResult);
    method public boolean onJsPrompt(android.webkit.WebView, String, String, String, android.webkit.JsPromptResult);
    method public void onProgressChanged(android.webkit.WebView, int);
    method public void onReceivedIcon(android.webkit.WebView, android.graphics.Bitmap);
    method public void onReceivedTitle(android.webkit.WebView, String);
    method public void onRequestFocus(android.webkit.WebView);
  }

  public class WebHistoryItem implements java.lang.Cloneable {
    method protected android.webkit.WebHistoryItem clone();
    method public android.graphics.Bitmap getFavicon();
    method public int getId();
    method public String getOriginalUrl();
    method public String getTitle();
    method public String getUrl();
  }

  public final class WebIconDatabase {
    method public void close();
    method public static android.webkit.WebIconDatabase getInstance();
    method public void open(String);
    method public void releaseIconForPageUrl(String);
    method public void removeAllIcons();
    method public void requestIconForPageUrl(String, android.webkit.WebIconDatabase.IconListener);
    method public void retainIconForPageUrl(String);
  }

  public static interface WebIconDatabase.IconListener {
    method public void onReceivedIcon(String, android.graphics.Bitmap);
  }

  public class WebSettings {
    method public boolean getAllowFileAccess();
    method public boolean getBlockNetworkImage();
    method public boolean getBuiltInZoomControls();
    method public int getCacheMode();
    method public String getCursiveFontFamily();
    method public int getDefaultFixedFontSize();
    method public int getDefaultFontSize();
    method public String getDefaultTextEncodingName();
    method public String getFantasyFontFamily();
    method public String getFixedFontFamily();
    method public boolean getJavaScriptCanOpenWindowsAutomatically();
    method public boolean getJavaScriptEnabled();
    method public android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm();
    method public boolean getLightTouchEnabled();
    method public boolean getLoadsImagesAutomatically();
    method public int getMinimumFontSize();
    method public int getMinimumLogicalFontSize();
    method public boolean getNavDump();
    method public boolean getPluginsEnabled();
    method public String getPluginsPath();
    method public String getSansSerifFontFamily();
    method public boolean getSaveFormData();
    method public boolean getSavePassword();
    method public String getSerifFontFamily();
    method public String getStandardFontFamily();
    method public android.webkit.WebSettings.TextSize getTextSize();
    method public boolean getUseDoubleTree();
    method public boolean getUseWideViewPort();
    method public int getUserAgent();
    method public String getUserAgentString();
    method public void setAllowFileAccess(boolean);
    method public void setBlockNetworkImage(boolean);
    method public void setBuiltInZoomControls(boolean);
    method public void setCacheMode(int);
    method public void setCursiveFontFamily(String);
    method public void setDefaultFixedFontSize(int);
    method public void setDefaultFontSize(int);
    method public void setDefaultTextEncodingName(String);
    method public void setFantasyFontFamily(String);
    method public void setFixedFontFamily(String);
    method public void setJavaScriptCanOpenWindowsAutomatically(boolean);
    method public void setJavaScriptEnabled(boolean);
    method public void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm);
    method public void setLightTouchEnabled(boolean);
    method public void setLoadsImagesAutomatically(boolean);
    method public void setMinimumFontSize(int);
    method public void setMinimumLogicalFontSize(int);
    method public void setNavDump(boolean);
    method public void setNeedInitialFocus(boolean);
    method public void setPluginsEnabled(boolean);
    method public void setPluginsPath(String);
    method public void setRenderPriority(android.webkit.WebSettings.RenderPriority);
    method public void setSansSerifFontFamily(String);
    method public void setSaveFormData(boolean);
    method public void setSavePassword(boolean);
    method public void setSerifFontFamily(String);
    method public void setStandardFontFamily(String);
    method public void setSupportMultipleWindows(boolean);
    method public void setSupportZoom(boolean);
    method public void setTextSize(android.webkit.WebSettings.TextSize);
    method public void setUseDoubleTree(boolean);
    method public void setUseWideViewPort(boolean);
    method public void setUserAgent(int);
    method public void setUserAgentString(String);
    method public boolean supportMultipleWindows();
    method public boolean supportZoom();
    field public static final int LOAD_CACHE_ELSE_NETWORK = 1; // 0x1
    field public static final int LOAD_CACHE_ONLY = 3; // 0x3
    field public static final int LOAD_DEFAULT = -1; // 0xffffffff
    field public static final int LOAD_NORMAL = 0; // 0x0
    field public static final int LOAD_NO_CACHE = 2; // 0x2
  }

  public enum WebSettings.LayoutAlgorithm {
    enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NARROW_COLUMNS;
    enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NORMAL;
    enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN;
  }

  public enum WebSettings.RenderPriority {
    enum_constant public static final android.webkit.WebSettings.RenderPriority HIGH;
    enum_constant public static final android.webkit.WebSettings.RenderPriority LOW;
    enum_constant public static final android.webkit.WebSettings.RenderPriority NORMAL;
  }

  public enum WebSettings.TextSize {
    enum_constant public static final android.webkit.WebSettings.TextSize LARGER;
    enum_constant public static final android.webkit.WebSettings.TextSize LARGEST;
    enum_constant public static final android.webkit.WebSettings.TextSize NORMAL;
    enum_constant public static final android.webkit.WebSettings.TextSize SMALLER;
    enum_constant public static final android.webkit.WebSettings.TextSize SMALLEST;
  }

  public class WebView extends android.widget.AbsoluteLayout implements android.view.ViewGroup.OnHierarchyChangeListener android.view.ViewTreeObserver.OnGlobalFocusChangeListener {
    ctor public WebView(android.content.Context);
    ctor public WebView(android.content.Context, android.util.AttributeSet);
    ctor public WebView(android.content.Context, android.util.AttributeSet, int);
    method public void addJavascriptInterface(Object, String);
    method public boolean canGoBack();
    method public boolean canGoBackOrForward(int);
    method public boolean canGoForward();
    method public android.graphics.Picture capturePicture();
    method public void clearCache(boolean);
    method public void clearFormData();
    method public void clearHistory();
    method public void clearMatches();
    method public void clearSslPreferences();
    method public void clearView();
    method public android.webkit.WebBackForwardList copyBackForwardList();
    method public void debugDump();
    method public void destroy();
    method public static void disablePlatformNotifications();
    method public void documentHasImages(android.os.Message);
    method public static void enablePlatformNotifications();
    method public static String findAddress(String);
    method public int findAll(String);
    method public void findNext(boolean);
    method public void flingScroll(int, int);
    method public android.net.http.SslCertificate getCertificate();
    method public int getContentHeight();
    method public android.graphics.Bitmap getFavicon();
    method public android.webkit.WebView.HitTestResult getHitTestResult();
    method public String[] getHttpAuthUsernamePassword(String, String);
    method public String getOriginalUrl();
    method public static android.webkit.PluginList getPluginList();
    method public int getProgress();
    method public float getScale();
    method public android.webkit.WebSettings getSettings();
    method public String getTitle();
    method public String getUrl();
    method public android.view.View getZoomControls();
    method public void goBack();
    method public void goBackOrForward(int);
    method public void goForward();
    method public void invokeZoomPicker();
    method public void loadData(String, String, String);
    method public void loadDataWithBaseURL(String, String, String, String, String);
    method public void loadUrl(String);
    method public void onChildViewAdded(android.view.View, android.view.View);
    method public void onChildViewRemoved(android.view.View, android.view.View);
    method public void onGlobalFocusChanged(android.view.View, android.view.View);
    method public boolean overlayHorizontalScrollbar();
    method public boolean overlayVerticalScrollbar();
    method public boolean pageDown(boolean);
    method public boolean pageUp(boolean);
    method public void pauseTimers();
    method public void refreshPlugins(boolean);
    method public void reload();
    method public void requestFocusNodeHref(android.os.Message);
    method public void requestImageRef(android.os.Message);
    method public boolean restorePicture(android.os.Bundle, java.io.File);
    method public android.webkit.WebBackForwardList restoreState(android.os.Bundle);
    method public void resumeTimers();
    method public void savePassword(String, String, String);
    method public boolean savePicture(android.os.Bundle, java.io.File);
    method public android.webkit.WebBackForwardList saveState(android.os.Bundle);
    method public void setCertificate(android.net.http.SslCertificate);
    method public void setDownloadListener(android.webkit.DownloadListener);
    method public void setHorizontalScrollbarOverlay(boolean);
    method public void setHttpAuthUsernamePassword(String, String, String, String);
    method public void setInitialScale(int);
    method public void setMapTrackballToArrowKeys(boolean);
    method public void setNetworkAvailable(boolean);
    method public void setPictureListener(android.webkit.WebView.PictureListener);
    method public void setVerticalScrollbarOverlay(boolean);
    method public void setWebChromeClient(android.webkit.WebChromeClient);
    method public void setWebViewClient(android.webkit.WebViewClient);
    method public void stopLoading();
    method public boolean zoomIn();
    method public boolean zoomOut();
    field public static final String SCHEME_GEO = "geo:0,0?q=";
    field public static final String SCHEME_MAILTO = "mailto:";
    field public static final String SCHEME_TEL = "tel:";
  }

  public class WebView.HitTestResult {
    method public String getExtra();
    method public int getType();
    field public static final int ANCHOR_TYPE = 1; // 0x1
    field public static final int EDIT_TEXT_TYPE = 9; // 0x9
    field public static final int EMAIL_TYPE = 4; // 0x4
    field public static final int GEO_TYPE = 3; // 0x3
    field public static final int IMAGE_ANCHOR_TYPE = 6; // 0x6
    field public static final int IMAGE_TYPE = 5; // 0x5
    field public static final int PHONE_TYPE = 2; // 0x2
    field public static final int SRC_ANCHOR_TYPE = 7; // 0x7
    field public static final int SRC_IMAGE_ANCHOR_TYPE = 8; // 0x8
    field public static final int UNKNOWN_TYPE = 0; // 0x0
  }

  public static interface WebView.PictureListener {
    method public void onNewPicture(android.webkit.WebView, android.graphics.Picture);
  }

  public class WebView.WebViewTransport {
    ctor public WebView.WebViewTransport();
    method public android.webkit.WebView getWebView();
    method public void setWebView(android.webkit.WebView);
  }

  public class WebViewClient {
    ctor public WebViewClient();
    method public void doUpdateVisitedHistory(android.webkit.WebView, String, boolean);
    method public void onFormResubmission(android.webkit.WebView, android.os.Message, android.os.Message);
    method public void onLoadResource(android.webkit.WebView, String);
    method public void onPageFinished(android.webkit.WebView, String);
    method public void onPageStarted(android.webkit.WebView, String, android.graphics.Bitmap);
    method public void onReceivedError(android.webkit.WebView, int, String, String);
    method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, String, String);
    method public void onScaleChanged(android.webkit.WebView, float, float);
    method public void onTooManyRedirects(android.webkit.WebView, android.os.Message, android.os.Message);
    method public void onUnhandledKeyEvent(android.webkit.WebView, android.view.KeyEvent);
    method public boolean shouldOverrideKeyEvent(android.webkit.WebView, android.view.KeyEvent);
    method public boolean shouldOverrideUrlLoading(android.webkit.WebView, String);
  }

  public class WebViewDatabase {
    method public void clearFormData();
    method public void clearHttpAuthUsernamePassword();
    method public void clearUsernamePassword();
    method public static android.webkit.WebViewDatabase getInstance(android.content.Context);
    method public boolean hasFormData();
    method public boolean hasHttpAuthUsernamePassword();
    method public boolean hasUsernamePassword();
    field protected static final String LOGTAG = "webviewdatabase";
  }

}

package android.widget {

  public abstract class AbsListView extends android.widget.AdapterView<android.widget.ListAdapter> implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener {
    ctor public AbsListView(android.content.Context);
    ctor public AbsListView(android.content.Context, android.util.AttributeSet);
    ctor public AbsListView(android.content.Context, android.util.AttributeSet, int);
    method public void afterTextChanged(android.text.Editable);
    method public void beforeTextChanged(CharSequence, int, int, int);
    method public void clearTextFilter();
    method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public int getCacheColorHint();
    method public int getListPaddingBottom();
    method public int getListPaddingLeft();
    method public int getListPaddingRight();
    method public int getListPaddingTop();
    method public android.view.View getSelectedView();
    method public android.graphics.drawable.Drawable getSelector();
    method public CharSequence getTextFilter();
    method public int getTranscriptMode();
    method protected void handleDataChanged();
    method public boolean hasTextFilter();
    method public void invalidateViews();
    method public boolean isFastScrollEnabled();
    method protected boolean isInFilterMode();
    method public boolean isScrollingCacheEnabled();
    method public boolean isSmoothScrollbarEnabled();
    method public boolean isStackFromBottom();
    method public boolean isTextFilterEnabled();
    method protected void layoutChildren();
    method public void onFilterComplete(int);
    method public void onGlobalLayout();
    method public void onRestoreInstanceState(android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState();
    method public void onTextChanged(CharSequence, int, int, int);
    method public void onTouchModeChanged(boolean);
    method public int pointToPosition(int, int);
    method public long pointToRowId(int, int);
    method public void reclaimViews(java.util.List<android.view.View>);
    method public void setCacheColorHint(int);
    method public void setDrawSelectorOnTop(boolean);
    method public void setFastScrollEnabled(boolean);
    method public void setFilterText(String);
    method public void setOnScrollListener(android.widget.AbsListView.OnScrollListener);
    method public void setRecyclerListener(android.widget.AbsListView.RecyclerListener);
    method public void setScrollIndicators(android.view.View, android.view.View);
    method public void setScrollingCacheEnabled(boolean);
    method public void setSelector(int);
    method public void setSelector(android.graphics.drawable.Drawable);
    method public void setSmoothScrollbarEnabled(boolean);
    method public void setStackFromBottom(boolean);
    method public void setTextFilterEnabled(boolean);
    method public void setTranscriptMode(int);
    method public boolean verifyDrawable(android.graphics.drawable.Drawable);
    field public static final int TRANSCRIPT_MODE_ALWAYS_SCROLL = 2; // 0x2
    field public static final int TRANSCRIPT_MODE_DISABLED = 0; // 0x0
    field public static final int TRANSCRIPT_MODE_NORMAL = 1; // 0x1
  }

  public static class AbsListView.LayoutParams extends android.view.ViewGroup.LayoutParams {
    ctor public AbsListView.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public AbsListView.LayoutParams(int, int);
    ctor public AbsListView.LayoutParams(int, int, int);
    ctor public AbsListView.LayoutParams(android.view.ViewGroup.LayoutParams);
  }

  public static interface AbsListView.OnScrollListener {
    method public void onScroll(android.widget.AbsListView, int, int, int);
    method public void onScrollStateChanged(android.widget.AbsListView, int);
    field public static final int SCROLL_STATE_FLING = 2; // 0x2
    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
    field public static final int SCROLL_STATE_TOUCH_SCROLL = 1; // 0x1
  }

  public static interface AbsListView.RecyclerListener {
    method public void onMovedToScrapHeap(android.view.View);
  }

  public abstract class AbsSeekBar extends android.widget.ProgressBar {
    ctor public AbsSeekBar(android.content.Context);
    ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet);
    ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int);
    method public int getKeyProgressIncrement();
    method public int getThumbOffset();
    method public void setKeyProgressIncrement(int);
    method public void setThumb(android.graphics.drawable.Drawable);
    method public void setThumbOffset(int);
  }

  public abstract class AbsSpinner extends android.widget.AdapterView<android.widget.SpinnerAdapter> {
    ctor public AbsSpinner(android.content.Context);
    ctor public AbsSpinner(android.content.Context, android.util.AttributeSet);
    ctor public AbsSpinner(android.content.Context, android.util.AttributeSet, int);
    method public android.widget.SpinnerAdapter getAdapter();
    method public android.view.View getSelectedView();
    method public void onRestoreInstanceState(android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState();
    method public int pointToPosition(int, int);
    method public void setAdapter(android.widget.SpinnerAdapter);
    method public void setSelection(int, boolean);
    method public void setSelection(int);
  }

  @Deprecated @android.widget.RemoteViews.RemoteView public class AbsoluteLayout extends android.view.ViewGroup {
    ctor public AbsoluteLayout(android.content.Context);
    ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet);
    ctor public AbsoluteLayout(android.content.Context, android.util.AttributeSet, int);
  }

  public static class AbsoluteLayout.LayoutParams extends android.view.ViewGroup.LayoutParams {
    ctor public AbsoluteLayout.LayoutParams(int, int, int, int);
    ctor public AbsoluteLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public AbsoluteLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    method public String debug(String);
    field public int x;
    field public int y;
  }

  public interface Adapter {
    method public int getCount();
    method public Object getItem(int);
    method public long getItemId(int);
    method public int getItemViewType(int);
    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
    method public int getViewTypeCount();
    method public boolean hasStableIds();
    method public boolean isEmpty();
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
    field public static final int IGNORE_ITEM_VIEW_TYPE = -1; // 0xffffffff
    field public static final int NO_SELECTION = -2147483648; // 0x80000000
  }

  public abstract class AdapterView<T extends android.widget.Adapter> extends android.view.ViewGroup {
    ctor public AdapterView(android.content.Context);
    ctor public AdapterView(android.content.Context, android.util.AttributeSet);
    ctor public AdapterView(android.content.Context, android.util.AttributeSet, int);
    method public abstract T getAdapter();
    method public int getCount();
    method public android.view.View getEmptyView();
    method public int getFirstVisiblePosition();
    method public Object getItemAtPosition(int);
    method public long getItemIdAtPosition(int);
    method public int getLastVisiblePosition();
    method public final android.widget.AdapterView.OnItemClickListener getOnItemClickListener();
    method public final android.widget.AdapterView.OnItemLongClickListener getOnItemLongClickListener();
    method public final android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener();
    method public int getPositionForView(android.view.View);
    method public Object getSelectedItem();
    method public long getSelectedItemId();
    method public int getSelectedItemPosition();
    method public abstract android.view.View getSelectedView();
    method public boolean performItemClick(android.view.View, int, long);
    method public abstract void setAdapter(T);
    method public void setEmptyView(android.view.View);
    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
    method public void setOnItemLongClickListener(android.widget.AdapterView.OnItemLongClickListener);
    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
    method public abstract void setSelection(int);
    field public static final int INVALID_POSITION = -1; // 0xffffffff
    field public static final long INVALID_ROW_ID = -9223372036854775808L; // 0x8000000000000000L
    field public static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -2; // 0xfffffffe
    field public static final int ITEM_VIEW_TYPE_IGNORE = -1; // 0xffffffff
  }

  public static class AdapterView.AdapterContextMenuInfo implements android.view.ContextMenu.ContextMenuInfo {
    ctor public AdapterView.AdapterContextMenuInfo(android.view.View, int, long);
    field public long id;
    field public int position;
    field public android.view.View targetView;
  }

  public static interface AdapterView.OnItemClickListener {
    method public void onItemClick(android.widget.AdapterView<?>, android.view.View, int, long);
  }

  public static interface AdapterView.OnItemLongClickListener {
    method public boolean onItemLongClick(android.widget.AdapterView<?>, android.view.View, int, long);
  }

  public static interface AdapterView.OnItemSelectedListener {
    method public void onItemSelected(android.widget.AdapterView<?>, android.view.View, int, long);
    method public void onNothingSelected(android.widget.AdapterView<?>);
  }

  public class AlphabetIndexer extends android.database.DataSetObserver implements android.widget.SectionIndexer {
    ctor public AlphabetIndexer(android.database.Cursor, int, CharSequence);
    method protected int compare(String, String);
    method public int getPositionForSection(int);
    method public int getSectionForPosition(int);
    method public Object[] getSections();
    method public void setCursor(android.database.Cursor);
    field protected CharSequence mAlphabet;
    field protected int mColumnIndex;
    field protected android.database.Cursor mDataCursor;
  }

  @android.widget.RemoteViews.RemoteView public class AnalogClock extends android.view.View {
    ctor public AnalogClock(android.content.Context);
    ctor public AnalogClock(android.content.Context, android.util.AttributeSet);
    ctor public AnalogClock(android.content.Context, android.util.AttributeSet, int);
  }

  public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable {
    ctor public ArrayAdapter(android.content.Context, int);
    ctor public ArrayAdapter(android.content.Context, int, int);
    ctor public ArrayAdapter(android.content.Context, int, T[]);
    ctor public ArrayAdapter(android.content.Context, int, int, T[]);
    ctor public ArrayAdapter(android.content.Context, int, java.util.List<T>);
    ctor public ArrayAdapter(android.content.Context, int, int, java.util.List<T>);
    method public void add(T);
    method public void clear();
    method public static android.widget.ArrayAdapter<java.lang.CharSequence> createFromResource(android.content.Context, int, int);
    method public android.content.Context getContext();
    method public int getCount();
    method public android.widget.Filter getFilter();
    method public T getItem(int);
    method public long getItemId(int);
    method public int getPosition(T);
    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
    method public void insert(T, int);
    method public void remove(T);
    method public void setDropDownViewResource(int);
    method public void setNotifyOnChange(boolean);
    method public void sort(java.util.Comparator<? super T>);
  }

  public class AutoCompleteTextView extends android.widget.EditText implements android.widget.Filter.FilterListener {
    ctor public AutoCompleteTextView(android.content.Context);
    ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet);
    ctor public AutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
    method public void clearListSelection();
    method protected CharSequence convertSelectionToString(Object);
    method public void dismissDropDown();
    method public boolean enoughToFilter();
    method public android.widget.ListAdapter getAdapter();
    method public int getDropDownAnchor();
    method public int getDropDownWidth();
    method protected android.widget.Filter getFilter();
    method public android.widget.AdapterView.OnItemClickListener getItemClickListener();
    method public android.widget.AdapterView.OnItemSelectedListener getItemSelectedListener();
    method public int getListSelection();
    method public android.widget.AdapterView.OnItemClickListener getOnItemClickListener();
    method public android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener();
    method public int getThreshold();
    method public android.widget.AutoCompleteTextView.Validator getValidator();
    method public boolean isPerformingCompletion();
    method public boolean isPopupShowing();
    method public void onFilterComplete(int);
    method public void performCompletion();
    method protected void performFiltering(CharSequence, int);
    method public void performValidation();
    method protected void replaceText(CharSequence);
    method public <T extends android.widget.ListAdapter & android.widget.Filterable> void setAdapter(T);
    method public void setCompletionHint(CharSequence);
    method public void setDropDownAnchor(int);
    method public void setDropDownWidth(int);
    method public void setListSelection(int);
    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
    method public void setThreshold(int);
    method public void setValidator(android.widget.AutoCompleteTextView.Validator);
    method public void showDropDown();
  }

  public static interface AutoCompleteTextView.Validator {
    method public CharSequence fixText(CharSequence);
    method public boolean isValid(CharSequence);
  }

  public abstract class BaseAdapter implements android.widget.ListAdapter android.widget.SpinnerAdapter {
    ctor public BaseAdapter();
    method public boolean areAllItemsEnabled();
    method public android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);
    method public int getItemViewType(int);
    method public int getViewTypeCount();
    method public boolean hasStableIds();
    method public boolean isEmpty();
    method public boolean isEnabled(int);
    method public void notifyDataSetChanged();
    method public void notifyDataSetInvalidated();
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  public abstract class BaseExpandableListAdapter implements android.widget.ExpandableListAdapter {
    ctor public BaseExpandableListAdapter();
    method public boolean areAllItemsEnabled();
    method public long getCombinedChildId(long, long);
    method public long getCombinedGroupId(long);
    method public boolean isEmpty();
    method public void notifyDataSetChanged();
    method public void notifyDataSetInvalidated();
    method public void onGroupCollapsed(int);
    method public void onGroupExpanded(int);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  @android.widget.RemoteViews.RemoteView public class Button extends android.widget.TextView {
    ctor public Button(android.content.Context);
    ctor public Button(android.content.Context, android.util.AttributeSet);
    ctor public Button(android.content.Context, android.util.AttributeSet, int);
  }

  public class CheckBox extends android.widget.CompoundButton {
    ctor public CheckBox(android.content.Context);
    ctor public CheckBox(android.content.Context, android.util.AttributeSet);
    ctor public CheckBox(android.content.Context, android.util.AttributeSet, int);
  }

  public interface Checkable {
    method public boolean isChecked();
    method public void setChecked(boolean);
    method public void toggle();
  }

  public abstract class CheckedTextView extends android.widget.TextView implements android.widget.Checkable {
    ctor public CheckedTextView(android.content.Context);
    ctor public CheckedTextView(android.content.Context, android.util.AttributeSet);
    ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int);
    method public boolean isChecked();
    method public void setCheckMarkDrawable(int);
    method public void setCheckMarkDrawable(android.graphics.drawable.Drawable);
    method public void setChecked(boolean);
    method public void toggle();
  }

  @android.widget.RemoteViews.RemoteView public class Chronometer extends android.widget.TextView {
    ctor public Chronometer(android.content.Context);
    ctor public Chronometer(android.content.Context, android.util.AttributeSet);
    ctor public Chronometer(android.content.Context, android.util.AttributeSet, int);
    method public long getBase();
    method public String getFormat();
    method public android.widget.Chronometer.OnChronometerTickListener getOnChronometerTickListener();
    method public void setBase(long);
    method public void setFormat(String);
    method public void setOnChronometerTickListener(android.widget.Chronometer.OnChronometerTickListener);
    method public void start();
    method public void stop();
  }

  public static interface Chronometer.OnChronometerTickListener {
    method public void onChronometerTick(android.widget.Chronometer);
  }

  public abstract class CompoundButton extends android.widget.Button implements android.widget.Checkable {
    ctor public CompoundButton(android.content.Context);
    ctor public CompoundButton(android.content.Context, android.util.AttributeSet);
    ctor public CompoundButton(android.content.Context, android.util.AttributeSet, int);
    method public boolean isChecked();
    method public void setButtonDrawable(int);
    method public void setButtonDrawable(android.graphics.drawable.Drawable);
    method public void setChecked(boolean);
    method public void setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener);
    method public void toggle();
  }

  public static interface CompoundButton.OnCheckedChangeListener {
    method public void onCheckedChanged(android.widget.CompoundButton, boolean);
  }

  public abstract class CursorAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
    ctor public CursorAdapter(android.content.Context, android.database.Cursor);
    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
    method public void changeCursor(android.database.Cursor);
    method public CharSequence convertToString(android.database.Cursor);
    method public int getCount();
    method public android.database.Cursor getCursor();
    method public android.widget.Filter getFilter();
    method public android.widget.FilterQueryProvider getFilterQueryProvider();
    method public Object getItem(int);
    method public long getItemId(int);
    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
    method protected void init(android.content.Context, android.database.Cursor, boolean);
    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
    method protected void onContentChanged();
    method public android.database.Cursor runQueryOnBackgroundThread(CharSequence);
    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
  }

  public abstract class CursorTreeAdapter extends android.widget.BaseExpandableListAdapter implements android.widget.Filterable {
    ctor public CursorTreeAdapter(android.database.Cursor, android.content.Context);
    ctor public CursorTreeAdapter(android.database.Cursor, android.content.Context, boolean);
    method protected abstract void bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean);
    method protected abstract void bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean);
    method public void changeCursor(android.database.Cursor);
    method public String convertToString(android.database.Cursor);
    method public android.database.Cursor getChild(int, int);
    method public long getChildId(int, int);
    method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
    method public int getChildrenCount(int);
    method protected abstract android.database.Cursor getChildrenCursor(android.database.Cursor);
    method public android.database.Cursor getCursor();
    method public android.widget.Filter getFilter();
    method public android.widget.FilterQueryProvider getFilterQueryProvider();
    method public android.database.Cursor getGroup(int);
    method public int getGroupCount();
    method public long getGroupId(int);
    method public android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
    method public boolean hasStableIds();
    method public boolean isChildSelectable(int, int);
    method protected abstract android.view.View newChildView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
    method protected abstract android.view.View newGroupView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
    method public void notifyDataSetChanged(boolean);
    method public android.database.Cursor runQueryOnBackgroundThread(CharSequence);
    method public void setChildrenCursor(int, android.database.Cursor);
    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
    method public void setGroupCursor(android.database.Cursor);
  }

  public class DatePicker extends android.widget.FrameLayout {
    ctor public DatePicker(android.content.Context);
    ctor public DatePicker(android.content.Context, android.util.AttributeSet);
    ctor public DatePicker(android.content.Context, android.util.AttributeSet, int);
    method public int getDayOfMonth();
    method public int getMonth();
    method public int getYear();
    method public void init(int, int, int, android.widget.DatePicker.OnDateChangedListener);
    method public void updateDate(int, int, int);
  }

  public static interface DatePicker.OnDateChangedListener {
    method public void onDateChanged(android.widget.DatePicker, int, int, int);
  }

  public class DialerFilter extends android.widget.RelativeLayout {
    ctor public DialerFilter(android.content.Context);
    ctor public DialerFilter(android.content.Context, android.util.AttributeSet);
    method public void append(String);
    method public void clearText();
    method public CharSequence getDigits();
    method public CharSequence getFilterText();
    method public CharSequence getLetters();
    method public int getMode();
    method public boolean isQwertyKeyboard();
    method protected void onModeChange(int, int);
    method public void removeFilterWatcher(android.text.TextWatcher);
    method public void setDigitsWatcher(android.text.TextWatcher);
    method public void setFilterWatcher(android.text.TextWatcher);
    method public void setLettersWatcher(android.text.TextWatcher);
    method public void setMode(int);
    field public static final int DIGITS_AND_LETTERS = 1; // 0x1
    field public static final int DIGITS_AND_LETTERS_NO_DIGITS = 2; // 0x2
    field public static final int DIGITS_AND_LETTERS_NO_LETTERS = 3; // 0x3
    field public static final int DIGITS_ONLY = 4; // 0x4
    field public static final int LETTERS_ONLY = 5; // 0x5
  }

  public class DigitalClock extends android.widget.TextView {
    ctor public DigitalClock(android.content.Context);
    ctor public DigitalClock(android.content.Context, android.util.AttributeSet);
  }

  public class EditText extends android.widget.TextView {
    ctor public EditText(android.content.Context);
    ctor public EditText(android.content.Context, android.util.AttributeSet);
    ctor public EditText(android.content.Context, android.util.AttributeSet, int);
    method public void extendSelection(int);
    method public android.text.Editable getText();
    method public void selectAll();
    method public void setSelection(int, int);
    method public void setSelection(int);
  }

  public interface ExpandableListAdapter {
    method public boolean areAllItemsEnabled();
    method public Object getChild(int, int);
    method public long getChildId(int, int);
    method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
    method public int getChildrenCount(int);
    method public long getCombinedChildId(long, long);
    method public long getCombinedGroupId(long);
    method public Object getGroup(int);
    method public int getGroupCount();
    method public long getGroupId(int);
    method public android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
    method public boolean hasStableIds();
    method public boolean isChildSelectable(int, int);
    method public boolean isEmpty();
    method public void onGroupCollapsed(int);
    method public void onGroupExpanded(int);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  public class ExpandableListView extends android.widget.ListView {
    ctor public ExpandableListView(android.content.Context);
    ctor public ExpandableListView(android.content.Context, android.util.AttributeSet);
    ctor public ExpandableListView(android.content.Context, android.util.AttributeSet, int);
    method public boolean collapseGroup(int);
    method public boolean expandGroup(int);
    method public android.widget.ExpandableListAdapter getExpandableListAdapter();
    method public long getExpandableListPosition(int);
    method public int getFlatListPosition(long);
    method public static int getPackedPositionChild(long);
    method public static long getPackedPositionForChild(int, int);
    method public static long getPackedPositionForGroup(int);
    method public static int getPackedPositionGroup(long);
    method public static int getPackedPositionType(long);
    method public long getSelectedId();
    method public long getSelectedPosition();
    method public boolean isGroupExpanded(int);
    method public void setAdapter(android.widget.ExpandableListAdapter);
    method public void setChildDivider(android.graphics.drawable.Drawable);
    method public void setChildIndicator(android.graphics.drawable.Drawable);
    method public void setChildIndicatorBounds(int, int);
    method public void setGroupIndicator(android.graphics.drawable.Drawable);
    method public void setIndicatorBounds(int, int);
    method public void setOnChildClickListener(android.widget.ExpandableListView.OnChildClickListener);
    method public void setOnGroupClickListener(android.widget.ExpandableListView.OnGroupClickListener);
    method public void setOnGroupCollapseListener(android.widget.ExpandableListView.OnGroupCollapseListener);
    method public void setOnGroupExpandListener(android.widget.ExpandableListView.OnGroupExpandListener);
    method public boolean setSelectedChild(int, int, boolean);
    method public void setSelectedGroup(int);
    field public static final int CHILD_INDICATOR_INHERIT = -1; // 0xffffffff
    field public static final int PACKED_POSITION_TYPE_CHILD = 1; // 0x1
    field public static final int PACKED_POSITION_TYPE_GROUP = 0; // 0x0
    field public static final int PACKED_POSITION_TYPE_NULL = 2; // 0x2
    field public static final long PACKED_POSITION_VALUE_NULL = 4294967295L; // 0xffffffffL
  }

  public static class ExpandableListView.ExpandableListContextMenuInfo implements android.view.ContextMenu.ContextMenuInfo {
    ctor public ExpandableListView.ExpandableListContextMenuInfo(android.view.View, long, long);
    field public long id;
    field public long packedPosition;
    field public android.view.View targetView;
  }

  public static interface ExpandableListView.OnChildClickListener {
    method public boolean onChildClick(android.widget.ExpandableListView, android.view.View, int, int, long);
  }

  public static interface ExpandableListView.OnGroupClickListener {
    method public boolean onGroupClick(android.widget.ExpandableListView, android.view.View, int, long);
  }

  public static interface ExpandableListView.OnGroupCollapseListener {
    method public void onGroupCollapse(int);
  }

  public static interface ExpandableListView.OnGroupExpandListener {
    method public void onGroupExpand(int);
  }

  public abstract class Filter {
    ctor public Filter();
    method public CharSequence convertResultToString(Object);
    method public final void filter(CharSequence);
    method public final void filter(CharSequence, android.widget.Filter.FilterListener);
    method protected abstract android.widget.Filter.FilterResults performFiltering(CharSequence);
    method protected abstract void publishResults(CharSequence, android.widget.Filter.FilterResults);
  }

  public static interface Filter.FilterListener {
    method public void onFilterComplete(int);
  }

  protected static class Filter.FilterResults {
    ctor public Filter.FilterResults();
    field public int count;
    field public Object values;
  }

  public interface FilterQueryProvider {
    method public android.database.Cursor runQuery(CharSequence);
  }

  public interface Filterable {
    method public android.widget.Filter getFilter();
  }

  @android.widget.RemoteViews.RemoteView public class FrameLayout extends android.view.ViewGroup {
    ctor public FrameLayout(android.content.Context);
    ctor public FrameLayout(android.content.Context, android.util.AttributeSet);
    ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
    method protected android.widget.FrameLayout.LayoutParams generateDefaultLayoutParams();
    method public android.widget.FrameLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public boolean getConsiderGoneChildrenWhenMeasuring();
    method public android.graphics.drawable.Drawable getForeground();
    method public void setForeground(android.graphics.drawable.Drawable);
    method public void setForegroundGravity(int);
    method public void setMeasureAllChildren(boolean);
  }

  public static class FrameLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public FrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public FrameLayout.LayoutParams(int, int);
    ctor public FrameLayout.LayoutParams(int, int, int);
    ctor public FrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public FrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    field public int gravity;
  }

  public class Gallery extends android.widget.AbsSpinner implements android.view.GestureDetector.OnGestureListener {
    ctor public Gallery(android.content.Context);
    ctor public Gallery(android.content.Context, android.util.AttributeSet);
    ctor public Gallery(android.content.Context, android.util.AttributeSet, int);
    method public boolean onDown(android.view.MotionEvent);
    method public boolean onFling(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onLongPress(android.view.MotionEvent);
    method public boolean onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float);
    method public void onShowPress(android.view.MotionEvent);
    method public boolean onSingleTapUp(android.view.MotionEvent);
    method public void setAnimationDuration(int);
    method public void setCallbackDuringFling(boolean);
    method public void setGravity(int);
    method public void setSpacing(int);
    method public void setUnselectedAlpha(float);
  }

  public static class Gallery.LayoutParams extends android.view.ViewGroup.LayoutParams {
    ctor public Gallery.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public Gallery.LayoutParams(int, int);
    ctor public Gallery.LayoutParams(android.view.ViewGroup.LayoutParams);
  }

  public class GridView extends android.widget.AbsListView {
    ctor public GridView(android.content.Context);
    ctor public GridView(android.content.Context, android.util.AttributeSet);
    ctor public GridView(android.content.Context, android.util.AttributeSet, int);
    method public android.widget.ListAdapter getAdapter();
    method public int getStretchMode();
    method public void setAdapter(android.widget.ListAdapter);
    method public void setColumnWidth(int);
    method public void setGravity(int);
    method public void setHorizontalSpacing(int);
    method public void setNumColumns(int);
    method public void setSelection(int);
    method public void setStretchMode(int);
    method public void setVerticalSpacing(int);
    field public static final int AUTO_FIT = -1; // 0xffffffff
    field public static final int NO_STRETCH = 0; // 0x0
    field public static final int STRETCH_COLUMN_WIDTH = 2; // 0x2
    field public static final int STRETCH_SPACING = 1; // 0x1
    field public static final int STRETCH_SPACING_UNIFORM = 3; // 0x3
  }

  public class HeaderViewListAdapter implements android.widget.Filterable android.widget.WrapperListAdapter {
    ctor public HeaderViewListAdapter(java.util.ArrayList<android.widget.ListView.FixedViewInfo>, java.util.ArrayList<android.widget.ListView.FixedViewInfo>, android.widget.ListAdapter);
    method public boolean areAllItemsEnabled();
    method public int getCount();
    method public android.widget.Filter getFilter();
    method public int getFootersCount();
    method public int getHeadersCount();
    method public Object getItem(int);
    method public long getItemId(int);
    method public int getItemViewType(int);
    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
    method public int getViewTypeCount();
    method public android.widget.ListAdapter getWrappedAdapter();
    method public boolean hasStableIds();
    method public boolean isEmpty();
    method public boolean isEnabled(int);
    method public void registerDataSetObserver(android.database.DataSetObserver);
    method public boolean removeFooter(android.view.View);
    method public boolean removeHeader(android.view.View);
    method public void unregisterDataSetObserver(android.database.DataSetObserver);
  }

  public class HorizontalScrollView extends android.widget.FrameLayout {
    ctor public HorizontalScrollView(android.content.Context);
    ctor public HorizontalScrollView(android.content.Context, android.util.AttributeSet);
    ctor public HorizontalScrollView(android.content.Context, android.util.AttributeSet, int);
    method public boolean arrowScroll(int);
    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
    method public boolean executeKeyEvent(android.view.KeyEvent);
    method public void fling(int);
    method public boolean fullScroll(int);
    method public int getMaxScrollAmount();
    method public boolean isFillViewport();
    method public boolean isSmoothScrollingEnabled();
    method public boolean pageScroll(int);
    method public void setFillViewport(boolean);
    method public void setSmoothScrollingEnabled(boolean);
    method public final void smoothScrollBy(int, int);
    method public final void smoothScrollTo(int, int);
  }

  @android.widget.RemoteViews.RemoteView public class ImageButton extends android.widget.ImageView {
    ctor public ImageButton(android.content.Context);
    ctor public ImageButton(android.content.Context, android.util.AttributeSet);
    ctor public ImageButton(android.content.Context, android.util.AttributeSet, int);
  }

  public class ImageSwitcher extends android.widget.ViewSwitcher {
    ctor public ImageSwitcher(android.content.Context);
    ctor public ImageSwitcher(android.content.Context, android.util.AttributeSet);
    method public void setImageDrawable(android.graphics.drawable.Drawable);
    method public void setImageResource(int);
    method public void setImageURI(android.net.Uri);
  }

  @android.widget.RemoteViews.RemoteView public class ImageView extends android.view.View {
    ctor public ImageView(android.content.Context);
    ctor public ImageView(android.content.Context, android.util.AttributeSet);
    ctor public ImageView(android.content.Context, android.util.AttributeSet, int);
    method public final void clearColorFilter();
    method public android.graphics.drawable.Drawable getDrawable();
    method public android.graphics.Matrix getImageMatrix();
    method public android.widget.ImageView.ScaleType getScaleType();
    method public int[] onCreateDrawableState(int);
    method public void setAdjustViewBounds(boolean);
    method public void setAlpha(int);
    method public final void setColorFilter(int, android.graphics.PorterDuff.Mode);
    method public void setColorFilter(android.graphics.ColorFilter);
    method protected boolean setFrame(int, int, int, int);
    method public void setImageBitmap(android.graphics.Bitmap);
    method public void setImageDrawable(android.graphics.drawable.Drawable);
    method public void setImageLevel(int);
    method public void setImageMatrix(android.graphics.Matrix);
    method public void setImageResource(int);
    method public void setImageState(int[], boolean);
    method public void setImageURI(android.net.Uri);
    method public void setMaxHeight(int);
    method public void setMaxWidth(int);
    method public void setScaleType(android.widget.ImageView.ScaleType);
  }

  public enum ImageView.ScaleType {
    enum_constant public static final android.widget.ImageView.ScaleType CENTER;
    enum_constant public static final android.widget.ImageView.ScaleType CENTER_CROP;
    enum_constant public static final android.widget.ImageView.ScaleType CENTER_INSIDE;
    enum_constant public static final android.widget.ImageView.ScaleType FIT_CENTER;
    enum_constant public static final android.widget.ImageView.ScaleType FIT_END;
    enum_constant public static final android.widget.ImageView.ScaleType FIT_START;
    enum_constant public static final android.widget.ImageView.ScaleType FIT_XY;
    enum_constant public static final android.widget.ImageView.ScaleType MATRIX;
  }

  @android.widget.RemoteViews.RemoteView public class LinearLayout extends android.view.ViewGroup {
    ctor public LinearLayout(android.content.Context);
    ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
    method protected android.widget.LinearLayout.LayoutParams generateDefaultLayoutParams();
    method public android.widget.LinearLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method protected android.widget.LinearLayout.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
    method public int getBaselineAlignedChildIndex();
    method public int getOrientation();
    method public float getWeightSum();
    method public boolean isBaselineAligned();
    method public void setBaselineAligned(boolean);
    method public void setBaselineAlignedChildIndex(int);
    method public void setGravity(int);
    method public void setHorizontalGravity(int);
    method public void setOrientation(int);
    method public void setVerticalGravity(int);
    method public void setWeightSum(float);
    field public static final int HORIZONTAL = 0; // 0x0
    field public static final int VERTICAL = 1; // 0x1
  }

  public static class LinearLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public LinearLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public LinearLayout.LayoutParams(int, int);
    ctor public LinearLayout.LayoutParams(int, int, float);
    ctor public LinearLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public LinearLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    method public String debug(String);
    field public int gravity;
    field public float weight;
  }

  public interface ListAdapter extends android.widget.Adapter {
    method public boolean areAllItemsEnabled();
    method public boolean isEnabled(int);
  }

  public class ListView extends android.widget.AbsListView {
    ctor public ListView(android.content.Context);
    ctor public ListView(android.content.Context, android.util.AttributeSet);
    ctor public ListView(android.content.Context, android.util.AttributeSet, int);
    method public void addFooterView(android.view.View, Object, boolean);
    method public void addFooterView(android.view.View);
    method public void addHeaderView(android.view.View, Object, boolean);
    method public void addHeaderView(android.view.View);
    method public void clearChoices();
    method protected android.view.View findViewTraversal(int);
    method protected android.view.View findViewWithTagTraversal(Object);
    method public android.widget.ListAdapter getAdapter();
    method public int getCheckedItemPosition();
    method public android.util.SparseBooleanArray getCheckedItemPositions();
    method public int getChoiceMode();
    method public android.graphics.drawable.Drawable getDivider();
    method public int getDividerHeight();
    method public int getFooterViewsCount();
    method public int getHeaderViewsCount();
    method public boolean getItemsCanFocus();
    method public int getMaxScrollAmount();
    method public boolean isItemChecked(int);
    method public boolean removeFooterView(android.view.View);
    method public boolean removeHeaderView(android.view.View);
    method public void setAdapter(android.widget.ListAdapter);
    method public void setChoiceMode(int);
    method public void setDivider(android.graphics.drawable.Drawable);
    method public void setDividerHeight(int);
    method public void setFooterDividersEnabled(boolean);
    method public void setHeaderDividersEnabled(boolean);
    method public void setItemChecked(int, boolean);
    method public void setItemsCanFocus(boolean);
    method public void setSelection(int);
    method public void setSelectionAfterHeaderView();
    method public void setSelectionFromTop(int, int);
    field public static final int CHOICE_MODE_MULTIPLE = 2; // 0x2
    field public static final int CHOICE_MODE_NONE = 0; // 0x0
    field public static final int CHOICE_MODE_SINGLE = 1; // 0x1
  }

  public class ListView.FixedViewInfo {
    ctor public ListView.FixedViewInfo();
    field public Object data;
    field public boolean isSelectable;
    field public android.view.View view;
  }

  public class MediaController extends android.widget.FrameLayout {
    ctor public MediaController(android.content.Context, android.util.AttributeSet);
    ctor public MediaController(android.content.Context, boolean);
    ctor public MediaController(android.content.Context);
    method public void hide();
    method public boolean isShowing();
    method public void onFinishInflate();
    method public void setAnchorView(android.view.View);
    method public void setMediaPlayer(android.widget.MediaController.MediaPlayerControl);
    method public void setPrevNextListeners(android.view.View.OnClickListener, android.view.View.OnClickListener);
    method public void show();
    method public void show(int);
  }

  public static interface MediaController.MediaPlayerControl {
    method public int getBufferPercentage();
    method public int getCurrentPosition();
    method public int getDuration();
    method public boolean isPlaying();
    method public void pause();
    method public void seekTo(int);
    method public void start();
  }

  public class MultiAutoCompleteTextView extends android.widget.AutoCompleteTextView {
    ctor public MultiAutoCompleteTextView(android.content.Context);
    ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
    ctor public MultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
    method protected void performFiltering(CharSequence, int, int, int);
    method public void setTokenizer(android.widget.MultiAutoCompleteTextView.Tokenizer);
  }

  public static class MultiAutoCompleteTextView.CommaTokenizer implements android.widget.MultiAutoCompleteTextView.Tokenizer {
    ctor public MultiAutoCompleteTextView.CommaTokenizer();
    method public int findTokenEnd(CharSequence, int);
    method public int findTokenStart(CharSequence, int);
    method public CharSequence terminateToken(CharSequence);
  }

  public static interface MultiAutoCompleteTextView.Tokenizer {
    method public int findTokenEnd(CharSequence, int);
    method public int findTokenStart(CharSequence, int);
    method public CharSequence terminateToken(CharSequence);
  }

  public class PopupWindow {
    ctor public PopupWindow(android.content.Context);
    ctor public PopupWindow(android.content.Context, android.util.AttributeSet);
    ctor public PopupWindow(android.content.Context, android.util.AttributeSet, int);
    ctor public PopupWindow();
    ctor public PopupWindow(android.view.View);
    ctor public PopupWindow(int, int);
    ctor public PopupWindow(android.view.View, int, int);
    ctor public PopupWindow(android.view.View, int, int, boolean);
    method public void dismiss();
    method public int getAnimationStyle();
    method public android.graphics.drawable.Drawable getBackground();
    method public android.view.View getContentView();
    method public int getHeight();
    method public int getInputMethodMode();
    method public int getMaxAvailableHeight(android.view.View);
    method public int getMaxAvailableHeight(android.view.View, int);
    method public int getWidth();
    method public boolean isAboveAnchor();
    method public boolean isClippingEnabled();
    method public boolean isFocusable();
    method public boolean isOutsideTouchable();
    method public boolean isShowing();
    method public boolean isTouchable();
    method public void setAnimationStyle(int);
    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
    method public void setClippingEnabled(boolean);
    method public void setContentView(android.view.View);
    method public void setFocusable(boolean);
    method public void setHeight(int);
    method public void setIgnoreCheekPress();
    method public void setInputMethodMode(int);
    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
    method public void setOutsideTouchable(boolean);
    method public void setTouchInterceptor(android.view.View.OnTouchListener);
    method public void setTouchable(boolean);
    method public void setWidth(int);
    method public void setWindowLayoutMode(int, int);
    method public void showAsDropDown(android.view.View);
    method public void showAsDropDown(android.view.View, int, int);
    method public void showAtLocation(android.view.View, int, int, int);
    method public void update();
    method public void update(int, int, int, int);
    method public void update(int, int, int, int, boolean);
    method public void update(android.view.View, int, int);
    method public void update(android.view.View, int, int, int, int);
    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
  }

  public static interface PopupWindow.OnDismissListener {
    method public void onDismiss();
  }

  @android.widget.RemoteViews.RemoteView public class ProgressBar extends android.view.View {
    ctor public ProgressBar(android.content.Context);
    ctor public ProgressBar(android.content.Context, android.util.AttributeSet);
    ctor public ProgressBar(android.content.Context, android.util.AttributeSet, int);
    method public android.graphics.drawable.Drawable getIndeterminateDrawable();
    method public android.view.animation.Interpolator getInterpolator();
    method public int getMax();
    method public int getProgress();
    method public android.graphics.drawable.Drawable getProgressDrawable();
    method public int getSecondaryProgress();
    method public final void incrementProgressBy(int);
    method public final void incrementSecondaryProgressBy(int);
    method public boolean isIndeterminate();
    method public void onRestoreInstanceState(android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState();
    method public void setIndeterminate(boolean);
    method public void setIndeterminateDrawable(android.graphics.drawable.Drawable);
    method public void setInterpolator(android.content.Context, int);
    method public void setInterpolator(android.view.animation.Interpolator);
    method public void setMax(int);
    method public void setProgress(int);
    method public void setProgressDrawable(android.graphics.drawable.Drawable);
    method public void setSecondaryProgress(int);
  }

  public class RadioButton extends android.widget.CompoundButton {
    ctor public RadioButton(android.content.Context);
    ctor public RadioButton(android.content.Context, android.util.AttributeSet);
    ctor public RadioButton(android.content.Context, android.util.AttributeSet, int);
  }

  public class RadioGroup extends android.widget.LinearLayout {
    ctor public RadioGroup(android.content.Context);
    ctor public RadioGroup(android.content.Context, android.util.AttributeSet);
    method public void check(int);
    method public void clearCheck();
    method public android.widget.RadioGroup.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public int getCheckedRadioButtonId();
    method public void setOnCheckedChangeListener(android.widget.RadioGroup.OnCheckedChangeListener);
  }

  public static class RadioGroup.LayoutParams extends android.widget.LinearLayout.LayoutParams {
    ctor public RadioGroup.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public RadioGroup.LayoutParams(int, int);
    ctor public RadioGroup.LayoutParams(int, int, float);
    ctor public RadioGroup.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public RadioGroup.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
  }

  public static interface RadioGroup.OnCheckedChangeListener {
    method public void onCheckedChanged(android.widget.RadioGroup, int);
  }

  public class RatingBar extends android.widget.AbsSeekBar {
    ctor public RatingBar(android.content.Context, android.util.AttributeSet, int);
    ctor public RatingBar(android.content.Context, android.util.AttributeSet);
    ctor public RatingBar(android.content.Context);
    method public int getNumStars();
    method public android.widget.RatingBar.OnRatingBarChangeListener getOnRatingBarChangeListener();
    method public float getRating();
    method public float getStepSize();
    method public boolean isIndicator();
    method public void setIsIndicator(boolean);
    method public void setNumStars(int);
    method public void setOnRatingBarChangeListener(android.widget.RatingBar.OnRatingBarChangeListener);
    method public void setRating(float);
    method public void setStepSize(float);
  }

  public static interface RatingBar.OnRatingBarChangeListener {
    method public void onRatingChanged(android.widget.RatingBar, float, boolean);
  }

  @android.widget.RemoteViews.RemoteView public class RelativeLayout extends android.view.ViewGroup {
    ctor public RelativeLayout(android.content.Context);
    ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
    ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
    method public android.widget.RelativeLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public void setGravity(int);
    method public void setHorizontalGravity(int);
    method public void setIgnoreGravity(int);
    method public void setVerticalGravity(int);
    field public static final int ABOVE = 2; // 0x2
    field public static final int ALIGN_BASELINE = 4; // 0x4
    field public static final int ALIGN_BOTTOM = 8; // 0x8
    field public static final int ALIGN_LEFT = 5; // 0x5
    field public static final int ALIGN_PARENT_BOTTOM = 12; // 0xc
    field public static final int ALIGN_PARENT_LEFT = 9; // 0x9
    field public static final int ALIGN_PARENT_RIGHT = 11; // 0xb
    field public static final int ALIGN_PARENT_TOP = 10; // 0xa
    field public static final int ALIGN_RIGHT = 7; // 0x7
    field public static final int ALIGN_TOP = 6; // 0x6
    field public static final int BELOW = 3; // 0x3
    field public static final int CENTER_HORIZONTAL = 14; // 0xe
    field public static final int CENTER_IN_PARENT = 13; // 0xd
    field public static final int CENTER_VERTICAL = 15; // 0xf
    field public static final int LEFT_OF = 0; // 0x0
    field public static final int RIGHT_OF = 1; // 0x1
    field public static final int TRUE = -1; // 0xffffffff
  }

  public static class RelativeLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
    ctor public RelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public RelativeLayout.LayoutParams(int, int);
    ctor public RelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public RelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    method public void addRule(int);
    method public void addRule(int, int);
    method public String debug(String);
    method public int[] getRules();
    field public boolean alignWithParent;
  }

  public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
    ctor public RemoteViews(String, int);
    ctor public RemoteViews(android.os.Parcel);
    method public android.view.View apply(android.content.Context, android.view.ViewGroup);
    method public int describeContents();
    method public int getLayoutId();
    method public String getPackage();
    method public boolean onLoadClass(Class);
    method public void reapply(android.content.Context, android.view.View);
    method public void setBitmap(int, String, android.graphics.Bitmap);
    method public void setBoolean(int, String, boolean);
    method public void setByte(int, String, byte);
    method public void setChar(int, String, char);
    method public void setCharSequence(int, String, CharSequence);
    method public void setChronometer(int, long, String, boolean);
    method public void setDouble(int, String, double);
    method public void setFloat(int, String, float);
    method public void setImageViewBitmap(int, android.graphics.Bitmap);
    method public void setImageViewResource(int, int);
    method public void setImageViewUri(int, android.net.Uri);
    method public void setInt(int, String, int);
    method public void setLong(int, String, long);
    method public void setOnClickPendingIntent(int, android.app.PendingIntent);
    method public void setProgressBar(int, int, int, boolean);
    method public void setShort(int, String, short);
    method public void setString(int, String, String);
    method public void setTextColor(int, int);
    method public void setTextViewText(int, CharSequence);
    method public void setUri(int, String, android.net.Uri);
    method public void setViewVisibility(int, int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.widget.RemoteViews> CREATOR;
  }

  public static class RemoteViews.ActionException extends java.lang.RuntimeException {
    ctor public RemoteViews.ActionException(Exception);
    ctor public RemoteViews.ActionException(String);
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public static @interface RemoteViews.RemoteView {
  }

  public abstract class ResourceCursorAdapter extends android.widget.CursorAdapter {
    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
    method public void setDropDownViewResource(int);
    method public void setViewResource(int);
  }

  public abstract class ResourceCursorTreeAdapter extends android.widget.CursorTreeAdapter {
    ctor public ResourceCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, int, int);
    ctor public ResourceCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, int);
    ctor public ResourceCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int);
    method public android.view.View newChildView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
    method public android.view.View newGroupView(android.content.Context, android.database.Cursor, boolean, android.view.ViewGroup);
  }

  public class ScrollView extends android.widget.FrameLayout {
    ctor public ScrollView(android.content.Context);
    ctor public ScrollView(android.content.Context, android.util.AttributeSet);
    ctor public ScrollView(android.content.Context, android.util.AttributeSet, int);
    method public boolean arrowScroll(int);
    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
    method public boolean executeKeyEvent(android.view.KeyEvent);
    method public void fling(int);
    method public boolean fullScroll(int);
    method public int getMaxScrollAmount();
    method public boolean isFillViewport();
    method public boolean isSmoothScrollingEnabled();
    method public boolean pageScroll(int);
    method public void setFillViewport(boolean);
    method public void setSmoothScrollingEnabled(boolean);
    method public final void smoothScrollBy(int, int);
    method public final void smoothScrollTo(int, int);
  }

  public class Scroller {
    ctor public Scroller(android.content.Context);
    ctor public Scroller(android.content.Context, android.view.animation.Interpolator);
    method public void abortAnimation();
    method public boolean computeScrollOffset();
    method public void extendDuration(int);
    method public void fling(int, int, int, int, int, int, int, int);
    method public final void forceFinished(boolean);
    method public final int getCurrX();
    method public final int getCurrY();
    method public final int getDuration();
    method public final int getFinalX();
    method public final int getFinalY();
    method public final int getStartX();
    method public final int getStartY();
    method public final boolean isFinished();
    method public void setFinalX(int);
    method public void setFinalY(int);
    method public void startScroll(int, int, int, int);
    method public void startScroll(int, int, int, int, int);
    method public int timePassed();
  }

  public interface SectionIndexer {
    method public int getPositionForSection(int);
    method public int getSectionForPosition(int);
    method public Object[] getSections();
  }

  public class SeekBar extends android.widget.AbsSeekBar {
    ctor public SeekBar(android.content.Context);
    ctor public SeekBar(android.content.Context, android.util.AttributeSet);
    ctor public SeekBar(android.content.Context, android.util.AttributeSet, int);
    method public void setOnSeekBarChangeListener(android.widget.SeekBar.OnSeekBarChangeListener);
  }

  public static interface SeekBar.OnSeekBarChangeListener {
    method public void onProgressChanged(android.widget.SeekBar, int, boolean);
    method public void onStartTrackingTouch(android.widget.SeekBar);
    method public void onStopTrackingTouch(android.widget.SeekBar);
  }

  public class SimpleAdapter extends android.widget.BaseAdapter implements android.widget.Filterable {
    ctor public SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, String[], int[]);
    method public int getCount();
    method public android.widget.Filter getFilter();
    method public Object getItem(int);
    method public long getItemId(int);
    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
    method public android.widget.SimpleAdapter.ViewBinder getViewBinder();
    method public void setDropDownViewResource(int);
    method public void setViewBinder(android.widget.SimpleAdapter.ViewBinder);
    method public void setViewImage(android.widget.ImageView, int);
    method public void setViewImage(android.widget.ImageView, String);
    method public void setViewText(android.widget.TextView, String);
  }

  public static interface SimpleAdapter.ViewBinder {
    method public boolean setViewValue(android.view.View, Object, String);
  }

  public class SimpleCursorAdapter extends android.widget.ResourceCursorAdapter {
    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, String[], int[]);
    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
    method public void changeCursorAndColumns(android.database.Cursor, String[], int[]);
    method public android.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
    method public int getStringConversionColumn();
    method public android.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
    method public void setCursorToStringConverter(android.widget.SimpleCursorAdapter.CursorToStringConverter);
    method public void setStringConversionColumn(int);
    method public void setViewBinder(android.widget.SimpleCursorAdapter.ViewBinder);
    method public void setViewImage(android.widget.ImageView, String);
    method public void setViewText(android.widget.TextView, String);
  }

  public static interface SimpleCursorAdapter.CursorToStringConverter {
    method public CharSequence convertToString(android.database.Cursor);
  }

  public static interface SimpleCursorAdapter.ViewBinder {
    method public boolean setViewValue(android.view.View, android.database.Cursor, int);
  }

  public abstract class SimpleCursorTreeAdapter extends android.widget.ResourceCursorTreeAdapter {
    ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, String[], int[], int, int, String[], int[]);
    ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, int, String[], int[], int, String[], int[]);
    ctor public SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, String[], int[], int, String[], int[]);
    method protected void bindChildView(android.view.View, android.content.Context, android.database.Cursor, boolean);
    method protected void bindGroupView(android.view.View, android.content.Context, android.database.Cursor, boolean);
    method protected void setViewImage(android.widget.ImageView, String);
  }

  public class SimpleExpandableListAdapter extends android.widget.BaseExpandableListAdapter {
    ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, String[], int[]);
    ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, String[], int[]);
    ctor public SimpleExpandableListAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, int, String[], int[], java.util.List<? extends java.util.List<? extends java.util.Map<java.lang.String,?>>>, int, int, String[], int[]);
    method public Object getChild(int, int);
    method public long getChildId(int, int);
    method public android.view.View getChildView(int, int, boolean, android.view.View, android.view.ViewGroup);
    method public int getChildrenCount(int);
    method public Object getGroup(int);
    method public int getGroupCount();
    method public long getGroupId(int);
    method public android.view.View getGroupView(int, boolean, android.view.View, android.view.ViewGroup);
    method public boolean hasStableIds();
    method public boolean isChildSelectable(int, int);
    method public android.view.View newChildView(boolean, android.view.ViewGroup);
    method public android.view.View newGroupView(boolean, android.view.ViewGroup);
  }

  public class SlidingDrawer extends android.view.ViewGroup {
    ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet);
    ctor public SlidingDrawer(android.content.Context, android.util.AttributeSet, int);
    method public void animateClose();
    method public void animateOpen();
    method public void animateToggle();
    method public void close();
    method public android.view.View getContent();
    method public android.view.View getHandle();
    method public boolean isMoving();
    method public boolean isOpened();
    method public void lock();
    method public void open();
    method public void setOnDrawerCloseListener(android.widget.SlidingDrawer.OnDrawerCloseListener);
    method public void setOnDrawerOpenListener(android.widget.SlidingDrawer.OnDrawerOpenListener);
    method public void setOnDrawerScrollListener(android.widget.SlidingDrawer.OnDrawerScrollListener);
    method public void toggle();
    method public void unlock();
    field public static final int ORIENTATION_HORIZONTAL = 0; // 0x0
    field public static final int ORIENTATION_VERTICAL = 1; // 0x1
  }

  public static interface SlidingDrawer.OnDrawerCloseListener {
    method public void onDrawerClosed();
  }

  public static interface SlidingDrawer.OnDrawerOpenListener {
    method public void onDrawerOpened();
  }

  public static interface SlidingDrawer.OnDrawerScrollListener {
    method public void onScrollEnded();
    method public void onScrollStarted();
  }

  public class Spinner extends android.widget.AbsSpinner implements android.content.DialogInterface.OnClickListener {
    ctor public Spinner(android.content.Context);
    ctor public Spinner(android.content.Context, android.util.AttributeSet);
    ctor public Spinner(android.content.Context, android.util.AttributeSet, int);
    method public CharSequence getPrompt();
    method public void onClick(android.content.DialogInterface, int);
    method public void setPrompt(CharSequence);
    method public void setPromptId(int);
  }

  public interface SpinnerAdapter extends android.widget.Adapter {
    method public android.view.View getDropDownView(int, android.view.View, android.view.ViewGroup);
  }

  public class TabHost extends android.widget.FrameLayout implements android.view.ViewTreeObserver.OnTouchModeChangeListener {
    ctor public TabHost(android.content.Context);
    ctor public TabHost(android.content.Context, android.util.AttributeSet);
    method public void addTab(android.widget.TabHost.TabSpec);
    method public void clearAllTabs();
    method public int getCurrentTab();
    method public String getCurrentTabTag();
    method public android.view.View getCurrentTabView();
    method public android.view.View getCurrentView();
    method public android.widget.FrameLayout getTabContentView();
    method public android.widget.TabWidget getTabWidget();
    method public android.widget.TabHost.TabSpec newTabSpec(String);
    method public void onTouchModeChanged(boolean);
    method public void setCurrentTab(int);
    method public void setCurrentTabByTag(String);
    method public void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener);
    method public void setup();
    method public void setup(android.app.LocalActivityManager);
  }

  public static interface TabHost.OnTabChangeListener {
    method public void onTabChanged(String);
  }

  public static interface TabHost.TabContentFactory {
    method public android.view.View createTabContent(String);
  }

  public class TabHost.TabSpec {
    method public android.widget.TabHost.TabSpec setContent(int);
    method public android.widget.TabHost.TabSpec setContent(android.widget.TabHost.TabContentFactory);
    method public android.widget.TabHost.TabSpec setContent(android.content.Intent);
    method public android.widget.TabHost.TabSpec setIndicator(CharSequence);
    method public android.widget.TabHost.TabSpec setIndicator(CharSequence, android.graphics.drawable.Drawable);
  }

  public class TabWidget extends android.widget.LinearLayout implements android.view.View.OnFocusChangeListener {
    ctor public TabWidget(android.content.Context);
    ctor public TabWidget(android.content.Context, android.util.AttributeSet);
    ctor public TabWidget(android.content.Context, android.util.AttributeSet, int);
    method public void dispatchDraw(android.graphics.Canvas);
    method public void focusCurrentTab(int);
    method public void onFocusChange(android.view.View, boolean);
    method public void setCurrentTab(int);
  }

  public class TableLayout extends android.widget.LinearLayout {
    ctor public TableLayout(android.content.Context);
    ctor public TableLayout(android.content.Context, android.util.AttributeSet);
    method public android.widget.TableLayout.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public boolean isColumnCollapsed(int);
    method public boolean isColumnShrinkable(int);
    method public boolean isColumnStretchable(int);
    method public boolean isShrinkAllColumns();
    method public boolean isStretchAllColumns();
    method public void setColumnCollapsed(int, boolean);
    method public void setColumnShrinkable(int, boolean);
    method public void setColumnStretchable(int, boolean);
    method public void setShrinkAllColumns(boolean);
    method public void setStretchAllColumns(boolean);
  }

  public static class TableLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
    ctor public TableLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public TableLayout.LayoutParams(int, int);
    ctor public TableLayout.LayoutParams(int, int, float);
    ctor public TableLayout.LayoutParams();
    ctor public TableLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public TableLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
  }

  public class TableRow extends android.widget.LinearLayout {
    ctor public TableRow(android.content.Context);
    ctor public TableRow(android.content.Context, android.util.AttributeSet);
    method public android.widget.TableRow.LayoutParams generateLayoutParams(android.util.AttributeSet);
    method public android.view.View getVirtualChildAt(int);
    method public int getVirtualChildCount();
  }

  public static class TableRow.LayoutParams extends android.widget.LinearLayout.LayoutParams {
    ctor public TableRow.LayoutParams(android.content.Context, android.util.AttributeSet);
    ctor public TableRow.LayoutParams(int, int);
    ctor public TableRow.LayoutParams(int, int, float);
    ctor public TableRow.LayoutParams();
    ctor public TableRow.LayoutParams(int);
    ctor public TableRow.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public TableRow.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    field public int column;
    field public int span;
  }

  public class TextSwitcher extends android.widget.ViewSwitcher {
    ctor public TextSwitcher(android.content.Context);
    ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
    method public void setCurrentText(CharSequence);
    method public void setText(CharSequence);
  }

  @android.widget.RemoteViews.RemoteView public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
    ctor public TextView(android.content.Context);
    ctor public TextView(android.content.Context, android.util.AttributeSet);
    ctor public TextView(android.content.Context, android.util.AttributeSet, int);
    method public void addTextChangedListener(android.text.TextWatcher);
    method public final void append(CharSequence);
    method public void append(CharSequence, int, int);
    method public void beginBatchEdit();
    method public boolean bringPointIntoView(int);
    method public void clearComposingText();
    method public void debug(int);
    method public boolean didTouchFocusSelect();
    method public void endBatchEdit();
    method public boolean extractText(android.view.inputmethod.ExtractedTextRequest, android.view.inputmethod.ExtractedText);
    method public final int getAutoLinkMask();
    method public int getCompoundDrawablePadding();
    method public android.graphics.drawable.Drawable[] getCompoundDrawables();
    method public int getCompoundPaddingBottom();
    method public int getCompoundPaddingLeft();
    method public int getCompoundPaddingRight();
    method public int getCompoundPaddingTop();
    method public final int getCurrentHintTextColor();
    method public final int getCurrentTextColor();
    method protected boolean getDefaultEditable();
    method protected android.text.method.MovementMethod getDefaultMovementMethod();
    method public android.text.Editable getEditableText();
    method public android.text.TextUtils.TruncateAt getEllipsize();
    method public CharSequence getError();
    method public int getExtendedPaddingBottom();
    method public int getExtendedPaddingTop();
    method public android.text.InputFilter[] getFilters();
    method public boolean getFreezesText();
    method public int getGravity();
    method public CharSequence getHint();
    method public final android.content.res.ColorStateList getHintTextColors();
    method public int getImeActionId();
    method public CharSequence getImeActionLabel();
    method public int getImeOptions();
    method public android.os.Bundle getInputExtras(boolean);
    method public int getInputType();
    method public final android.text.method.KeyListener getKeyListener();
    method public final android.text.Layout getLayout();
    method public int getLineBounds(int, android.graphics.Rect);
    method public int getLineCount();
    method public int getLineHeight();
    method public final android.content.res.ColorStateList getLinkTextColors();
    method public final boolean getLinksClickable();
    method public final android.text.method.MovementMethod getMovementMethod();
    method public android.text.TextPaint getPaint();
    method public int getPaintFlags();
    method public String getPrivateImeOptions();
    method public int getSelectionEnd();
    method public int getSelectionStart();
    method public CharSequence getText();
    method public static int getTextColor(android.content.Context, android.content.res.TypedArray, int);
    method public final android.content.res.ColorStateList getTextColors();
    method public static android.content.res.ColorStateList getTextColors(android.content.Context, android.content.res.TypedArray);
    method public float getTextScaleX();
    method public float getTextSize();
    method public int getTotalPaddingBottom();
    method public int getTotalPaddingLeft();
    method public int getTotalPaddingRight();
    method public int getTotalPaddingTop();
    method public final android.text.method.TransformationMethod getTransformationMethod();
    method public android.graphics.Typeface getTypeface();
    method public android.text.style.URLSpan[] getUrls();
    method public boolean hasSelection();
    method public boolean isInputMethodTarget();
    method public int length();
    method public boolean moveCursorToVisibleOffset();
    method public void onBeginBatchEdit();
    method public void onCommitCompletion(android.view.inputmethod.CompletionInfo);
    method public void onEditorAction(int);
    method public void onEndBatchEdit();
    method public boolean onPreDraw();
    method public boolean onPrivateIMECommand(String, android.os.Bundle);
    method public void onRestoreInstanceState(android.os.Parcelable);
    method public android.os.Parcelable onSaveInstanceState();
    method protected void onSelectionChanged(int, int);
    method protected void onTextChanged(CharSequence, int, int, int);
    method public boolean onTextContextMenuItem(int);
    method public void removeTextChangedListener(android.text.TextWatcher);
    method public final void setAutoLinkMask(int);
    method public void setCompoundDrawablePadding(int);
    method public void setCompoundDrawables(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
    method public void setCompoundDrawablesWithIntrinsicBounds(int, int, int, int);
    method public void setCompoundDrawablesWithIntrinsicBounds(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
    method public void setCursorVisible(boolean);
    method public final void setEditableFactory(android.text.Editable.Factory);
    method public void setEllipsize(android.text.TextUtils.TruncateAt);
    method public void setEms(int);
    method public void setError(CharSequence);
    method public void setError(CharSequence, android.graphics.drawable.Drawable);
    method public void setExtractedText(android.view.inputmethod.ExtractedText);
    method public void setFilters(android.text.InputFilter[]);
    method protected boolean setFrame(int, int, int, int);
    method public void setFreezesText(boolean);
    method public void setGravity(int);
    method public void setHeight(int);
    method public void setHighlightColor(int);
    method public final void setHint(CharSequence);
    method public final void setHint(int);
    method public final void setHintTextColor(int);
    method public final void setHintTextColor(android.content.res.ColorStateList);
    method public void setHorizontallyScrolling(boolean);
    method public void setImeActionLabel(CharSequence, int);
    method public void setImeOptions(int);
    method public void setIncludeFontPadding(boolean);
    method public void setInputExtras(int) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public void setInputType(int);
    method public void setKeyListener(android.text.method.KeyListener);
    method public void setLineSpacing(float, float);
    method public void setLines(int);
    method public final void setLinkTextColor(int);
    method public final void setLinkTextColor(android.content.res.ColorStateList);
    method public final void setLinksClickable(boolean);
    method public void setMarqueeRepeatLimit(int);
    method public void setMaxEms(int);
    method public void setMaxHeight(int);
    method public void setMaxLines(int);
    method public void setMaxWidth(int);
    method public void setMinEms(int);
    method public void setMinHeight(int);
    method public void setMinLines(int);
    method public void setMinWidth(int);
    method public final void setMovementMethod(android.text.method.MovementMethod);
    method public void setOnEditorActionListener(android.widget.TextView.OnEditorActionListener);
    method public void setPaintFlags(int);
    method public void setPrivateImeOptions(String);
    method public void setRawInputType(int);
    method public void setScroller(android.widget.Scroller);
    method public void setSelectAllOnFocus(boolean);
    method public void setShadowLayer(float, float, float, int);
    method public void setSingleLine();
    method public void setSingleLine(boolean);
    method public final void setSpannableFactory(android.text.Spannable.Factory);
    method public final void setText(CharSequence);
    method public void setText(CharSequence, android.widget.TextView.BufferType);
    method public final void setText(char[], int, int);
    method public final void setText(int);
    method public final void setText(int, android.widget.TextView.BufferType);
    method public void setTextAppearance(android.content.Context, int);
    method public void setTextColor(int);
    method public void setTextColor(android.content.res.ColorStateList);
    method public final void setTextKeepState(CharSequence);
    method public final void setTextKeepState(CharSequence, android.widget.TextView.BufferType);
    method public void setTextScaleX(float);
    method public void setTextSize(float);
    method public void setTextSize(int, float);
    method public final void setTransformationMethod(android.text.method.TransformationMethod);
    method public void setTypeface(android.graphics.Typeface, int);
    method public void setTypeface(android.graphics.Typeface);
    method public void setWidth(int);
  }

  public enum TextView.BufferType {
    enum_constant public static final android.widget.TextView.BufferType EDITABLE;
    enum_constant public static final android.widget.TextView.BufferType NORMAL;
    enum_constant public static final android.widget.TextView.BufferType SPANNABLE;
  }

  public static interface TextView.OnEditorActionListener {
    method public boolean onEditorAction(android.widget.TextView, int, android.view.KeyEvent);
  }

  public static class TextView.SavedState extends android.view.View.BaseSavedState {
    field public static final android.os.Parcelable.Creator<android.widget.TextView.SavedState> CREATOR;
  }

  public class TimePicker extends android.widget.FrameLayout {
    ctor public TimePicker(android.content.Context);
    ctor public TimePicker(android.content.Context, android.util.AttributeSet);
    ctor public TimePicker(android.content.Context, android.util.AttributeSet, int);
    method public Integer getCurrentHour();
    method public Integer getCurrentMinute();
    method public boolean is24HourView();
    method public void setCurrentHour(Integer);
    method public void setCurrentMinute(Integer);
    method public void setIs24HourView(Boolean);
    method public void setOnTimeChangedListener(android.widget.TimePicker.OnTimeChangedListener);
  }

  public static interface TimePicker.OnTimeChangedListener {
    method public void onTimeChanged(android.widget.TimePicker, int, int);
  }

  public class Toast {
    ctor public Toast(android.content.Context);
    method public void cancel();
    method public int getDuration();
    method public int getGravity();
    method public float getHorizontalMargin();
    method public float getVerticalMargin();
    method public android.view.View getView();
    method public int getXOffset();
    method public int getYOffset();
    method public static android.widget.Toast makeText(android.content.Context, CharSequence, int);
    method public static android.widget.Toast makeText(android.content.Context, int, int) throws android.content.res.Resources.NotFoundException;
    method public void setDuration(int);
    method public void setGravity(int, int, int);
    method public void setMargin(float, float);
    method public void setText(int);
    method public void setText(CharSequence);
    method public void setView(android.view.View);
    method public void show();
    field public static final int LENGTH_LONG = 1; // 0x1
    field public static final int LENGTH_SHORT = 0; // 0x0
  }

  public class ToggleButton extends android.widget.CompoundButton {
    ctor public ToggleButton(android.content.Context, android.util.AttributeSet, int);
    ctor public ToggleButton(android.content.Context, android.util.AttributeSet);
    ctor public ToggleButton(android.content.Context);
    method public CharSequence getTextOff();
    method public CharSequence getTextOn();
    method public void setTextOff(CharSequence);
    method public void setTextOn(CharSequence);
  }

  public class TwoLineListItem extends android.widget.RelativeLayout {
    ctor public TwoLineListItem(android.content.Context);
    ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet);
    ctor public TwoLineListItem(android.content.Context, android.util.AttributeSet, int);
    method public android.widget.TextView getText1();
    method public android.widget.TextView getText2();
  }

  public class VideoView extends android.view.SurfaceView implements android.widget.MediaController.MediaPlayerControl {
    ctor public VideoView(android.content.Context);
    ctor public VideoView(android.content.Context, android.util.AttributeSet);
    ctor public VideoView(android.content.Context, android.util.AttributeSet, int);
    method public int getBufferPercentage();
    method public int getCurrentPosition();
    method public int getDuration();
    method public boolean isPlaying();
    method public void pause();
    method public int resolveAdjustedSize(int, int);
    method public void seekTo(int);
    method public void setMediaController(android.widget.MediaController);
    method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
    method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
    method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
    method public void setVideoPath(String);
    method public void setVideoURI(android.net.Uri);
    method public void start();
    method public void stopPlayback();
  }

  public class ViewAnimator extends android.widget.FrameLayout {
    ctor public ViewAnimator(android.content.Context);
    ctor public ViewAnimator(android.content.Context, android.util.AttributeSet);
    method public android.view.View getCurrentView();
    method public int getDisplayedChild();
    method public android.view.animation.Animation getInAnimation();
    method public android.view.animation.Animation getOutAnimation();
    method public void setAnimateFirstView(boolean);
    method public void setDisplayedChild(int);
    method public void setInAnimation(android.view.animation.Animation);
    method public void setInAnimation(android.content.Context, int);
    method public void setOutAnimation(android.view.animation.Animation);
    method public void setOutAnimation(android.content.Context, int);
    method public void showNext();
    method public void showPrevious();
  }

  public class ViewFlipper extends android.widget.ViewAnimator {
    ctor public ViewFlipper(android.content.Context);
    ctor public ViewFlipper(android.content.Context, android.util.AttributeSet);
    method public boolean isFlipping();
    method public void setFlipInterval(int);
    method public void startFlipping();
    method public void stopFlipping();
  }

  public class ViewSwitcher extends android.widget.ViewAnimator {
    ctor public ViewSwitcher(android.content.Context);
    ctor public ViewSwitcher(android.content.Context, android.util.AttributeSet);
    method public android.view.View getNextView();
    method public void reset();
    method public void setFactory(android.widget.ViewSwitcher.ViewFactory);
  }

  public static interface ViewSwitcher.ViewFactory {
    method public android.view.View makeView();
  }

  public interface WrapperListAdapter extends android.widget.ListAdapter {
    method public android.widget.ListAdapter getWrappedAdapter();
  }

  public class ZoomButton extends android.widget.ImageButton implements android.view.View.OnLongClickListener {
    ctor public ZoomButton(android.content.Context);
    ctor public ZoomButton(android.content.Context, android.util.AttributeSet);
    ctor public ZoomButton(android.content.Context, android.util.AttributeSet, int);
    method public boolean onLongClick(android.view.View);
    method public void setZoomSpeed(long);
  }

  public class ZoomControls extends android.widget.LinearLayout {
    ctor public ZoomControls(android.content.Context);
    ctor public ZoomControls(android.content.Context, android.util.AttributeSet);
    method public void hide();
    method public void setIsZoomInEnabled(boolean);
    method public void setIsZoomOutEnabled(boolean);
    method public void setOnZoomInClickListener(android.view.View.OnClickListener);
    method public void setOnZoomOutClickListener(android.view.View.OnClickListener);
    method public void setZoomSpeed(long);
    method public void show();
  }

}

package com.android.internal.util {

  public interface Predicate<T> {
    method public boolean apply(T);
  }

}

package dalvik.annotation {

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface TestTarget {
    method public abstract String conceptName() default "";
    method public abstract Class<?>[] methodArgs() default {};
    method public abstract String methodName() default "";
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public @interface TestTargetClass {
    method public abstract Class<?> value();
  }

}

package dalvik.bytecode {

  public interface Opcodes {
    field public static final int OP_ADD_DOUBLE = 171; // 0xab
    field public static final int OP_ADD_DOUBLE_2ADDR = 203; // 0xcb
    field public static final int OP_ADD_FLOAT = 166; // 0xa6
    field public static final int OP_ADD_FLOAT_2ADDR = 198; // 0xc6
    field public static final int OP_ADD_INT = 144; // 0x90
    field public static final int OP_ADD_INT_2ADDR = 176; // 0xb0
    field public static final int OP_ADD_INT_LIT16 = 208; // 0xd0
    field public static final int OP_ADD_INT_LIT8 = 216; // 0xd8
    field public static final int OP_ADD_LONG = 155; // 0x9b
    field public static final int OP_ADD_LONG_2ADDR = 187; // 0xbb
    field public static final int OP_AGET = 68; // 0x44
    field public static final int OP_AGET_BOOLEAN = 71; // 0x47
    field public static final int OP_AGET_BYTE = 72; // 0x48
    field public static final int OP_AGET_CHAR = 73; // 0x49
    field public static final int OP_AGET_OBJECT = 70; // 0x46
    field public static final int OP_AGET_SHORT = 74; // 0x4a
    field public static final int OP_AGET_WIDE = 69; // 0x45
    field public static final int OP_AND_INT = 149; // 0x95
    field public static final int OP_AND_INT_2ADDR = 181; // 0xb5
    field public static final int OP_AND_INT_LIT16 = 213; // 0xd5
    field public static final int OP_AND_INT_LIT8 = 221; // 0xdd
    field public static final int OP_AND_LONG = 160; // 0xa0
    field public static final int OP_AND_LONG_2ADDR = 192; // 0xc0
    field public static final int OP_APUT = 75; // 0x4b
    field public static final int OP_APUT_BOOLEAN = 78; // 0x4e
    field public static final int OP_APUT_BYTE = 79; // 0x4f
    field public static final int OP_APUT_CHAR = 80; // 0x50
    field public static final int OP_APUT_OBJECT = 77; // 0x4d
    field public static final int OP_APUT_SHORT = 81; // 0x51
    field public static final int OP_APUT_WIDE = 76; // 0x4c
    field public static final int OP_ARRAY_LENGTH = 33; // 0x21
    field public static final int OP_CHECK_CAST = 31; // 0x1f
    field public static final int OP_CMPG_DOUBLE = 48; // 0x30
    field public static final int OP_CMPG_FLOAT = 46; // 0x2e
    field public static final int OP_CMPL_DOUBLE = 47; // 0x2f
    field public static final int OP_CMPL_FLOAT = 45; // 0x2d
    field public static final int OP_CMP_LONG = 49; // 0x31
    field public static final int OP_CONST = 20; // 0x14
    field public static final int OP_CONST_16 = 19; // 0x13
    field public static final int OP_CONST_4 = 18; // 0x12
    field public static final int OP_CONST_CLASS = 28; // 0x1c
    field public static final int OP_CONST_HIGH16 = 21; // 0x15
    field public static final int OP_CONST_STRING = 26; // 0x1a
    field public static final int OP_CONST_STRING_JUMBO = 27; // 0x1b
    field public static final int OP_CONST_WIDE = 24; // 0x18
    field public static final int OP_CONST_WIDE_16 = 22; // 0x16
    field public static final int OP_CONST_WIDE_32 = 23; // 0x17
    field public static final int OP_CONST_WIDE_HIGH16 = 25; // 0x19
    field public static final int OP_DIV_DOUBLE = 174; // 0xae
    field public static final int OP_DIV_DOUBLE_2ADDR = 206; // 0xce
    field public static final int OP_DIV_FLOAT = 169; // 0xa9
    field public static final int OP_DIV_FLOAT_2ADDR = 201; // 0xc9
    field public static final int OP_DIV_INT = 147; // 0x93
    field public static final int OP_DIV_INT_2ADDR = 179; // 0xb3
    field public static final int OP_DIV_INT_LIT16 = 211; // 0xd3
    field public static final int OP_DIV_INT_LIT8 = 219; // 0xdb
    field public static final int OP_DIV_LONG = 158; // 0x9e
    field public static final int OP_DIV_LONG_2ADDR = 190; // 0xbe
    field public static final int OP_DOUBLE_TO_FLOAT = 140; // 0x8c
    field public static final int OP_DOUBLE_TO_INT = 138; // 0x8a
    field public static final int OP_DOUBLE_TO_LONG = 139; // 0x8b
    field public static final int OP_EXECUTE_INLINE = 238; // 0xee
    field public static final int OP_FILLED_NEW_ARRAY = 36; // 0x24
    field public static final int OP_FILLED_NEW_ARRAY_RANGE = 37; // 0x25
    field public static final int OP_FILL_ARRAY_DATA = 38; // 0x26
    field public static final int OP_FLOAT_TO_DOUBLE = 137; // 0x89
    field public static final int OP_FLOAT_TO_INT = 135; // 0x87
    field public static final int OP_FLOAT_TO_LONG = 136; // 0x88
    field public static final int OP_GOTO = 40; // 0x28
    field public static final int OP_GOTO_16 = 41; // 0x29
    field public static final int OP_GOTO_32 = 42; // 0x2a
    field public static final int OP_IF_EQ = 50; // 0x32
    field public static final int OP_IF_EQZ = 56; // 0x38
    field public static final int OP_IF_GE = 53; // 0x35
    field public static final int OP_IF_GEZ = 59; // 0x3b
    field public static final int OP_IF_GT = 54; // 0x36
    field public static final int OP_IF_GTZ = 60; // 0x3c
    field public static final int OP_IF_LE = 55; // 0x37
    field public static final int OP_IF_LEZ = 61; // 0x3d
    field public static final int OP_IF_LT = 52; // 0x34
    field public static final int OP_IF_LTZ = 58; // 0x3a
    field public static final int OP_IF_NE = 51; // 0x33
    field public static final int OP_IF_NEZ = 57; // 0x39
    field public static final int OP_IGET = 82; // 0x52
    field public static final int OP_IGET_BOOLEAN = 85; // 0x55
    field public static final int OP_IGET_BYTE = 86; // 0x56
    field public static final int OP_IGET_CHAR = 87; // 0x57
    field public static final int OP_IGET_OBJECT = 84; // 0x54
    field public static final int OP_IGET_OBJECT_QUICK = 244; // 0xf4
    field public static final int OP_IGET_QUICK = 242; // 0xf2
    field public static final int OP_IGET_SHORT = 88; // 0x58
    field public static final int OP_IGET_WIDE = 83; // 0x53
    field public static final int OP_IGET_WIDE_QUICK = 243; // 0xf3
    field public static final int OP_INSTANCE_OF = 32; // 0x20
    field public static final int OP_INT_TO_BYTE = 141; // 0x8d
    field public static final int OP_INT_TO_CHAR = 142; // 0x8e
    field public static final int OP_INT_TO_DOUBLE = 131; // 0x83
    field public static final int OP_INT_TO_FLOAT = 130; // 0x82
    field public static final int OP_INT_TO_LONG = 129; // 0x81
    field public static final int OP_INT_TO_SHORT = 143; // 0x8f
    field public static final int OP_INVOKE_DIRECT = 112; // 0x70
    field public static final int OP_INVOKE_DIRECT_EMPTY = 240; // 0xf0
    field public static final int OP_INVOKE_DIRECT_RANGE = 118; // 0x76
    field public static final int OP_INVOKE_INTERFACE = 114; // 0x72
    field public static final int OP_INVOKE_INTERFACE_RANGE = 120; // 0x78
    field public static final int OP_INVOKE_STATIC = 113; // 0x71
    field public static final int OP_INVOKE_STATIC_RANGE = 119; // 0x77
    field public static final int OP_INVOKE_SUPER = 111; // 0x6f
    field public static final int OP_INVOKE_SUPER_QUICK = 250; // 0xfa
    field public static final int OP_INVOKE_SUPER_QUICK_RANGE = 251; // 0xfb
    field public static final int OP_INVOKE_SUPER_RANGE = 117; // 0x75
    field public static final int OP_INVOKE_VIRTUAL = 110; // 0x6e
    field public static final int OP_INVOKE_VIRTUAL_QUICK = 248; // 0xf8
    field public static final int OP_INVOKE_VIRTUAL_QUICK_RANGE = 249; // 0xf9
    field public static final int OP_INVOKE_VIRTUAL_RANGE = 116; // 0x74
    field public static final int OP_IPUT = 89; // 0x59
    field public static final int OP_IPUT_BOOLEAN = 92; // 0x5c
    field public static final int OP_IPUT_BYTE = 93; // 0x5d
    field public static final int OP_IPUT_CHAR = 94; // 0x5e
    field public static final int OP_IPUT_OBJECT = 91; // 0x5b
    field public static final int OP_IPUT_OBJECT_QUICK = 247; // 0xf7
    field public static final int OP_IPUT_QUICK = 245; // 0xf5
    field public static final int OP_IPUT_SHORT = 95; // 0x5f
    field public static final int OP_IPUT_WIDE = 90; // 0x5a
    field public static final int OP_IPUT_WIDE_QUICK = 246; // 0xf6
    field public static final int OP_LONG_TO_DOUBLE = 134; // 0x86
    field public static final int OP_LONG_TO_FLOAT = 133; // 0x85
    field public static final int OP_LONG_TO_INT = 132; // 0x84
    field public static final int OP_MONITOR_ENTER = 29; // 0x1d
    field public static final int OP_MONITOR_EXIT = 30; // 0x1e
    field public static final int OP_MOVE = 1; // 0x1
    field public static final int OP_MOVE_16 = 3; // 0x3
    field public static final int OP_MOVE_EXCEPTION = 13; // 0xd
    field public static final int OP_MOVE_FROM16 = 2; // 0x2
    field public static final int OP_MOVE_OBJECT = 7; // 0x7
    field public static final int OP_MOVE_OBJECT_16 = 9; // 0x9
    field public static final int OP_MOVE_OBJECT_FROM16 = 8; // 0x8
    field public static final int OP_MOVE_RESULT = 10; // 0xa
    field public static final int OP_MOVE_RESULT_OBJECT = 12; // 0xc
    field public static final int OP_MOVE_RESULT_WIDE = 11; // 0xb
    field public static final int OP_MOVE_WIDE = 4; // 0x4
    field public static final int OP_MOVE_WIDE_16 = 6; // 0x6
    field public static final int OP_MOVE_WIDE_FROM16 = 5; // 0x5
    field public static final int OP_MUL_DOUBLE = 173; // 0xad
    field public static final int OP_MUL_DOUBLE_2ADDR = 205; // 0xcd
    field public static final int OP_MUL_FLOAT = 168; // 0xa8
    field public static final int OP_MUL_FLOAT_2ADDR = 200; // 0xc8
    field public static final int OP_MUL_INT = 146; // 0x92
    field public static final int OP_MUL_INT_2ADDR = 178; // 0xb2
    field public static final int OP_MUL_INT_LIT16 = 210; // 0xd2
    field public static final int OP_MUL_INT_LIT8 = 218; // 0xda
    field public static final int OP_MUL_LONG = 157; // 0x9d
    field public static final int OP_MUL_LONG_2ADDR = 189; // 0xbd
    field public static final int OP_NEG_DOUBLE = 128; // 0x80
    field public static final int OP_NEG_FLOAT = 127; // 0x7f
    field public static final int OP_NEG_INT = 123; // 0x7b
    field public static final int OP_NEG_LONG = 125; // 0x7d
    field public static final int OP_NEW_ARRAY = 35; // 0x23
    field public static final int OP_NEW_INSTANCE = 34; // 0x22
    field public static final int OP_NOP = 0; // 0x0
    field public static final int OP_NOT_INT = 124; // 0x7c
    field public static final int OP_NOT_LONG = 126; // 0x7e
    field public static final int OP_OR_INT = 150; // 0x96
    field public static final int OP_OR_INT_2ADDR = 182; // 0xb6
    field public static final int OP_OR_INT_LIT16 = 214; // 0xd6
    field public static final int OP_OR_INT_LIT8 = 222; // 0xde
    field public static final int OP_OR_LONG = 161; // 0xa1
    field public static final int OP_OR_LONG_2ADDR = 193; // 0xc1
    field public static final int OP_PACKED_SWITCH = 43; // 0x2b
    field public static final int OP_REM_DOUBLE = 175; // 0xaf
    field public static final int OP_REM_DOUBLE_2ADDR = 207; // 0xcf
    field public static final int OP_REM_FLOAT = 170; // 0xaa
    field public static final int OP_REM_FLOAT_2ADDR = 202; // 0xca
    field public static final int OP_REM_INT = 148; // 0x94
    field public static final int OP_REM_INT_2ADDR = 180; // 0xb4
    field public static final int OP_REM_INT_LIT16 = 212; // 0xd4
    field public static final int OP_REM_INT_LIT8 = 220; // 0xdc
    field public static final int OP_REM_LONG = 159; // 0x9f
    field public static final int OP_REM_LONG_2ADDR = 191; // 0xbf
    field public static final int OP_RETURN = 15; // 0xf
    field public static final int OP_RETURN_OBJECT = 17; // 0x11
    field public static final int OP_RETURN_VOID = 14; // 0xe
    field public static final int OP_RETURN_WIDE = 16; // 0x10
    field public static final int OP_RSUB_INT = 209; // 0xd1
    field public static final int OP_RSUB_INT_LIT8 = 217; // 0xd9
    field public static final int OP_SGET = 96; // 0x60
    field public static final int OP_SGET_BOOLEAN = 99; // 0x63
    field public static final int OP_SGET_BYTE = 100; // 0x64
    field public static final int OP_SGET_CHAR = 101; // 0x65
    field public static final int OP_SGET_OBJECT = 98; // 0x62
    field public static final int OP_SGET_SHORT = 102; // 0x66
    field public static final int OP_SGET_WIDE = 97; // 0x61
    field public static final int OP_SHL_INT = 152; // 0x98
    field public static final int OP_SHL_INT_2ADDR = 184; // 0xb8
    field public static final int OP_SHL_INT_LIT8 = 224; // 0xe0
    field public static final int OP_SHL_LONG = 163; // 0xa3
    field public static final int OP_SHL_LONG_2ADDR = 195; // 0xc3
    field public static final int OP_SHR_INT = 153; // 0x99
    field public static final int OP_SHR_INT_2ADDR = 185; // 0xb9
    field public static final int OP_SHR_INT_LIT8 = 225; // 0xe1
    field public static final int OP_SHR_LONG = 164; // 0xa4
    field public static final int OP_SHR_LONG_2ADDR = 196; // 0xc4
    field public static final int OP_SPARSE_SWITCH = 44; // 0x2c
    field public static final int OP_SPUT = 103; // 0x67
    field public static final int OP_SPUT_BOOLEAN = 106; // 0x6a
    field public static final int OP_SPUT_BYTE = 107; // 0x6b
    field public static final int OP_SPUT_CHAR = 108; // 0x6c
    field public static final int OP_SPUT_OBJECT = 105; // 0x69
    field public static final int OP_SPUT_SHORT = 109; // 0x6d
    field public static final int OP_SPUT_WIDE = 104; // 0x68
    field public static final int OP_SUB_DOUBLE = 172; // 0xac
    field public static final int OP_SUB_DOUBLE_2ADDR = 204; // 0xcc
    field public static final int OP_SUB_FLOAT = 167; // 0xa7
    field public static final int OP_SUB_FLOAT_2ADDR = 199; // 0xc7
    field public static final int OP_SUB_INT = 145; // 0x91
    field public static final int OP_SUB_INT_2ADDR = 177; // 0xb1
    field public static final int OP_SUB_LONG = 156; // 0x9c
    field public static final int OP_SUB_LONG_2ADDR = 188; // 0xbc
    field public static final int OP_THROW = 39; // 0x27
    field public static final int OP_UNUSED_3e = 62; // 0x3e
    field public static final int OP_UNUSED_3f = 63; // 0x3f
    field public static final int OP_UNUSED_40 = 64; // 0x40
    field public static final int OP_UNUSED_41 = 65; // 0x41
    field public static final int OP_UNUSED_42 = 66; // 0x42
    field public static final int OP_UNUSED_43 = 67; // 0x43
    field public static final int OP_UNUSED_73 = 115; // 0x73
    field public static final int OP_UNUSED_79 = 121; // 0x79
    field public static final int OP_UNUSED_7A = 122; // 0x7a
    field public static final int OP_UNUSED_E3 = 227; // 0xe3
    field public static final int OP_UNUSED_E4 = 228; // 0xe4
    field public static final int OP_UNUSED_E5 = 229; // 0xe5
    field public static final int OP_UNUSED_E6 = 230; // 0xe6
    field public static final int OP_UNUSED_E7 = 231; // 0xe7
    field public static final int OP_UNUSED_E8 = 232; // 0xe8
    field public static final int OP_UNUSED_E9 = 233; // 0xe9
    field public static final int OP_UNUSED_EA = 234; // 0xea
    field public static final int OP_UNUSED_EB = 235; // 0xeb
    field public static final int OP_UNUSED_EC = 236; // 0xec
    field public static final int OP_UNUSED_ED = 237; // 0xed
    field public static final int OP_UNUSED_EF = 239; // 0xef
    field public static final int OP_UNUSED_F1 = 241; // 0xf1
    field public static final int OP_UNUSED_FC = 252; // 0xfc
    field public static final int OP_UNUSED_FD = 253; // 0xfd
    field public static final int OP_UNUSED_FE = 254; // 0xfe
    field public static final int OP_UNUSED_FF = 255; // 0xff
    field public static final int OP_USHR_INT = 154; // 0x9a
    field public static final int OP_USHR_INT_2ADDR = 186; // 0xba
    field public static final int OP_USHR_INT_LIT8 = 226; // 0xe2
    field public static final int OP_USHR_LONG = 165; // 0xa5
    field public static final int OP_USHR_LONG_2ADDR = 197; // 0xc5
    field public static final int OP_XOR_INT = 151; // 0x97
    field public static final int OP_XOR_INT_2ADDR = 183; // 0xb7
    field public static final int OP_XOR_INT_LIT16 = 215; // 0xd7
    field public static final int OP_XOR_INT_LIT8 = 223; // 0xdf
    field public static final int OP_XOR_LONG = 162; // 0xa2
    field public static final int OP_XOR_LONG_2ADDR = 194; // 0xc2
  }

}

package dalvik.system {

  public class AllocationLimitError extends java.lang.VirtualMachineError {
    ctor public AllocationLimitError();
    ctor public AllocationLimitError(String);
  }

  public class DexClassLoader extends java.lang.ClassLoader {
    ctor public DexClassLoader(String, String, String, ClassLoader);
  }

  public final class DexFile {
    ctor public DexFile(java.io.File) throws java.io.IOException;
    ctor public DexFile(String) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public java.util.Enumeration<java.lang.String> entries();
    method protected void finalize() throws java.io.IOException;
    method public String getName();
    method public static boolean isDexOptNeeded(String) throws java.io.FileNotFoundException, java.io.IOException;
    method public Class loadClass(String, ClassLoader);
    method public static dalvik.system.DexFile loadDex(String, String, int) throws java.io.IOException;
  }

  public class PathClassLoader extends java.lang.ClassLoader {
    ctor public PathClassLoader(String, ClassLoader);
    ctor public PathClassLoader(String, String, ClassLoader);
    method protected java.util.Enumeration<java.net.URL> findResources(String);
  }

  public class PotentialDeadlockError extends java.lang.VirtualMachineError {
    ctor public PotentialDeadlockError();
    ctor public PotentialDeadlockError(String);
  }

  public class StaleDexCacheError extends java.lang.VirtualMachineError {
    ctor public StaleDexCacheError();
    ctor public StaleDexCacheError(String);
  }

  public class TemporaryDirectory {
    ctor public TemporaryDirectory();
    method public static void setUpDirectory(String);
    method public static void setUpDirectory(java.io.File);
  }

  public class TouchDex {
    ctor public TouchDex();
    method public static void main(String[]);
    method public static int start(String);
  }

  public final class VMDebug {
    method public static void dumpHprofData(String) throws java.io.IOException;
    method public static int getAllocCount(int);
    method public static void getInstructionCount(int[]);
    method public static int getLoadedClassCount();
    method public static boolean isDebuggerConnected();
    method public static boolean isDebuggingEnabled();
    method public static long lastDebuggerActivity();
    method public static void printLoadedClasses(int);
    method public static void resetAllocCount(int);
    method public static void resetInstructionCount();
    method public static int setAllocationLimit(int);
    method public static int setGlobalAllocationLimit(int);
    method public static void startAllocCounting();
    method public static void startEmulatorTracing();
    method public static void startInstructionCounting();
    method public static void startMethodTracing();
    method public static void startMethodTracing(String, int, int);
    method public static void stopAllocCounting();
    method public static void stopEmulatorTracing();
    method public static void stopInstructionCounting();
    method public static void stopMethodTracing();
    method public static long threadCpuTimeNanos();
    field public static final String DEFAULT_METHOD_TRACE_FILE_NAME = "/sdcard/dmtrace.trace";
    field public static final int KIND_ALL_COUNTS = -1; // 0xffffffff
    field public static final int KIND_GLOBAL_ALLOCATED_BYTES = 2; // 0x2
    field public static final int KIND_GLOBAL_ALLOCATED_OBJECTS = 1; // 0x1
    field public static final int KIND_GLOBAL_EXT_ALLOCATED_BYTES = 8192; // 0x2000
    field public static final int KIND_GLOBAL_EXT_ALLOCATED_OBJECTS = 4096; // 0x1000
    field public static final int KIND_GLOBAL_EXT_FREED_BYTES = 32768; // 0x8000
    field public static final int KIND_GLOBAL_EXT_FREED_OBJECTS = 16384; // 0x4000
    field public static final int KIND_GLOBAL_FREED_BYTES = 8; // 0x8
    field public static final int KIND_GLOBAL_FREED_OBJECTS = 4; // 0x4
    field public static final int KIND_GLOBAL_GC_INVOCATIONS = 16; // 0x10
    field public static final int KIND_THREAD_ALLOCATED_BYTES = 131072; // 0x20000
    field public static final int KIND_THREAD_ALLOCATED_OBJECTS = 65536; // 0x10000
    field public static final int KIND_THREAD_EXT_ALLOCATED_BYTES = 536870912; // 0x20000000
    field public static final int KIND_THREAD_EXT_ALLOCATED_OBJECTS = 268435456; // 0x10000000
    field public static final int KIND_THREAD_EXT_FREED_BYTES = -2147483648; // 0x80000000
    field public static final int KIND_THREAD_EXT_FREED_OBJECTS = 1073741824; // 0x40000000
    field public static final int KIND_THREAD_FREED_BYTES = 524288; // 0x80000
    field public static final int KIND_THREAD_FREED_OBJECTS = 262144; // 0x40000
    field public static final int KIND_THREAD_GC_INVOCATIONS = 1048576; // 0x100000
    field public static final int TRACE_COUNT_ALLOCS = 1; // 0x1
  }

  public final class VMRuntime {
    method public void gcSoftReferences();
    method public long getExternalBytesAllocated();
    method public long getMinimumHeapSize();
    method public static dalvik.system.VMRuntime getRuntime();
    method public float getTargetHeapUtilization();
    method public void runFinalizationSync();
    method public long setMinimumHeapSize(long);
    method public float setTargetHeapUtilization(float);
  }

  public final class VMStack {
    ctor public VMStack();
    method public static ClassLoader getCallingClassLoader();
    method public static ClassLoader getCallingClassLoader2();
    method public static Class<?>[] getClasses(int, boolean);
    method public static StackTraceElement[] getThreadStackTrace(Thread);
  }

  public class Zygote {
    method public static int fork();
    method public static int forkAndSpecialize(int, int, int[], int, int[][]);
    method public static int forkAndSpecialize(int, int, int[], boolean, int[][]);
    method public static int forkSystemServer(int, int, int[], int, int[][]);
    method public static int forkSystemServer(int, int, int[], boolean, int[][]);
    field public static final int DEBUG_ENABLE_ASSERT = 4; // 0x4
    field public static final int DEBUG_ENABLE_CHECKJNI = 2; // 0x2
    field public static final int DEBUG_ENABLE_DEBUGGER = 1; // 0x1
  }

}

package java.awt.font {

  public final class NumericShaper implements java.io.Serializable {
    method public static java.awt.font.NumericShaper getContextualShaper(int, int);
    method public static java.awt.font.NumericShaper getContextualShaper(int);
    method public int getRanges();
    method public static java.awt.font.NumericShaper getShaper(int);
    method public boolean isContextual();
    method public void shape(char[], int, int, int);
    method public void shape(char[], int, int);
    field public static final int ALL_RANGES = 524287; // 0x7ffff
    field public static final int ARABIC = 2; // 0x2
    field public static final int BENGALI = 16; // 0x10
    field public static final int DEVANAGARI = 8; // 0x8
    field public static final int EASTERN_ARABIC = 4; // 0x4
    field public static final int ETHIOPIC = 65536; // 0x10000
    field public static final int EUROPEAN = 1; // 0x1
    field public static final int GUJARATI = 64; // 0x40
    field public static final int GURMUKHI = 32; // 0x20
    field public static final int KANNADA = 1024; // 0x400
    field public static final int KHMER = 131072; // 0x20000
    field public static final int LAO = 8192; // 0x2000
    field public static final int MALAYALAM = 2048; // 0x800
    field public static final int MONGOLIAN = 262144; // 0x40000
    field public static final int MYANMAR = 32768; // 0x8000
    field public static final int ORIYA = 128; // 0x80
    field public static final int TAMIL = 256; // 0x100
    field public static final int TELUGU = 512; // 0x200
    field public static final int THAI = 4096; // 0x1000
    field public static final int TIBETAN = 16384; // 0x4000
  }

  public final class TextAttribute extends java.text.AttributedCharacterIterator.Attribute {
    ctor protected TextAttribute(String);
    field public static final java.awt.font.TextAttribute BACKGROUND;
    field public static final java.awt.font.TextAttribute BIDI_EMBEDDING;
    field public static final java.awt.font.TextAttribute CHAR_REPLACEMENT;
    field public static final java.awt.font.TextAttribute FAMILY;
    field public static final java.awt.font.TextAttribute FONT;
    field public static final java.awt.font.TextAttribute FOREGROUND;
    field public static final java.awt.font.TextAttribute INPUT_METHOD_HIGHLIGHT;
    field public static final java.awt.font.TextAttribute INPUT_METHOD_UNDERLINE;
    field public static final java.awt.font.TextAttribute JUSTIFICATION;
    field public static final Float JUSTIFICATION_FULL;
    field public static final Float JUSTIFICATION_NONE;
    field public static final java.awt.font.TextAttribute NUMERIC_SHAPING;
    field public static final java.awt.font.TextAttribute POSTURE;
    field public static final Float POSTURE_OBLIQUE;
    field public static final Float POSTURE_REGULAR;
    field public static final java.awt.font.TextAttribute RUN_DIRECTION;
    field public static final Boolean RUN_DIRECTION_LTR;
    field public static final Boolean RUN_DIRECTION_RTL;
    field public static final java.awt.font.TextAttribute SIZE;
    field public static final java.awt.font.TextAttribute STRIKETHROUGH;
    field public static final Boolean STRIKETHROUGH_ON;
    field public static final java.awt.font.TextAttribute SUPERSCRIPT;
    field public static final Integer SUPERSCRIPT_SUB;
    field public static final Integer SUPERSCRIPT_SUPER;
    field public static final java.awt.font.TextAttribute SWAP_COLORS;
    field public static final Boolean SWAP_COLORS_ON;
    field public static final java.awt.font.TextAttribute TRANSFORM;
    field public static final java.awt.font.TextAttribute UNDERLINE;
    field public static final Integer UNDERLINE_LOW_DASHED;
    field public static final Integer UNDERLINE_LOW_DOTTED;
    field public static final Integer UNDERLINE_LOW_GRAY;
    field public static final Integer UNDERLINE_LOW_ONE_PIXEL;
    field public static final Integer UNDERLINE_LOW_TWO_PIXEL;
    field public static final Integer UNDERLINE_ON;
    field public static final java.awt.font.TextAttribute WEIGHT;
    field public static final Float WEIGHT_BOLD;
    field public static final Float WEIGHT_DEMIBOLD;
    field public static final Float WEIGHT_DEMILIGHT;
    field public static final Float WEIGHT_EXTRABOLD;
    field public static final Float WEIGHT_EXTRA_LIGHT;
    field public static final Float WEIGHT_HEAVY;
    field public static final Float WEIGHT_LIGHT;
    field public static final Float WEIGHT_MEDIUM;
    field public static final Float WEIGHT_REGULAR;
    field public static final Float WEIGHT_SEMIBOLD;
    field public static final Float WEIGHT_ULTRABOLD;
    field public static final java.awt.font.TextAttribute WIDTH;
    field public static final Float WIDTH_CONDENSED;
    field public static final Float WIDTH_EXTENDED;
    field public static final Float WIDTH_REGULAR;
    field public static final Float WIDTH_SEMI_CONDENSED;
    field public static final Float WIDTH_SEMI_EXTENDED;
  }

}

package java.beans {

  public class IndexedPropertyChangeEvent extends java.beans.PropertyChangeEvent {
    ctor public IndexedPropertyChangeEvent(Object, String, Object, Object, int);
    method public int getIndex();
  }

  public class PropertyChangeEvent extends java.util.EventObject {
    ctor public PropertyChangeEvent(Object, String, Object, Object);
    method public Object getNewValue();
    method public Object getOldValue();
    method public Object getPropagationId();
    method public String getPropertyName();
    method public void setPropagationId(Object);
  }

  public interface PropertyChangeListener extends java.util.EventListener {
    method public void propertyChange(java.beans.PropertyChangeEvent);
  }

  public class PropertyChangeListenerProxy extends java.util.EventListenerProxy implements java.beans.PropertyChangeListener {
    ctor public PropertyChangeListenerProxy(String, java.beans.PropertyChangeListener);
    method public String getPropertyName();
    method public void propertyChange(java.beans.PropertyChangeEvent);
  }

  public class PropertyChangeSupport implements java.io.Serializable {
    ctor public PropertyChangeSupport(Object);
    method public void addPropertyChangeListener(String, java.beans.PropertyChangeListener);
    method public void addPropertyChangeListener(java.beans.PropertyChangeListener);
    method public void fireIndexedPropertyChange(String, int, Object, Object);
    method public void fireIndexedPropertyChange(String, int, boolean, boolean);
    method public void fireIndexedPropertyChange(String, int, int, int);
    method public void firePropertyChange(String, Object, Object);
    method public void firePropertyChange(String, boolean, boolean);
    method public void firePropertyChange(String, int, int);
    method public void firePropertyChange(java.beans.PropertyChangeEvent);
    method public java.beans.PropertyChangeListener[] getPropertyChangeListeners(String);
    method public java.beans.PropertyChangeListener[] getPropertyChangeListeners();
    method public boolean hasListeners(String);
    method public void removePropertyChangeListener(String, java.beans.PropertyChangeListener);
    method public void removePropertyChangeListener(java.beans.PropertyChangeListener);
  }

}

package java.io {

  public class BufferedInputStream extends java.io.FilterInputStream {
    ctor public BufferedInputStream(java.io.InputStream);
    ctor public BufferedInputStream(java.io.InputStream, int);
    field protected volatile byte[] buf;
    field protected int count;
    field protected int marklimit;
    field protected int markpos;
    field protected int pos;
  }

  public class BufferedOutputStream extends java.io.FilterOutputStream {
    ctor public BufferedOutputStream(java.io.OutputStream);
    ctor public BufferedOutputStream(java.io.OutputStream, int);
    field protected byte[] buf;
    field protected int count;
  }

  public class BufferedReader extends java.io.Reader {
    ctor public BufferedReader(java.io.Reader);
    ctor public BufferedReader(java.io.Reader, int);
    method public void close() throws java.io.IOException;
    method public int read(char[], int, int) throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
  }

  public class BufferedWriter extends java.io.Writer {
    ctor public BufferedWriter(java.io.Writer);
    ctor public BufferedWriter(java.io.Writer, int);
    method public void close() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public void newLine() throws java.io.IOException;
    method public void write(char[], int, int) throws java.io.IOException;
  }

  public class ByteArrayInputStream extends java.io.InputStream {
    ctor public ByteArrayInputStream(byte[]);
    ctor public ByteArrayInputStream(byte[], int, int);
    method public int available();
    method public int read();
    method public int read(byte[], int, int);
    method public void reset();
    method public long skip(long);
    field protected byte[] buf;
    field protected int count;
    field protected int mark;
    field protected int pos;
  }

  public class ByteArrayOutputStream extends java.io.OutputStream {
    ctor public ByteArrayOutputStream();
    ctor public ByteArrayOutputStream(int);
    method public void reset();
    method public int size();
    method public byte[] toByteArray();
    method public String toString(int);
    method public String toString(String) throws java.io.UnsupportedEncodingException;
    method public void write(byte[], int, int);
    method public void write(int);
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
    field protected byte[] buf;
    field protected int count;
  }

  public class CharArrayReader extends java.io.Reader {
    ctor public CharArrayReader(char[]);
    ctor public CharArrayReader(char[], int, int);
    method public void close();
    method public int read(char[], int, int) throws java.io.IOException;
    field protected char[] buf;
    field protected int count;
    field protected int markedPos;
    field protected int pos;
  }

  public class CharArrayWriter extends java.io.Writer {
    ctor public CharArrayWriter();
    ctor public CharArrayWriter(int);
    method public java.io.CharArrayWriter append(char);
    method public java.io.CharArrayWriter append(CharSequence);
    method public java.io.CharArrayWriter append(CharSequence, int, int);
    method public void close();
    method public void flush();
    method public void reset();
    method public int size();
    method public char[] toCharArray();
    method public void write(char[], int, int);
    method public void write(int);
    method public void write(String, int, int);
    method public void writeTo(java.io.Writer) throws java.io.IOException;
    field protected char[] buf;
    field protected int count;
  }

  public class CharConversionException extends java.io.IOException {
    ctor public CharConversionException();
    ctor public CharConversionException(String);
  }

  public interface Closeable {
    method public void close() throws java.io.IOException;
  }

  public interface DataInput {
    method public boolean readBoolean() throws java.io.IOException;
    method public byte readByte() throws java.io.IOException;
    method public char readChar() throws java.io.IOException;
    method public double readDouble() throws java.io.IOException;
    method public float readFloat() throws java.io.IOException;
    method public void readFully(byte[]) throws java.io.IOException;
    method public void readFully(byte[], int, int) throws java.io.IOException;
    method public int readInt() throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
    method public long readLong() throws java.io.IOException;
    method public short readShort() throws java.io.IOException;
    method public String readUTF() throws java.io.IOException;
    method public int readUnsignedByte() throws java.io.IOException;
    method public int readUnsignedShort() throws java.io.IOException;
    method public int skipBytes(int) throws java.io.IOException;
  }

  public class DataInputStream extends java.io.FilterInputStream implements java.io.DataInput {
    ctor public DataInputStream(java.io.InputStream);
    method public final int read(byte[]) throws java.io.IOException;
    method public final int read(byte[], int, int) throws java.io.IOException;
    method public final boolean readBoolean() throws java.io.IOException;
    method public final byte readByte() throws java.io.IOException;
    method public final char readChar() throws java.io.IOException;
    method public final double readDouble() throws java.io.IOException;
    method public final float readFloat() throws java.io.IOException;
    method public final void readFully(byte[]) throws java.io.IOException;
    method public final void readFully(byte[], int, int) throws java.io.IOException;
    method public final int readInt() throws java.io.IOException;
    method public final String readLine() throws java.io.IOException;
    method public final long readLong() throws java.io.IOException;
    method public final short readShort() throws java.io.IOException;
    method public final String readUTF() throws java.io.IOException;
    method public static final String readUTF(java.io.DataInput) throws java.io.IOException;
    method public final int readUnsignedByte() throws java.io.IOException;
    method public final int readUnsignedShort() throws java.io.IOException;
    method public final int skipBytes(int) throws java.io.IOException;
  }

  public interface DataOutput {
    method public void write(byte[]) throws java.io.IOException;
    method public void write(byte[], int, int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void writeBoolean(boolean) throws java.io.IOException;
    method public void writeByte(int) throws java.io.IOException;
    method public void writeBytes(String) throws java.io.IOException;
    method public void writeChar(int) throws java.io.IOException;
    method public void writeChars(String) throws java.io.IOException;
    method public void writeDouble(double) throws java.io.IOException;
    method public void writeFloat(float) throws java.io.IOException;
    method public void writeInt(int) throws java.io.IOException;
    method public void writeLong(long) throws java.io.IOException;
    method public void writeShort(int) throws java.io.IOException;
    method public void writeUTF(String) throws java.io.IOException;
  }

  public class DataOutputStream extends java.io.FilterOutputStream implements java.io.DataOutput {
    ctor public DataOutputStream(java.io.OutputStream);
    method public final int size();
    method public final void writeBoolean(boolean) throws java.io.IOException;
    method public final void writeByte(int) throws java.io.IOException;
    method public final void writeBytes(String) throws java.io.IOException;
    method public final void writeChar(int) throws java.io.IOException;
    method public final void writeChars(String) throws java.io.IOException;
    method public final void writeDouble(double) throws java.io.IOException;
    method public final void writeFloat(float) throws java.io.IOException;
    method public final void writeInt(int) throws java.io.IOException;
    method public final void writeLong(long) throws java.io.IOException;
    method public final void writeShort(int) throws java.io.IOException;
    method public final void writeUTF(String) throws java.io.IOException;
    field protected int written;
  }

  public class EOFException extends java.io.IOException {
    ctor public EOFException();
    ctor public EOFException(String);
  }

  public interface Externalizable extends java.io.Serializable {
    method public void readExternal(java.io.ObjectInput) throws java.lang.ClassNotFoundException, java.io.IOException;
    method public void writeExternal(java.io.ObjectOutput) throws java.io.IOException;
  }

  public class File implements java.lang.Comparable<java.io.File> java.io.Serializable {
    ctor public File(java.io.File, String);
    ctor public File(String);
    ctor public File(String, String);
    ctor public File(java.net.URI);
    method public boolean canRead();
    method public boolean canWrite();
    method public int compareTo(java.io.File);
    method public boolean createNewFile() throws java.io.IOException;
    method public static java.io.File createTempFile(String, String) throws java.io.IOException;
    method public static java.io.File createTempFile(String, String, java.io.File) throws java.io.IOException;
    method public boolean delete();
    method public void deleteOnExit();
    method public boolean exists();
    method public java.io.File getAbsoluteFile();
    method public String getAbsolutePath();
    method public java.io.File getCanonicalFile() throws java.io.IOException;
    method public String getCanonicalPath() throws java.io.IOException;
    method public String getName();
    method public String getParent();
    method public java.io.File getParentFile();
    method public String getPath();
    method public boolean isAbsolute();
    method public boolean isDirectory();
    method public boolean isFile();
    method public boolean isHidden();
    method public long lastModified();
    method public long length();
    method public String[] list();
    method public String[] list(java.io.FilenameFilter);
    method public java.io.File[] listFiles();
    method public java.io.File[] listFiles(java.io.FilenameFilter);
    method public java.io.File[] listFiles(java.io.FileFilter);
    method public static java.io.File[] listRoots();
    method public boolean mkdir();
    method public boolean mkdirs();
    method public boolean renameTo(java.io.File);
    method public boolean setLastModified(long);
    method public boolean setReadOnly();
    method public java.net.URI toURI();
    method public java.net.URL toURL() throws java.net.MalformedURLException;
    field public static final String pathSeparator;
    field public static final char pathSeparatorChar;
    field public static final String separator;
    field public static final char separatorChar;
  }

  public final class FileDescriptor {
    ctor public FileDescriptor();
    method public void sync() throws java.io.SyncFailedException;
    method public boolean valid();
    field public static final java.io.FileDescriptor err;
    field public static final java.io.FileDescriptor in;
    field public static final java.io.FileDescriptor out;
  }

  public interface FileFilter {
    method public boolean accept(java.io.File);
  }

  public class FileInputStream extends java.io.InputStream implements java.io.Closeable {
    ctor public FileInputStream(java.io.File) throws java.io.FileNotFoundException;
    ctor public FileInputStream(java.io.FileDescriptor);
    ctor public FileInputStream(String) throws java.io.FileNotFoundException;
    method protected void finalize() throws java.io.IOException;
    method public java.nio.channels.FileChannel getChannel();
    method public final java.io.FileDescriptor getFD() throws java.io.IOException;
    method public int read() throws java.io.IOException;
  }

  public class FileNotFoundException extends java.io.IOException {
    ctor public FileNotFoundException();
    ctor public FileNotFoundException(String);
  }

  public class FileOutputStream extends java.io.OutputStream implements java.io.Closeable {
    ctor public FileOutputStream(java.io.File) throws java.io.FileNotFoundException;
    ctor public FileOutputStream(java.io.File, boolean) throws java.io.FileNotFoundException;
    ctor public FileOutputStream(java.io.FileDescriptor);
    ctor public FileOutputStream(String) throws java.io.FileNotFoundException;
    ctor public FileOutputStream(String, boolean) throws java.io.FileNotFoundException;
    method protected void finalize() throws java.io.IOException;
    method public java.nio.channels.FileChannel getChannel();
    method public final java.io.FileDescriptor getFD() throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
  }

  public final class FilePermission extends java.security.Permission implements java.io.Serializable {
    ctor public FilePermission(String, String);
    method public String getActions();
    method public boolean implies(java.security.Permission);
  }

  public class FileReader extends java.io.InputStreamReader {
    ctor public FileReader(java.io.File) throws java.io.FileNotFoundException;
    ctor public FileReader(java.io.FileDescriptor);
    ctor public FileReader(String) throws java.io.FileNotFoundException;
  }

  public class FileWriter extends java.io.OutputStreamWriter {
    ctor public FileWriter(java.io.File) throws java.io.IOException;
    ctor public FileWriter(java.io.File, boolean) throws java.io.IOException;
    ctor public FileWriter(java.io.FileDescriptor);
    ctor public FileWriter(String) throws java.io.IOException;
    ctor public FileWriter(String, boolean) throws java.io.IOException;
  }

  public interface FilenameFilter {
    method public boolean accept(java.io.File, String);
  }

  public class FilterInputStream extends java.io.InputStream {
    ctor protected FilterInputStream(java.io.InputStream);
    method public int read() throws java.io.IOException;
    field protected volatile java.io.InputStream in;
  }

  public class FilterOutputStream extends java.io.OutputStream {
    ctor public FilterOutputStream(java.io.OutputStream);
    method public void write(int) throws java.io.IOException;
    field protected java.io.OutputStream out;
  }

  public abstract class FilterReader extends java.io.Reader {
    ctor protected FilterReader(java.io.Reader);
    method public void close() throws java.io.IOException;
    method public int read(char[], int, int) throws java.io.IOException;
    field protected java.io.Reader in;
  }

  public abstract class FilterWriter extends java.io.Writer {
    ctor protected FilterWriter(java.io.Writer);
    method public void close() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public void write(char[], int, int) throws java.io.IOException;
    field protected java.io.Writer out;
  }

  public interface Flushable {
    method public void flush() throws java.io.IOException;
  }

  public class IOException extends java.lang.Exception {
    ctor public IOException();
    ctor public IOException(String);
  }

  public abstract class InputStream implements java.io.Closeable {
    ctor public InputStream();
    method public int available() throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public void mark(int);
    method public boolean markSupported();
    method public abstract int read() throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public void reset() throws java.io.IOException;
    method public long skip(long) throws java.io.IOException;
  }

  public class InputStreamReader extends java.io.Reader {
    ctor public InputStreamReader(java.io.InputStream);
    ctor public InputStreamReader(java.io.InputStream, String) throws java.io.UnsupportedEncodingException;
    ctor public InputStreamReader(java.io.InputStream, java.nio.charset.CharsetDecoder);
    ctor public InputStreamReader(java.io.InputStream, java.nio.charset.Charset);
    method public void close() throws java.io.IOException;
    method public String getEncoding();
    method public int read(char[], int, int) throws java.io.IOException;
  }

  public class InterruptedIOException extends java.io.IOException {
    ctor public InterruptedIOException();
    ctor public InterruptedIOException(String);
    field public int bytesTransferred;
  }

  public class InvalidClassException extends java.io.ObjectStreamException {
    ctor public InvalidClassException(String);
    ctor public InvalidClassException(String, String);
    field public String classname;
  }

  public class InvalidObjectException extends java.io.ObjectStreamException {
    ctor public InvalidObjectException(String);
  }

  @Deprecated public class LineNumberInputStream extends java.io.FilterInputStream {
    ctor public LineNumberInputStream(java.io.InputStream);
    method public int getLineNumber();
    method public void setLineNumber(int);
  }

  public class LineNumberReader extends java.io.BufferedReader {
    ctor public LineNumberReader(java.io.Reader);
    ctor public LineNumberReader(java.io.Reader, int);
    method public int getLineNumber();
    method public void setLineNumber(int);
  }

  public class NotActiveException extends java.io.ObjectStreamException {
    ctor public NotActiveException();
    ctor public NotActiveException(String);
  }

  public class NotSerializableException extends java.io.ObjectStreamException {
    ctor public NotSerializableException();
    ctor public NotSerializableException(String);
  }

  public interface ObjectInput extends java.io.DataInput {
    method public int available() throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException;
    method public long skip(long) throws java.io.IOException;
  }

  public class ObjectInputStream extends java.io.InputStream implements java.io.ObjectInput java.io.ObjectStreamConstants {
    ctor protected ObjectInputStream() throws java.io.IOException, java.lang.SecurityException;
    ctor public ObjectInputStream(java.io.InputStream) throws java.io.IOException, java.io.StreamCorruptedException;
    method public void defaultReadObject() throws java.lang.ClassNotFoundException, java.io.IOException, java.io.NotActiveException;
    method protected boolean enableResolveObject(boolean) throws java.lang.SecurityException;
    method public int read() throws java.io.IOException;
    method public boolean readBoolean() throws java.io.IOException;
    method public byte readByte() throws java.io.IOException;
    method public char readChar() throws java.io.IOException;
    method protected java.io.ObjectStreamClass readClassDescriptor() throws java.lang.ClassNotFoundException, java.io.IOException;
    method public double readDouble() throws java.io.IOException;
    method public java.io.ObjectInputStream.GetField readFields() throws java.lang.ClassNotFoundException, java.io.IOException, java.io.NotActiveException;
    method public float readFloat() throws java.io.IOException;
    method public void readFully(byte[]) throws java.io.IOException;
    method public void readFully(byte[], int, int) throws java.io.IOException;
    method public int readInt() throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
    method public long readLong() throws java.io.IOException;
    method public final Object readObject() throws java.lang.ClassNotFoundException, java.io.IOException, java.io.OptionalDataException;
    method protected Object readObjectOverride() throws java.lang.ClassNotFoundException, java.io.IOException, java.io.OptionalDataException;
    method public short readShort() throws java.io.IOException;
    method protected void readStreamHeader() throws java.io.IOException, java.io.StreamCorruptedException;
    method public String readUTF() throws java.io.IOException;
    method public Object readUnshared() throws java.lang.ClassNotFoundException, java.io.IOException;
    method public int readUnsignedByte() throws java.io.IOException;
    method public int readUnsignedShort() throws java.io.IOException;
    method public void registerValidation(java.io.ObjectInputValidation, int) throws java.io.InvalidObjectException, java.io.NotActiveException;
    method protected Class<?> resolveClass(java.io.ObjectStreamClass) throws java.lang.ClassNotFoundException, java.io.IOException;
    method protected Object resolveObject(Object) throws java.io.IOException;
    method protected Class<?> resolveProxyClass(String[]) throws java.lang.ClassNotFoundException, java.io.IOException;
    method public int skipBytes(int) throws java.io.IOException;
  }

  public abstract static class ObjectInputStream.GetField {
    ctor public ObjectInputStream.GetField();
    method public abstract boolean defaulted(String) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract boolean get(String, boolean) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract char get(String, char) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract byte get(String, byte) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract short get(String, short) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract int get(String, int) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract long get(String, long) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract float get(String, float) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract double get(String, double) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract Object get(String, Object) throws java.io.IOException, java.lang.IllegalArgumentException;
    method public abstract java.io.ObjectStreamClass getObjectStreamClass();
  }

  public interface ObjectInputValidation {
    method public void validateObject() throws java.io.InvalidObjectException;
  }

  public interface ObjectOutput extends java.io.DataOutput {
    method public void close() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public void writeObject(Object) throws java.io.IOException;
  }

  public class ObjectOutputStream extends java.io.OutputStream implements java.io.ObjectOutput java.io.ObjectStreamConstants {
    ctor protected ObjectOutputStream() throws java.io.IOException, java.lang.SecurityException;
    ctor public ObjectOutputStream(java.io.OutputStream) throws java.io.IOException;
    method protected void annotateClass(Class<?>) throws java.io.IOException;
    method protected void annotateProxyClass(Class<?>) throws java.io.IOException;
    method public void defaultWriteObject() throws java.io.IOException;
    method protected void drain() throws java.io.IOException;
    method protected boolean enableReplaceObject(boolean) throws java.lang.SecurityException;
    method public java.io.ObjectOutputStream.PutField putFields() throws java.io.IOException;
    method protected Object replaceObject(Object) throws java.io.IOException;
    method public void reset() throws java.io.IOException;
    method public void useProtocolVersion(int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void writeBoolean(boolean) throws java.io.IOException;
    method public void writeByte(int) throws java.io.IOException;
    method public void writeBytes(String) throws java.io.IOException;
    method public void writeChar(int) throws java.io.IOException;
    method public void writeChars(String) throws java.io.IOException;
    method protected void writeClassDescriptor(java.io.ObjectStreamClass) throws java.io.IOException;
    method public void writeDouble(double) throws java.io.IOException;
    method public void writeFields() throws java.io.IOException;
    method public void writeFloat(float) throws java.io.IOException;
    method public void writeInt(int) throws java.io.IOException;
    method public void writeLong(long) throws java.io.IOException;
    method public final void writeObject(Object) throws java.io.IOException;
    method protected void writeObjectOverride(Object) throws java.io.IOException;
    method public void writeShort(int) throws java.io.IOException;
    method protected void writeStreamHeader() throws java.io.IOException;
    method public void writeUTF(String) throws java.io.IOException;
    method public void writeUnshared(Object) throws java.io.IOException;
  }

  public abstract static class ObjectOutputStream.PutField {
    ctor public ObjectOutputStream.PutField();
    method public abstract void put(String, boolean);
    method public abstract void put(String, char);
    method public abstract void put(String, byte);
    method public abstract void put(String, short);
    method public abstract void put(String, int);
    method public abstract void put(String, long);
    method public abstract void put(String, float);
    method public abstract void put(String, double);
    method public abstract void put(String, Object);
    method public abstract void write(java.io.ObjectOutput) throws java.io.IOException;
  }

  public class ObjectStreamClass implements java.io.Serializable {
    method public Class<?> forClass();
    method public java.io.ObjectStreamField getField(String);
    method public java.io.ObjectStreamField[] getFields();
    method public String getName();
    method public long getSerialVersionUID();
    method public static java.io.ObjectStreamClass lookup(Class<?>);
    field public static final java.io.ObjectStreamField[] NO_FIELDS;
  }

  public interface ObjectStreamConstants {
    field public static final int PROTOCOL_VERSION_1 = 1; // 0x1
    field public static final int PROTOCOL_VERSION_2 = 2; // 0x2
    field public static final byte SC_BLOCK_DATA = 8; // 0x8
    field public static final byte SC_ENUM = 16; // 0x10
    field public static final byte SC_EXTERNALIZABLE = 4; // 0x4
    field public static final byte SC_SERIALIZABLE = 2; // 0x2
    field public static final byte SC_WRITE_METHOD = 1; // 0x1
    field public static final short STREAM_MAGIC = -21267; // 0xffffaced
    field public static final short STREAM_VERSION = 5; // 0x5
    field public static final java.io.SerializablePermission SUBCLASS_IMPLEMENTATION_PERMISSION;
    field public static final java.io.SerializablePermission SUBSTITUTION_PERMISSION;
    field public static final byte TC_ARRAY = 117; // 0x75
    field public static final byte TC_BASE = 112; // 0x70
    field public static final byte TC_BLOCKDATA = 119; // 0x77
    field public static final byte TC_BLOCKDATALONG = 122; // 0x7a
    field public static final byte TC_CLASS = 118; // 0x76
    field public static final byte TC_CLASSDESC = 114; // 0x72
    field public static final byte TC_ENDBLOCKDATA = 120; // 0x78
    field public static final byte TC_ENUM = 126; // 0x7e
    field public static final byte TC_EXCEPTION = 123; // 0x7b
    field public static final byte TC_LONGSTRING = 124; // 0x7c
    field public static final byte TC_MAX = 126; // 0x7e
    field public static final byte TC_NULL = 112; // 0x70
    field public static final byte TC_OBJECT = 115; // 0x73
    field public static final byte TC_PROXYCLASSDESC = 125; // 0x7d
    field public static final byte TC_REFERENCE = 113; // 0x71
    field public static final byte TC_RESET = 121; // 0x79
    field public static final byte TC_STRING = 116; // 0x74
    field public static final int baseWireHandle = 8257536; // 0x7e0000
  }

  public abstract class ObjectStreamException extends java.io.IOException {
    ctor protected ObjectStreamException();
    ctor protected ObjectStreamException(String);
  }

  public class ObjectStreamField implements java.lang.Comparable<java.lang.Object> {
    ctor public ObjectStreamField(String, Class<?>);
    ctor public ObjectStreamField(String, Class<?>, boolean);
    method public int compareTo(Object);
    method public String getName();
    method public int getOffset();
    method public Class<?> getType();
    method public char getTypeCode();
    method public String getTypeString();
    method public boolean isPrimitive();
    method public boolean isUnshared();
    method protected void setOffset(int);
  }

  public class OptionalDataException extends java.io.ObjectStreamException {
    field public boolean eof;
    field public int length;
  }

  public abstract class OutputStream implements java.io.Closeable java.io.Flushable {
    ctor public OutputStream();
    method public void close() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public void write(byte[]) throws java.io.IOException;
    method public void write(byte[], int, int) throws java.io.IOException;
    method public abstract void write(int) throws java.io.IOException;
  }

  public class OutputStreamWriter extends java.io.Writer {
    ctor public OutputStreamWriter(java.io.OutputStream);
    ctor public OutputStreamWriter(java.io.OutputStream, String) throws java.io.UnsupportedEncodingException;
    ctor public OutputStreamWriter(java.io.OutputStream, java.nio.charset.Charset);
    ctor public OutputStreamWriter(java.io.OutputStream, java.nio.charset.CharsetEncoder);
    method public void close() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public String getEncoding();
    method public void write(char[], int, int) throws java.io.IOException;
  }

  public class PipedInputStream extends java.io.InputStream {
    ctor public PipedInputStream();
    ctor public PipedInputStream(java.io.PipedOutputStream) throws java.io.IOException;
    method public void connect(java.io.PipedOutputStream) throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method protected void receive(int) throws java.io.IOException;
    field protected static final int PIPE_SIZE = 1024; // 0x400
    field protected byte[] buffer;
    field protected int in;
    field protected int out;
  }

  public class PipedOutputStream extends java.io.OutputStream {
    ctor public PipedOutputStream();
    ctor public PipedOutputStream(java.io.PipedInputStream) throws java.io.IOException;
    method public void connect(java.io.PipedInputStream) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
  }

  public class PipedReader extends java.io.Reader {
    ctor public PipedReader();
    ctor public PipedReader(java.io.PipedWriter) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public void connect(java.io.PipedWriter) throws java.io.IOException;
    method public int read(char[], int, int) throws java.io.IOException;
  }

  public class PipedWriter extends java.io.Writer {
    ctor public PipedWriter();
    ctor public PipedWriter(java.io.PipedReader) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public void connect(java.io.PipedReader) throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public void write(char[], int, int) throws java.io.IOException;
  }

  public class PrintStream extends java.io.FilterOutputStream implements java.lang.Appendable java.io.Closeable {
    ctor public PrintStream(java.io.OutputStream);
    ctor public PrintStream(java.io.OutputStream, boolean);
    ctor public PrintStream(java.io.OutputStream, boolean, String) throws java.io.UnsupportedEncodingException;
    ctor public PrintStream(java.io.File) throws java.io.FileNotFoundException;
    ctor public PrintStream(java.io.File, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public PrintStream(String) throws java.io.FileNotFoundException;
    ctor public PrintStream(String, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    method public java.io.PrintStream append(char);
    method public java.io.PrintStream append(CharSequence);
    method public java.io.PrintStream append(CharSequence, int, int);
    method public boolean checkError();
    method public void close();
    method public void flush();
    method public java.io.PrintStream format(String, java.lang.Object...);
    method public java.io.PrintStream format(java.util.Locale, String, java.lang.Object...);
    method public void print(char[]);
    method public void print(char);
    method public void print(double);
    method public void print(float);
    method public void print(int);
    method public void print(long);
    method public void print(Object);
    method public void print(String);
    method public void print(boolean);
    method public java.io.PrintStream printf(String, java.lang.Object...);
    method public java.io.PrintStream printf(java.util.Locale, String, java.lang.Object...);
    method public void println();
    method public void println(char[]);
    method public void println(char);
    method public void println(double);
    method public void println(float);
    method public void println(int);
    method public void println(long);
    method public void println(Object);
    method public void println(String);
    method public void println(boolean);
    method protected void setError();
    method public void write(byte[], int, int);
    method public void write(int);
  }

  public class PrintWriter extends java.io.Writer {
    ctor public PrintWriter(java.io.OutputStream);
    ctor public PrintWriter(java.io.OutputStream, boolean);
    ctor public PrintWriter(java.io.Writer);
    ctor public PrintWriter(java.io.Writer, boolean);
    ctor public PrintWriter(java.io.File) throws java.io.FileNotFoundException;
    ctor public PrintWriter(java.io.File, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public PrintWriter(String) throws java.io.FileNotFoundException;
    ctor public PrintWriter(String, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    method public java.io.PrintWriter append(char);
    method public java.io.PrintWriter append(CharSequence);
    method public java.io.PrintWriter append(CharSequence, int, int);
    method public boolean checkError();
    method public void close();
    method public void flush();
    method public java.io.PrintWriter format(String, java.lang.Object...);
    method public java.io.PrintWriter format(java.util.Locale, String, java.lang.Object...);
    method public void print(char[]);
    method public void print(char);
    method public void print(double);
    method public void print(float);
    method public void print(int);
    method public void print(long);
    method public void print(Object);
    method public void print(String);
    method public void print(boolean);
    method public java.io.PrintWriter printf(String, java.lang.Object...);
    method public java.io.PrintWriter printf(java.util.Locale, String, java.lang.Object...);
    method public void println();
    method public void println(char[]);
    method public void println(char);
    method public void println(double);
    method public void println(float);
    method public void println(int);
    method public void println(long);
    method public void println(Object);
    method public void println(String);
    method public void println(boolean);
    method protected void setError();
    method public void write(char[]);
    method public void write(char[], int, int);
    method public void write(int);
    method public void write(String);
    method public void write(String, int, int);
    field protected java.io.Writer out;
  }

  public class PushbackInputStream extends java.io.FilterInputStream {
    ctor public PushbackInputStream(java.io.InputStream);
    ctor public PushbackInputStream(java.io.InputStream, int);
    method public void unread(byte[]) throws java.io.IOException;
    method public void unread(byte[], int, int) throws java.io.IOException;
    method public void unread(int) throws java.io.IOException;
    field protected byte[] buf;
    field protected int pos;
  }

  public class PushbackReader extends java.io.FilterReader {
    ctor public PushbackReader(java.io.Reader);
    ctor public PushbackReader(java.io.Reader, int);
    method public void unread(char[]) throws java.io.IOException;
    method public void unread(char[], int, int) throws java.io.IOException;
    method public void unread(int) throws java.io.IOException;
  }

  public class RandomAccessFile implements java.io.Closeable java.io.DataInput java.io.DataOutput {
    ctor public RandomAccessFile(java.io.File, String) throws java.io.FileNotFoundException;
    ctor public RandomAccessFile(String, String) throws java.io.FileNotFoundException;
    method public void close() throws java.io.IOException;
    method public final java.nio.channels.FileChannel getChannel();
    method public final java.io.FileDescriptor getFD() throws java.io.IOException;
    method public long getFilePointer() throws java.io.IOException;
    method public long length() throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public final boolean readBoolean() throws java.io.IOException;
    method public final byte readByte() throws java.io.IOException;
    method public final char readChar() throws java.io.IOException;
    method public final double readDouble() throws java.io.IOException;
    method public final float readFloat() throws java.io.IOException;
    method public final void readFully(byte[]) throws java.io.IOException;
    method public final void readFully(byte[], int, int) throws java.io.IOException;
    method public final int readInt() throws java.io.IOException;
    method public final String readLine() throws java.io.IOException;
    method public final long readLong() throws java.io.IOException;
    method public final short readShort() throws java.io.IOException;
    method public final String readUTF() throws java.io.IOException;
    method public final int readUnsignedByte() throws java.io.IOException;
    method public final int readUnsignedShort() throws java.io.IOException;
    method public void seek(long) throws java.io.IOException;
    method public void setLength(long) throws java.io.IOException;
    method public int skipBytes(int) throws java.io.IOException;
    method public void write(byte[]) throws java.io.IOException;
    method public void write(byte[], int, int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public final void writeBoolean(boolean) throws java.io.IOException;
    method public final void writeByte(int) throws java.io.IOException;
    method public final void writeBytes(String) throws java.io.IOException;
    method public final void writeChar(int) throws java.io.IOException;
    method public final void writeChars(String) throws java.io.IOException;
    method public final void writeDouble(double) throws java.io.IOException;
    method public final void writeFloat(float) throws java.io.IOException;
    method public final void writeInt(int) throws java.io.IOException;
    method public final void writeLong(long) throws java.io.IOException;
    method public final void writeShort(int) throws java.io.IOException;
    method public final void writeUTF(String) throws java.io.IOException;
  }

  public abstract class Reader implements java.io.Closeable java.lang.Readable {
    ctor protected Reader();
    ctor protected Reader(Object);
    method public void mark(int) throws java.io.IOException;
    method public boolean markSupported();
    method public int read() throws java.io.IOException;
    method public int read(char[]) throws java.io.IOException;
    method public abstract int read(char[], int, int) throws java.io.IOException;
    method public int read(java.nio.CharBuffer) throws java.io.IOException;
    method public boolean ready() throws java.io.IOException;
    method public void reset() throws java.io.IOException;
    method public long skip(long) throws java.io.IOException;
    field protected Object lock;
  }

  public class SequenceInputStream extends java.io.InputStream {
    ctor public SequenceInputStream(java.io.InputStream, java.io.InputStream);
    ctor public SequenceInputStream(java.util.Enumeration<? extends java.io.InputStream>);
    method public int read() throws java.io.IOException;
  }

  public interface Serializable {
  }

  public final class SerializablePermission extends java.security.BasicPermission {
    ctor public SerializablePermission(String);
    ctor public SerializablePermission(String, String);
  }

  public class StreamCorruptedException extends java.io.ObjectStreamException {
    ctor public StreamCorruptedException();
    ctor public StreamCorruptedException(String);
  }

  public class StreamTokenizer {
    ctor public StreamTokenizer(java.io.InputStream);
    ctor public StreamTokenizer(java.io.Reader);
    method public void commentChar(int);
    method public void eolIsSignificant(boolean);
    method public int lineno();
    method public void lowerCaseMode(boolean);
    method public int nextToken() throws java.io.IOException;
    method public void ordinaryChar(int);
    method public void ordinaryChars(int, int);
    method public void parseNumbers();
    method public void pushBack();
    method public void quoteChar(int);
    method public void resetSyntax();
    method public void slashSlashComments(boolean);
    method public void slashStarComments(boolean);
    method public void whitespaceChars(int, int);
    method public void wordChars(int, int);
    field public static final int TT_EOF = -1; // 0xffffffff
    field public static final int TT_EOL = 10; // 0xa
    field public static final int TT_NUMBER = -2; // 0xfffffffe
    field public static final int TT_WORD = -3; // 0xfffffffd
    field public double nval;
    field public String sval;
    field public int ttype;
  }

  @Deprecated public class StringBufferInputStream extends java.io.InputStream {
    ctor public StringBufferInputStream(String);
    method public int available();
    method public int read();
    method public int read(byte[], int, int);
    method public void reset();
    method public long skip(long);
    field protected String buffer;
    field protected int count;
    field protected int pos;
  }

  public class StringReader extends java.io.Reader {
    ctor public StringReader(String);
    method public void close();
    method public int read(char[], int, int) throws java.io.IOException;
  }

  public class StringWriter extends java.io.Writer {
    ctor public StringWriter();
    ctor public StringWriter(int);
    method public java.io.StringWriter append(char);
    method public java.io.StringWriter append(CharSequence);
    method public java.io.StringWriter append(CharSequence, int, int);
    method public void close() throws java.io.IOException;
    method public void flush();
    method public StringBuffer getBuffer();
    method public void write(char[], int, int);
    method public void write(int);
    method public void write(String);
    method public void write(String, int, int);
  }

  public class SyncFailedException extends java.io.IOException {
    ctor public SyncFailedException(String);
  }

  public class UTFDataFormatException extends java.io.IOException {
    ctor public UTFDataFormatException();
    ctor public UTFDataFormatException(String);
  }

  public class UnsupportedEncodingException extends java.io.IOException {
    ctor public UnsupportedEncodingException();
    ctor public UnsupportedEncodingException(String);
  }

  public class WriteAbortedException extends java.io.ObjectStreamException {
    ctor public WriteAbortedException(String, Exception);
    field public Exception detail;
  }

  public abstract class Writer implements java.lang.Appendable java.io.Closeable java.io.Flushable {
    ctor protected Writer();
    ctor protected Writer(Object);
    method public java.io.Writer append(char) throws java.io.IOException;
    method public java.io.Writer append(CharSequence) throws java.io.IOException;
    method public java.io.Writer append(CharSequence, int, int) throws java.io.IOException;
    method public void write(char[]) throws java.io.IOException;
    method public abstract void write(char[], int, int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void write(String) throws java.io.IOException;
    method public void write(String, int, int) throws java.io.IOException;
    field protected Object lock;
  }

}

package java.lang {

  public class AbstractMethodError extends java.lang.IncompatibleClassChangeError {
    ctor public AbstractMethodError();
    ctor public AbstractMethodError(String);
  }

  public interface Appendable {
    method public Appendable append(char) throws java.io.IOException;
    method public Appendable append(CharSequence) throws java.io.IOException;
    method public Appendable append(CharSequence, int, int) throws java.io.IOException;
  }

  public class ArithmeticException extends java.lang.RuntimeException {
    ctor public ArithmeticException();
    ctor public ArithmeticException(String);
  }

  public class ArrayIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
    ctor public ArrayIndexOutOfBoundsException();
    ctor public ArrayIndexOutOfBoundsException(int);
    ctor public ArrayIndexOutOfBoundsException(String);
  }

  public class ArrayStoreException extends java.lang.RuntimeException {
    ctor public ArrayStoreException();
    ctor public ArrayStoreException(String);
  }

  public class AssertionError extends java.lang.Error {
    ctor public AssertionError();
    ctor public AssertionError(Object);
    ctor public AssertionError(boolean);
    ctor public AssertionError(char);
    ctor public AssertionError(int);
    ctor public AssertionError(long);
    ctor public AssertionError(float);
    ctor public AssertionError(double);
  }

  public final class Boolean implements java.lang.Comparable<java.lang.Boolean> java.io.Serializable {
    ctor public Boolean(String);
    ctor public Boolean(boolean);
    method public boolean booleanValue();
    method public int compareTo(Boolean);
    method public static boolean getBoolean(String);
    method public static boolean parseBoolean(String);
    method public static String toString(boolean);
    method public static Boolean valueOf(String);
    method public static Boolean valueOf(boolean);
    field public static final Boolean FALSE;
    field public static final Boolean TRUE;
    field public static final Class<java.lang.Boolean> TYPE;
  }

  public final class Byte extends java.lang.Number implements java.lang.Comparable<java.lang.Byte> {
    ctor public Byte(byte);
    ctor public Byte(String) throws java.lang.NumberFormatException;
    method public int compareTo(Byte);
    method public static Byte decode(String) throws java.lang.NumberFormatException;
    method public double doubleValue();
    method public float floatValue();
    method public int intValue();
    method public long longValue();
    method public static byte parseByte(String) throws java.lang.NumberFormatException;
    method public static byte parseByte(String, int) throws java.lang.NumberFormatException;
    method public static String toString(byte);
    method public static Byte valueOf(String) throws java.lang.NumberFormatException;
    method public static Byte valueOf(String, int) throws java.lang.NumberFormatException;
    method public static Byte valueOf(byte);
    field public static final byte MAX_VALUE = 127; // 0x7f
    field public static final byte MIN_VALUE = -128; // 0xffffff80
    field public static final int SIZE = 8; // 0x8
    field public static final Class<java.lang.Byte> TYPE;
  }

  public interface CharSequence {
    method public char charAt(int);
    method public int length();
    method public CharSequence subSequence(int, int);
    method public String toString();
  }

  public final class Character implements java.lang.Comparable<java.lang.Character> java.io.Serializable {
    ctor public Character(char);
    method public static int charCount(int);
    method public char charValue();
    method public static int codePointAt(CharSequence, int);
    method public static int codePointAt(char[], int);
    method public static int codePointAt(char[], int, int);
    method public static int codePointBefore(CharSequence, int);
    method public static int codePointBefore(char[], int);
    method public static int codePointBefore(char[], int, int);
    method public static int codePointCount(CharSequence, int, int);
    method public static int codePointCount(char[], int, int);
    method public int compareTo(Character);
    method public static int digit(char, int);
    method public static int digit(int, int);
    method public static char forDigit(int, int);
    method public static byte getDirectionality(char);
    method public static byte getDirectionality(int);
    method public static int getNumericValue(char);
    method public static int getNumericValue(int);
    method public static int getType(char);
    method public static int getType(int);
    method public static boolean isDefined(char);
    method public static boolean isDefined(int);
    method public static boolean isDigit(char);
    method public static boolean isDigit(int);
    method public static boolean isHighSurrogate(char);
    method public static boolean isISOControl(char);
    method public static boolean isISOControl(int);
    method public static boolean isIdentifierIgnorable(char);
    method public static boolean isIdentifierIgnorable(int);
    method public static boolean isJavaIdentifierPart(char);
    method public static boolean isJavaIdentifierPart(int);
    method public static boolean isJavaIdentifierStart(char);
    method public static boolean isJavaIdentifierStart(int);
    method public static boolean isJavaLetter(char);
    method public static boolean isJavaLetterOrDigit(char);
    method public static boolean isLetter(char);
    method public static boolean isLetter(int);
    method public static boolean isLetterOrDigit(char);
    method public static boolean isLetterOrDigit(int);
    method public static boolean isLowSurrogate(char);
    method public static boolean isLowerCase(char);
    method public static boolean isLowerCase(int);
    method public static boolean isMirrored(char);
    method public static boolean isMirrored(int);
    method public static boolean isSpace(char);
    method public static boolean isSpaceChar(char);
    method public static boolean isSpaceChar(int);
    method public static boolean isSupplementaryCodePoint(int);
    method public static boolean isSurrogatePair(char, char);
    method public static boolean isTitleCase(char);
    method public static boolean isTitleCase(int);
    method public static boolean isUnicodeIdentifierPart(char);
    method public static boolean isUnicodeIdentifierPart(int);
    method public static boolean isUnicodeIdentifierStart(char);
    method public static boolean isUnicodeIdentifierStart(int);
    method public static boolean isUpperCase(char);
    method public static boolean isUpperCase(int);
    method public static boolean isValidCodePoint(int);
    method public static boolean isWhitespace(char);
    method public static boolean isWhitespace(int);
    method public static int offsetByCodePoints(CharSequence, int, int);
    method public static int offsetByCodePoints(char[], int, int, int, int);
    method public static char reverseBytes(char);
    method public static int toChars(int, char[], int);
    method public static char[] toChars(int);
    method public static int toCodePoint(char, char);
    method public static char toLowerCase(char);
    method public static int toLowerCase(int);
    method public static String toString(char);
    method public static char toTitleCase(char);
    method public static int toTitleCase(int);
    method public static char toUpperCase(char);
    method public static int toUpperCase(int);
    method public static Character valueOf(char);
    field public static final byte COMBINING_SPACING_MARK = 8; // 0x8
    field public static final byte CONNECTOR_PUNCTUATION = 23; // 0x17
    field public static final byte CONTROL = 15; // 0xf
    field public static final byte CURRENCY_SYMBOL = 26; // 0x1a
    field public static final byte DASH_PUNCTUATION = 20; // 0x14
    field public static final byte DECIMAL_DIGIT_NUMBER = 9; // 0x9
    field public static final byte DIRECTIONALITY_ARABIC_NUMBER = 6; // 0x6
    field public static final byte DIRECTIONALITY_BOUNDARY_NEUTRAL = 9; // 0x9
    field public static final byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 7; // 0x7
    field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER = 3; // 0x3
    field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 4; // 0x4
    field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 5; // 0x5
    field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT = 0; // 0x0
    field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 14; // 0xe
    field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 15; // 0xf
    field public static final byte DIRECTIONALITY_NONSPACING_MARK = 8; // 0x8
    field public static final byte DIRECTIONALITY_OTHER_NEUTRALS = 13; // 0xd
    field public static final byte DIRECTIONALITY_PARAGRAPH_SEPARATOR = 10; // 0xa
    field public static final byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 18; // 0x12
    field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT = 1; // 0x1
    field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 2; // 0x2
    field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 16; // 0x10
    field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 17; // 0x11
    field public static final byte DIRECTIONALITY_SEGMENT_SEPARATOR = 11; // 0xb
    field public static final byte DIRECTIONALITY_UNDEFINED = -1; // 0xffffffff
    field public static final byte DIRECTIONALITY_WHITESPACE = 12; // 0xc
    field public static final byte ENCLOSING_MARK = 7; // 0x7
    field public static final byte END_PUNCTUATION = 22; // 0x16
    field public static final byte FINAL_QUOTE_PUNCTUATION = 30; // 0x1e
    field public static final byte FORMAT = 16; // 0x10
    field public static final byte INITIAL_QUOTE_PUNCTUATION = 29; // 0x1d
    field public static final byte LETTER_NUMBER = 10; // 0xa
    field public static final byte LINE_SEPARATOR = 13; // 0xd
    field public static final byte LOWERCASE_LETTER = 2; // 0x2
    field public static final byte MATH_SYMBOL = 25; // 0x19
    field public static final int MAX_CODE_POINT = 1114111; // 0x10ffff
    field public static final char MAX_HIGH_SURROGATE = 56319; // 0xdbff '\udbff'
    field public static final char MAX_LOW_SURROGATE = 57343; // 0xdfff '\udfff'
    field public static final int MAX_RADIX = 36; // 0x24
    field public static final char MAX_SURROGATE = 57343; // 0xdfff '\udfff'
    field public static final char MAX_VALUE = 65535; // 0xffff '\uffff'
    field public static final int MIN_CODE_POINT = 0; // 0x0
    field public static final char MIN_HIGH_SURROGATE = 55296; // 0xd800 '\ud800'
    field public static final char MIN_LOW_SURROGATE = 56320; // 0xdc00 '\udc00'
    field public static final int MIN_RADIX = 2; // 0x2
    field public static final int MIN_SUPPLEMENTARY_CODE_POINT = 65536; // 0x10000
    field public static final char MIN_SURROGATE = 55296; // 0xd800 '\ud800'
    field public static final char MIN_VALUE = 0; // 0x0000 '\u0000'
    field public static final byte MODIFIER_LETTER = 4; // 0x4
    field public static final byte MODIFIER_SYMBOL = 27; // 0x1b
    field public static final byte NON_SPACING_MARK = 6; // 0x6
    field public static final byte OTHER_LETTER = 5; // 0x5
    field public static final byte OTHER_NUMBER = 11; // 0xb
    field public static final byte OTHER_PUNCTUATION = 24; // 0x18
    field public static final byte OTHER_SYMBOL = 28; // 0x1c
    field public static final byte PARAGRAPH_SEPARATOR = 14; // 0xe
    field public static final byte PRIVATE_USE = 18; // 0x12
    field public static final int SIZE = 16; // 0x10
    field public static final byte SPACE_SEPARATOR = 12; // 0xc
    field public static final byte START_PUNCTUATION = 21; // 0x15
    field public static final byte SURROGATE = 19; // 0x13
    field public static final byte TITLECASE_LETTER = 3; // 0x3
    field public static final Class<java.lang.Character> TYPE;
    field public static final byte UNASSIGNED = 0; // 0x0
    field public static final byte UPPERCASE_LETTER = 1; // 0x1
  }

  public static class Character.Subset {
    ctor protected Character.Subset(String);
    method public final boolean equals(Object);
    method public final int hashCode();
    method public final String toString();
  }

  public static final class Character.UnicodeBlock extends java.lang.Character.Subset {
    method public static java.lang.Character.UnicodeBlock forName(String);
    method public static java.lang.Character.UnicodeBlock of(char);
    method public static java.lang.Character.UnicodeBlock of(int);
    field public static final java.lang.Character.UnicodeBlock AEGEAN_NUMBERS;
    field public static final java.lang.Character.UnicodeBlock ALPHABETIC_PRESENTATION_FORMS;
    field public static final java.lang.Character.UnicodeBlock ARABIC;
    field public static final java.lang.Character.UnicodeBlock ARABIC_PRESENTATION_FORMS_A;
    field public static final java.lang.Character.UnicodeBlock ARABIC_PRESENTATION_FORMS_B;
    field public static final java.lang.Character.UnicodeBlock ARMENIAN;
    field public static final java.lang.Character.UnicodeBlock ARROWS;
    field public static final java.lang.Character.UnicodeBlock BASIC_LATIN;
    field public static final java.lang.Character.UnicodeBlock BENGALI;
    field public static final java.lang.Character.UnicodeBlock BLOCK_ELEMENTS;
    field public static final java.lang.Character.UnicodeBlock BOPOMOFO;
    field public static final java.lang.Character.UnicodeBlock BOPOMOFO_EXTENDED;
    field public static final java.lang.Character.UnicodeBlock BOX_DRAWING;
    field public static final java.lang.Character.UnicodeBlock BRAILLE_PATTERNS;
    field public static final java.lang.Character.UnicodeBlock BUHID;
    field public static final java.lang.Character.UnicodeBlock BYZANTINE_MUSICAL_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock CHEROKEE;
    field public static final java.lang.Character.UnicodeBlock CJK_COMPATIBILITY;
    field public static final java.lang.Character.UnicodeBlock CJK_COMPATIBILITY_FORMS;
    field public static final java.lang.Character.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS;
    field public static final java.lang.Character.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT;
    field public static final java.lang.Character.UnicodeBlock CJK_RADICALS_SUPPLEMENT;
    field public static final java.lang.Character.UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION;
    field public static final java.lang.Character.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS;
    field public static final java.lang.Character.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
    field public static final java.lang.Character.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B;
    field public static final java.lang.Character.UnicodeBlock COMBINING_DIACRITICAL_MARKS;
    field public static final java.lang.Character.UnicodeBlock COMBINING_HALF_MARKS;
    field public static final java.lang.Character.UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock CONTROL_PICTURES;
    field public static final java.lang.Character.UnicodeBlock CURRENCY_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock CYPRIOT_SYLLABARY;
    field public static final java.lang.Character.UnicodeBlock CYRILLIC;
    field public static final java.lang.Character.UnicodeBlock CYRILLIC_SUPPLEMENTARY;
    field public static final java.lang.Character.UnicodeBlock DESERET;
    field public static final java.lang.Character.UnicodeBlock DEVANAGARI;
    field public static final java.lang.Character.UnicodeBlock DINGBATS;
    field public static final java.lang.Character.UnicodeBlock ENCLOSED_ALPHANUMERICS;
    field public static final java.lang.Character.UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS;
    field public static final java.lang.Character.UnicodeBlock ETHIOPIC;
    field public static final java.lang.Character.UnicodeBlock GENERAL_PUNCTUATION;
    field public static final java.lang.Character.UnicodeBlock GEOMETRIC_SHAPES;
    field public static final java.lang.Character.UnicodeBlock GEORGIAN;
    field public static final java.lang.Character.UnicodeBlock GOTHIC;
    field public static final java.lang.Character.UnicodeBlock GREEK;
    field public static final java.lang.Character.UnicodeBlock GREEK_EXTENDED;
    field public static final java.lang.Character.UnicodeBlock GUJARATI;
    field public static final java.lang.Character.UnicodeBlock GURMUKHI;
    field public static final java.lang.Character.UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS;
    field public static final java.lang.Character.UnicodeBlock HANGUL_COMPATIBILITY_JAMO;
    field public static final java.lang.Character.UnicodeBlock HANGUL_JAMO;
    field public static final java.lang.Character.UnicodeBlock HANGUL_SYLLABLES;
    field public static final java.lang.Character.UnicodeBlock HANUNOO;
    field public static final java.lang.Character.UnicodeBlock HEBREW;
    field public static final java.lang.Character.UnicodeBlock HIGH_PRIVATE_USE_SURROGATES;
    field public static final java.lang.Character.UnicodeBlock HIGH_SURROGATES;
    field public static final java.lang.Character.UnicodeBlock HIRAGANA;
    field public static final java.lang.Character.UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS;
    field public static final java.lang.Character.UnicodeBlock IPA_EXTENSIONS;
    field public static final java.lang.Character.UnicodeBlock KANBUN;
    field public static final java.lang.Character.UnicodeBlock KANGXI_RADICALS;
    field public static final java.lang.Character.UnicodeBlock KANNADA;
    field public static final java.lang.Character.UnicodeBlock KATAKANA;
    field public static final java.lang.Character.UnicodeBlock KATAKANA_PHONETIC_EXTENSIONS;
    field public static final java.lang.Character.UnicodeBlock KHMER;
    field public static final java.lang.Character.UnicodeBlock KHMER_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock LAO;
    field public static final java.lang.Character.UnicodeBlock LATIN_1_SUPPLEMENT;
    field public static final java.lang.Character.UnicodeBlock LATIN_EXTENDED_A;
    field public static final java.lang.Character.UnicodeBlock LATIN_EXTENDED_ADDITIONAL;
    field public static final java.lang.Character.UnicodeBlock LATIN_EXTENDED_B;
    field public static final java.lang.Character.UnicodeBlock LETTERLIKE_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock LIMBU;
    field public static final java.lang.Character.UnicodeBlock LINEAR_B_IDEOGRAMS;
    field public static final java.lang.Character.UnicodeBlock LINEAR_B_SYLLABARY;
    field public static final java.lang.Character.UnicodeBlock LOW_SURROGATES;
    field public static final java.lang.Character.UnicodeBlock MALAYALAM;
    field public static final java.lang.Character.UnicodeBlock MATHEMATICAL_ALPHANUMERIC_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock MATHEMATICAL_OPERATORS;
    field public static final java.lang.Character.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A;
    field public static final java.lang.Character.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B;
    field public static final java.lang.Character.UnicodeBlock MISCELLANEOUS_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_ARROWS;
    field public static final java.lang.Character.UnicodeBlock MISCELLANEOUS_TECHNICAL;
    field public static final java.lang.Character.UnicodeBlock MONGOLIAN;
    field public static final java.lang.Character.UnicodeBlock MUSICAL_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock MYANMAR;
    field public static final java.lang.Character.UnicodeBlock NUMBER_FORMS;
    field public static final java.lang.Character.UnicodeBlock OGHAM;
    field public static final java.lang.Character.UnicodeBlock OLD_ITALIC;
    field public static final java.lang.Character.UnicodeBlock OPTICAL_CHARACTER_RECOGNITION;
    field public static final java.lang.Character.UnicodeBlock ORIYA;
    field public static final java.lang.Character.UnicodeBlock OSMANYA;
    field public static final java.lang.Character.UnicodeBlock PHONETIC_EXTENSIONS;
    field public static final java.lang.Character.UnicodeBlock PRIVATE_USE_AREA;
    field public static final java.lang.Character.UnicodeBlock RUNIC;
    field public static final java.lang.Character.UnicodeBlock SHAVIAN;
    field public static final java.lang.Character.UnicodeBlock SINHALA;
    field public static final java.lang.Character.UnicodeBlock SMALL_FORM_VARIANTS;
    field public static final java.lang.Character.UnicodeBlock SPACING_MODIFIER_LETTERS;
    field public static final java.lang.Character.UnicodeBlock SPECIALS;
    field public static final java.lang.Character.UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS;
    field public static final java.lang.Character.UnicodeBlock SUPPLEMENTAL_ARROWS_A;
    field public static final java.lang.Character.UnicodeBlock SUPPLEMENTAL_ARROWS_B;
    field public static final java.lang.Character.UnicodeBlock SUPPLEMENTAL_MATHEMATICAL_OPERATORS;
    field public static final java.lang.Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A;
    field public static final java.lang.Character.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B;
    field public static final java.lang.Character.UnicodeBlock SURROGATES_AREA;
    field public static final java.lang.Character.UnicodeBlock SYRIAC;
    field public static final java.lang.Character.UnicodeBlock TAGALOG;
    field public static final java.lang.Character.UnicodeBlock TAGBANWA;
    field public static final java.lang.Character.UnicodeBlock TAGS;
    field public static final java.lang.Character.UnicodeBlock TAI_LE;
    field public static final java.lang.Character.UnicodeBlock TAI_XUAN_JING_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock TAMIL;
    field public static final java.lang.Character.UnicodeBlock TELUGU;
    field public static final java.lang.Character.UnicodeBlock THAANA;
    field public static final java.lang.Character.UnicodeBlock THAI;
    field public static final java.lang.Character.UnicodeBlock TIBETAN;
    field public static final java.lang.Character.UnicodeBlock UGARITIC;
    field public static final java.lang.Character.UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS;
    field public static final java.lang.Character.UnicodeBlock VARIATION_SELECTORS;
    field public static final java.lang.Character.UnicodeBlock VARIATION_SELECTORS_SUPPLEMENT;
    field public static final java.lang.Character.UnicodeBlock YIJING_HEXAGRAM_SYMBOLS;
    field public static final java.lang.Character.UnicodeBlock YI_RADICALS;
    field public static final java.lang.Character.UnicodeBlock YI_SYLLABLES;
  }

  public final class Class<T> implements java.lang.reflect.AnnotatedElement java.lang.reflect.GenericDeclaration java.io.Serializable java.lang.reflect.Type {
    method public <U> Class<? extends U> asSubclass(Class<U>);
    method public T cast(Object);
    method public boolean desiredAssertionStatus();
    method public static Class<?> forName(String) throws java.lang.ClassNotFoundException;
    method public static Class<?> forName(String, boolean, ClassLoader) throws java.lang.ClassNotFoundException;
    method public <A extends java.lang.annotation.Annotation> A getAnnotation(Class<A>);
    method public java.lang.annotation.Annotation[] getAnnotations();
    method public String getCanonicalName();
    method public ClassLoader getClassLoader();
    method public Class[] getClasses();
    method public Class<?> getComponentType();
    method public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
    method public java.lang.reflect.Constructor[] getConstructors() throws java.lang.SecurityException;
    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    method public Class[] getDeclaredClasses() throws java.lang.SecurityException;
    method public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
    method public java.lang.reflect.Constructor[] getDeclaredConstructors() throws java.lang.SecurityException;
    method public java.lang.reflect.Field getDeclaredField(String) throws java.lang.NoSuchFieldException, java.lang.SecurityException;
    method public java.lang.reflect.Field[] getDeclaredFields() throws java.lang.SecurityException;
    method public java.lang.reflect.Method getDeclaredMethod(String, java.lang.Class...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
    method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException;
    method public Class<?> getDeclaringClass();
    method public Class<?> getEnclosingClass();
    method public java.lang.reflect.Constructor<?> getEnclosingConstructor();
    method public java.lang.reflect.Method getEnclosingMethod();
    method public T[] getEnumConstants();
    method public java.lang.reflect.Field getField(String) throws java.lang.NoSuchFieldException, java.lang.SecurityException;
    method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException;
    method public java.lang.reflect.Type[] getGenericInterfaces();
    method public java.lang.reflect.Type getGenericSuperclass();
    method public Class[] getInterfaces();
    method public java.lang.reflect.Method getMethod(String, java.lang.Class...) throws java.lang.NoSuchMethodException, java.lang.SecurityException;
    method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException;
    method public int getModifiers();
    method public String getName();
    method public Package getPackage();
    method public java.security.ProtectionDomain getProtectionDomain();
    method public java.net.URL getResource(String);
    method public java.io.InputStream getResourceAsStream(String);
    method public Object[] getSigners();
    method public String getSimpleName();
    method public Class<? super T> getSuperclass();
    method public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters();
    method public boolean isAnnotation();
    method public boolean isAnnotationPresent(Class<? extends java.lang.annotation.Annotation>);
    method public boolean isAnonymousClass();
    method public boolean isArray();
    method public boolean isAssignableFrom(Class<?>);
    method public boolean isEnum();
    method public boolean isInstance(Object);
    method public boolean isInterface();
    method public boolean isLocalClass();
    method public boolean isMemberClass();
    method public boolean isPrimitive();
    method public boolean isSynthetic();
    method public T newInstance() throws java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public class ClassCastException extends java.lang.RuntimeException {
    ctor public ClassCastException();
    ctor public ClassCastException(String);
  }

  public class ClassCircularityError extends java.lang.LinkageError {
    ctor public ClassCircularityError();
    ctor public ClassCircularityError(String);
  }

  public class ClassFormatError extends java.lang.LinkageError {
    ctor public ClassFormatError();
    ctor public ClassFormatError(String);
  }

  public abstract class ClassLoader {
    ctor protected ClassLoader();
    ctor protected ClassLoader(ClassLoader);
    method public void clearAssertionStatus();
    method protected final Class<?> defineClass(byte[], int, int) throws java.lang.ClassFormatError;
    method protected final Class<?> defineClass(String, byte[], int, int) throws java.lang.ClassFormatError;
    method protected final Class<?> defineClass(String, byte[], int, int, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
    method protected final Class<?> defineClass(String, java.nio.ByteBuffer, java.security.ProtectionDomain) throws java.lang.ClassFormatError;
    method protected Package definePackage(String, String, String, String, String, String, String, java.net.URL) throws java.lang.IllegalArgumentException;
    method protected Class<?> findClass(String) throws java.lang.ClassNotFoundException;
    method protected String findLibrary(String);
    method protected final Class<?> findLoadedClass(String);
    method protected java.net.URL findResource(String);
    method protected java.util.Enumeration<java.net.URL> findResources(String) throws java.io.IOException;
    method protected final Class<?> findSystemClass(String) throws java.lang.ClassNotFoundException;
    method protected Package getPackage(String);
    method protected Package[] getPackages();
    method public final ClassLoader getParent();
    method public java.net.URL getResource(String);
    method public java.io.InputStream getResourceAsStream(String);
    method public java.util.Enumeration<java.net.URL> getResources(String) throws java.io.IOException;
    method public static ClassLoader getSystemClassLoader();
    method public static java.net.URL getSystemResource(String);
    method public static java.io.InputStream getSystemResourceAsStream(String);
    method public static java.util.Enumeration<java.net.URL> getSystemResources(String) throws java.io.IOException;
    method public Class<?> loadClass(String) throws java.lang.ClassNotFoundException;
    method protected Class<?> loadClass(String, boolean) throws java.lang.ClassNotFoundException;
    method protected final void resolveClass(Class<?>);
    method public void setClassAssertionStatus(String, boolean);
    method public void setDefaultAssertionStatus(boolean);
    method public void setPackageAssertionStatus(String, boolean);
    method protected final void setSigners(Class<?>, Object[]);
  }

  public class ClassNotFoundException extends java.lang.Exception {
    ctor public ClassNotFoundException();
    ctor public ClassNotFoundException(String);
    ctor public ClassNotFoundException(String, Throwable);
    method public Throwable getException();
  }

  public class CloneNotSupportedException extends java.lang.Exception {
    ctor public CloneNotSupportedException();
    ctor public CloneNotSupportedException(String);
  }

  public interface Cloneable {
  }

  public interface Comparable<T> {
    method public int compareTo(T);
  }

  public final class Compiler {
    method public static Object command(Object);
    method public static boolean compileClass(Class<?>);
    method public static boolean compileClasses(String);
    method public static void disable();
    method public static void enable();
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface Deprecated {
  }

  public final class Double extends java.lang.Number implements java.lang.Comparable<java.lang.Double> {
    ctor public Double(double);
    ctor public Double(String) throws java.lang.NumberFormatException;
    method public static int compare(double, double);
    method public int compareTo(Double);
    method public static long doubleToLongBits(double);
    method public static long doubleToRawLongBits(double);
    method public double doubleValue();
    method public float floatValue();
    method public int intValue();
    method public boolean isInfinite();
    method public static boolean isInfinite(double);
    method public boolean isNaN();
    method public static boolean isNaN(double);
    method public static double longBitsToDouble(long);
    method public long longValue();
    method public static double parseDouble(String) throws java.lang.NumberFormatException;
    method public static String toHexString(double);
    method public static String toString(double);
    method public static Double valueOf(String) throws java.lang.NumberFormatException;
    method public static Double valueOf(double);
    field public static final double MAX_VALUE = 1.7976931348623157E308;
    field public static final double MIN_VALUE = 4.9E-324;
    field public static final double NEGATIVE_INFINITY = (-1.0/0.0);
    field public static final double NaN = (0.0/0.0);
    field public static final double POSITIVE_INFINITY = (1.0/0.0);
    field public static final int SIZE = 64; // 0x40
    field public static final Class<java.lang.Double> TYPE;
  }

  public abstract class Enum<E extends java.lang.Enum<E>> implements java.lang.Comparable<E> java.io.Serializable {
    ctor protected Enum(String, int);
    method protected final Object clone() throws java.lang.CloneNotSupportedException;
    method public final int compareTo(E);
    method public final boolean equals(Object);
    method public final Class<E> getDeclaringClass();
    method public final int hashCode();
    method public final String name();
    method public final int ordinal();
    method public static <T extends java.lang.Enum<T>> T valueOf(Class<T>, String);
  }

  public class EnumConstantNotPresentException extends java.lang.RuntimeException {
    ctor public EnumConstantNotPresentException(Class<? extends java.lang.Enum>, String);
    method public String constantName();
    method public Class<? extends java.lang.Enum> enumType();
  }

  public class Error extends java.lang.Throwable {
    ctor public Error();
    ctor public Error(String);
    ctor public Error(String, Throwable);
    ctor public Error(Throwable);
  }

  public class Exception extends java.lang.Throwable {
    ctor public Exception();
    ctor public Exception(String);
    ctor public Exception(String, Throwable);
    ctor public Exception(Throwable);
  }

  public class ExceptionInInitializerError extends java.lang.LinkageError {
    ctor public ExceptionInInitializerError();
    ctor public ExceptionInInitializerError(String);
    ctor public ExceptionInInitializerError(Throwable);
    method public Throwable getException();
  }

  public final class Float extends java.lang.Number implements java.lang.Comparable<java.lang.Float> {
    ctor public Float(float);
    ctor public Float(double);
    ctor public Float(String) throws java.lang.NumberFormatException;
    method public static int compare(float, float);
    method public int compareTo(Float);
    method public double doubleValue();
    method public static int floatToIntBits(float);
    method public static int floatToRawIntBits(float);
    method public float floatValue();
    method public static float intBitsToFloat(int);
    method public int intValue();
    method public boolean isInfinite();
    method public static boolean isInfinite(float);
    method public boolean isNaN();
    method public static boolean isNaN(float);
    method public long longValue();
    method public static float parseFloat(String) throws java.lang.NumberFormatException;
    method public static String toHexString(float);
    method public static String toString(float);
    method public static Float valueOf(String) throws java.lang.NumberFormatException;
    method public static Float valueOf(float);
    field public static final float MAX_VALUE = 3.4028235E38f;
    field public static final float MIN_VALUE = 1.4E-45f;
    field public static final float NEGATIVE_INFINITY = (-1.0f/0.0f);
    field public static final float NaN = (0.0f/0.0f);
    field public static final float POSITIVE_INFINITY = (1.0f/0.0f);
    field public static final int SIZE = 32; // 0x20
    field public static final Class<java.lang.Float> TYPE;
  }

  public class IllegalAccessError extends java.lang.IncompatibleClassChangeError {
    ctor public IllegalAccessError();
    ctor public IllegalAccessError(String);
  }

  public class IllegalAccessException extends java.lang.Exception {
    ctor public IllegalAccessException();
    ctor public IllegalAccessException(String);
  }

  public class IllegalArgumentException extends java.lang.RuntimeException {
    ctor public IllegalArgumentException();
    ctor public IllegalArgumentException(String);
    ctor public IllegalArgumentException(String, Throwable);
    ctor public IllegalArgumentException(Throwable);
  }

  public class IllegalMonitorStateException extends java.lang.RuntimeException {
    ctor public IllegalMonitorStateException();
    ctor public IllegalMonitorStateException(String);
  }

  public class IllegalStateException extends java.lang.RuntimeException {
    ctor public IllegalStateException();
    ctor public IllegalStateException(String);
    ctor public IllegalStateException(String, Throwable);
    ctor public IllegalStateException(Throwable);
  }

  public class IllegalThreadStateException extends java.lang.IllegalArgumentException {
    ctor public IllegalThreadStateException();
    ctor public IllegalThreadStateException(String);
  }

  public class IncompatibleClassChangeError extends java.lang.LinkageError {
    ctor public IncompatibleClassChangeError();
    ctor public IncompatibleClassChangeError(String);
  }

  public class IndexOutOfBoundsException extends java.lang.RuntimeException {
    ctor public IndexOutOfBoundsException();
    ctor public IndexOutOfBoundsException(String);
  }

  public class InheritableThreadLocal<T> extends java.lang.ThreadLocal<T> {
    ctor public InheritableThreadLocal();
    method protected T childValue(T);
  }

  public class InstantiationError extends java.lang.IncompatibleClassChangeError {
    ctor public InstantiationError();
    ctor public InstantiationError(String);
  }

  public class InstantiationException extends java.lang.Exception {
    ctor public InstantiationException();
    ctor public InstantiationException(String);
  }

  public final class Integer extends java.lang.Number implements java.lang.Comparable<java.lang.Integer> {
    ctor public Integer(int);
    ctor public Integer(String) throws java.lang.NumberFormatException;
    method public static int bitCount(int);
    method public int compareTo(Integer);
    method public static Integer decode(String) throws java.lang.NumberFormatException;
    method public double doubleValue();
    method public float floatValue();
    method public static Integer getInteger(String);
    method public static Integer getInteger(String, int);
    method public static Integer getInteger(String, Integer);
    method public static int highestOneBit(int);
    method public int intValue();
    method public long longValue();
    method public static int lowestOneBit(int);
    method public static int numberOfLeadingZeros(int);
    method public static int numberOfTrailingZeros(int);
    method public static int parseInt(String) throws java.lang.NumberFormatException;
    method public static int parseInt(String, int) throws java.lang.NumberFormatException;
    method public static int reverse(int);
    method public static int reverseBytes(int);
    method public static int rotateLeft(int, int);
    method public static int rotateRight(int, int);
    method public static int signum(int);
    method public static String toBinaryString(int);
    method public static String toHexString(int);
    method public static String toOctalString(int);
    method public static String toString(int);
    method public static String toString(int, int);
    method public static Integer valueOf(String) throws java.lang.NumberFormatException;
    method public static Integer valueOf(String, int) throws java.lang.NumberFormatException;
    method public static Integer valueOf(int);
    field public static final int MAX_VALUE = 2147483647; // 0x7fffffff
    field public static final int MIN_VALUE = -2147483648; // 0x80000000
    field public static final int SIZE = 32; // 0x20
    field public static final Class<java.lang.Integer> TYPE;
  }

  public class InternalError extends java.lang.VirtualMachineError {
    ctor public InternalError();
    ctor public InternalError(String);
  }

  public class InterruptedException extends java.lang.Exception {
    ctor public InterruptedException();
    ctor public InterruptedException(String);
  }

  public interface Iterable<T> {
    method public java.util.Iterator<T> iterator();
  }

  public class LinkageError extends java.lang.Error {
    ctor public LinkageError();
    ctor public LinkageError(String);
  }

  public final class Long extends java.lang.Number implements java.lang.Comparable<java.lang.Long> {
    ctor public Long(long);
    ctor public Long(String) throws java.lang.NumberFormatException;
    method public static int bitCount(long);
    method public int compareTo(Long);
    method public static Long decode(String) throws java.lang.NumberFormatException;
    method public double doubleValue();
    method public float floatValue();
    method public static Long getLong(String);
    method public static Long getLong(String, long);
    method public static Long getLong(String, Long);
    method public static long highestOneBit(long);
    method public int intValue();
    method public long longValue();
    method public static long lowestOneBit(long);
    method public static int numberOfLeadingZeros(long);
    method public static int numberOfTrailingZeros(long);
    method public static long parseLong(String) throws java.lang.NumberFormatException;
    method public static long parseLong(String, int) throws java.lang.NumberFormatException;
    method public static long reverse(long);
    method public static long reverseBytes(long);
    method public static long rotateLeft(long, int);
    method public static long rotateRight(long, int);
    method public static int signum(long);
    method public static String toBinaryString(long);
    method public static String toHexString(long);
    method public static String toOctalString(long);
    method public static String toString(long);
    method public static String toString(long, int);
    method public static Long valueOf(String) throws java.lang.NumberFormatException;
    method public static Long valueOf(String, int) throws java.lang.NumberFormatException;
    method public static Long valueOf(long);
    field public static final long MAX_VALUE = 9223372036854775807L; // 0x7fffffffffffffffL
    field public static final long MIN_VALUE = -9223372036854775808L; // 0x8000000000000000L
    field public static final int SIZE = 64; // 0x40
    field public static final Class<java.lang.Long> TYPE;
  }

  public final class Math {
    method public static double IEEEremainder(double, double);
    method public static double abs(double);
    method public static float abs(float);
    method public static int abs(int);
    method public static long abs(long);
    method public static double acos(double);
    method public static double asin(double);
    method public static double atan(double);
    method public static double atan2(double, double);
    method public static double cbrt(double);
    method public static double ceil(double);
    method public static double cos(double);
    method public static double cosh(double);
    method public static double exp(double);
    method public static double expm1(double);
    method public static double floor(double);
    method public static double hypot(double, double);
    method public static double log(double);
    method public static double log10(double);
    method public static double log1p(double);
    method public static double max(double, double);
    method public static float max(float, float);
    method public static int max(int, int);
    method public static long max(long, long);
    method public static double min(double, double);
    method public static float min(float, float);
    method public static int min(int, int);
    method public static long min(long, long);
    method public static double pow(double, double);
    method public static double random();
    method public static double rint(double);
    method public static long round(double);
    method public static int round(float);
    method public static double signum(double);
    method public static float signum(float);
    method public static double sin(double);
    method public static double sinh(double);
    method public static double sqrt(double);
    method public static double tan(double);
    method public static double tanh(double);
    method public static double toDegrees(double);
    method public static double toRadians(double);
    method public static double ulp(double);
    method public static float ulp(float);
    field public static final double E = 2.718281828459045;
    field public static final double PI = 3.141592653589793;
  }

  public class NegativeArraySizeException extends java.lang.RuntimeException {
    ctor public NegativeArraySizeException();
    ctor public NegativeArraySizeException(String);
  }

  public class NoClassDefFoundError extends java.lang.LinkageError {
    ctor public NoClassDefFoundError();
    ctor public NoClassDefFoundError(String);
  }

  public class NoSuchFieldError extends java.lang.IncompatibleClassChangeError {
    ctor public NoSuchFieldError();
    ctor public NoSuchFieldError(String);
  }

  public class NoSuchFieldException extends java.lang.Exception {
    ctor public NoSuchFieldException();
    ctor public NoSuchFieldException(String);
  }

  public class NoSuchMethodError extends java.lang.IncompatibleClassChangeError {
    ctor public NoSuchMethodError();
    ctor public NoSuchMethodError(String);
  }

  public class NoSuchMethodException extends java.lang.Exception {
    ctor public NoSuchMethodException();
    ctor public NoSuchMethodException(String);
  }

  public class NullPointerException extends java.lang.RuntimeException {
    ctor public NullPointerException();
    ctor public NullPointerException(String);
  }

  public abstract class Number implements java.io.Serializable {
    ctor public Number();
    method public byte byteValue();
    method public abstract double doubleValue();
    method public abstract float floatValue();
    method public abstract int intValue();
    method public abstract long longValue();
    method public short shortValue();
  }

  public class NumberFormatException extends java.lang.IllegalArgumentException {
    ctor public NumberFormatException();
    ctor public NumberFormatException(String);
  }

  public class Object {
    ctor public Object();
    method protected Object clone() throws java.lang.CloneNotSupportedException;
    method public boolean equals(Object);
    method protected void finalize() throws java.lang.Throwable;
    method public final Class<?> getClass();
    method public int hashCode();
    method public final void notify();
    method public final void notifyAll();
    method public String toString();
    method public final void wait() throws java.lang.InterruptedException;
    method public final void wait(long) throws java.lang.InterruptedException;
    method public final void wait(long, int) throws java.lang.InterruptedException;
  }

  public class OutOfMemoryError extends java.lang.VirtualMachineError {
    ctor public OutOfMemoryError();
    ctor public OutOfMemoryError(String);
  }

  @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface Override {
  }

  public class Package implements java.lang.reflect.AnnotatedElement {
    method public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T>);
    method public java.lang.annotation.Annotation[] getAnnotations();
    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    method public String getImplementationTitle();
    method public String getImplementationVendor();
    method public String getImplementationVersion();
    method public String getName();
    method public static Package getPackage(String);
    method public static Package[] getPackages();
    method public String getSpecificationTitle();
    method public String getSpecificationVendor();
    method public String getSpecificationVersion();
    method public boolean isAnnotationPresent(Class<? extends java.lang.annotation.Annotation>);
    method public boolean isCompatibleWith(String) throws java.lang.NumberFormatException;
    method public boolean isSealed();
    method public boolean isSealed(java.net.URL);
  }

  public abstract class Process {
    ctor public Process();
    method public abstract void destroy();
    method public abstract int exitValue();
    method public abstract java.io.InputStream getErrorStream();
    method public abstract java.io.InputStream getInputStream();
    method public abstract java.io.OutputStream getOutputStream();
    method public abstract int waitFor() throws java.lang.InterruptedException;
  }

  public final class ProcessBuilder {
    ctor public ProcessBuilder(java.lang.String...);
    ctor public ProcessBuilder(java.util.List<java.lang.String>);
    method public java.util.List<java.lang.String> command();
    method public ProcessBuilder command(java.lang.String...);
    method public ProcessBuilder command(java.util.List<java.lang.String>);
    method public java.io.File directory();
    method public ProcessBuilder directory(java.io.File);
    method public java.util.Map<java.lang.String,java.lang.String> environment();
    method public boolean redirectErrorStream();
    method public ProcessBuilder redirectErrorStream(boolean);
    method public Process start() throws java.io.IOException;
  }

  public interface Readable {
    method public int read(java.nio.CharBuffer) throws java.io.IOException;
  }

  public interface Runnable {
    method public void run();
  }

  public class Runtime {
    method public void addShutdownHook(Thread);
    method public int availableProcessors();
    method public Process exec(String[]) throws java.io.IOException;
    method public Process exec(String[], String[]) throws java.io.IOException;
    method public Process exec(String[], String[], java.io.File) throws java.io.IOException;
    method public Process exec(String) throws java.io.IOException;
    method public Process exec(String, String[]) throws java.io.IOException;
    method public Process exec(String, String[], java.io.File) throws java.io.IOException;
    method public void exit(int);
    method public long freeMemory();
    method public void gc();
    method public java.io.InputStream getLocalizedInputStream(java.io.InputStream);
    method public java.io.OutputStream getLocalizedOutputStream(java.io.OutputStream);
    method public static Runtime getRuntime();
    method public void halt(int);
    method public void load(String);
    method public void loadLibrary(String);
    method public long maxMemory();
    method public boolean removeShutdownHook(Thread);
    method public void runFinalization();
    method public static void runFinalizersOnExit(boolean);
    method public long totalMemory();
    method public void traceInstructions(boolean);
    method public void traceMethodCalls(boolean);
  }

  public class RuntimeException extends java.lang.Exception {
    ctor public RuntimeException();
    ctor public RuntimeException(String);
    ctor public RuntimeException(String, Throwable);
    ctor public RuntimeException(Throwable);
  }

  public final class RuntimePermission extends java.security.BasicPermission {
    ctor public RuntimePermission(String);
    ctor public RuntimePermission(String, String);
  }

  public class SecurityException extends java.lang.RuntimeException {
    ctor public SecurityException();
    ctor public SecurityException(String);
    ctor public SecurityException(String, Throwable);
    ctor public SecurityException(Throwable);
  }

  public class SecurityManager {
    ctor public SecurityManager();
    method public void checkAccept(String, int);
    method public void checkAccess(Thread);
    method public void checkAccess(ThreadGroup);
    method public void checkAwtEventQueueAccess();
    method public void checkConnect(String, int);
    method public void checkConnect(String, int, Object);
    method public void checkCreateClassLoader();
    method public void checkDelete(String);
    method public void checkExec(String);
    method public void checkExit(int);
    method public void checkLink(String);
    method public void checkListen(int);
    method public void checkMemberAccess(Class<?>, int);
    method public void checkMulticast(java.net.InetAddress);
    method public void checkMulticast(java.net.InetAddress, byte);
    method public void checkPackageAccess(String);
    method public void checkPackageDefinition(String);
    method public void checkPermission(java.security.Permission);
    method public void checkPermission(java.security.Permission, Object);
    method public void checkPrintJobAccess();
    method public void checkPropertiesAccess();
    method public void checkPropertyAccess(String);
    method public void checkRead(java.io.FileDescriptor);
    method public void checkRead(String);
    method public void checkRead(String, Object);
    method public void checkSecurityAccess(String);
    method public void checkSetFactory();
    method public void checkSystemClipboardAccess();
    method public boolean checkTopLevelWindow(Object);
    method public void checkWrite(java.io.FileDescriptor);
    method public void checkWrite(String);
    method protected int classDepth(String);
    method protected int classLoaderDepth();
    method protected ClassLoader currentClassLoader();
    method protected Class<?> currentLoadedClass();
    method protected Class[] getClassContext();
    method public boolean getInCheck();
    method public Object getSecurityContext();
    method public ThreadGroup getThreadGroup();
    method protected boolean inClass(String);
    method protected boolean inClassLoader();
    field protected boolean inCheck;
  }

  public final class Short extends java.lang.Number implements java.lang.Comparable<java.lang.Short> {
    ctor public Short(String) throws java.lang.NumberFormatException;
    ctor public Short(short);
    method public int compareTo(Short);
    method public static Short decode(String) throws java.lang.NumberFormatException;
    method public double doubleValue();
    method public float floatValue();
    method public int intValue();
    method public long longValue();
    method public static short parseShort(String) throws java.lang.NumberFormatException;
    method public static short parseShort(String, int) throws java.lang.NumberFormatException;
    method public static short reverseBytes(short);
    method public static String toString(short);
    method public static Short valueOf(String) throws java.lang.NumberFormatException;
    method public static Short valueOf(String, int) throws java.lang.NumberFormatException;
    method public static Short valueOf(short);
    field public static final short MAX_VALUE = 32767; // 0x7fff
    field public static final short MIN_VALUE = -32768; // 0xffff8000
    field public static final int SIZE = 16; // 0x10
    field public static final Class<java.lang.Short> TYPE;
  }

  public class StackOverflowError extends java.lang.VirtualMachineError {
    ctor public StackOverflowError();
    ctor public StackOverflowError(String);
  }

  public final class StackTraceElement implements java.io.Serializable {
    ctor public StackTraceElement(String, String, String, int);
    method public String getClassName();
    method public String getFileName();
    method public int getLineNumber();
    method public String getMethodName();
    method public boolean isNativeMethod();
  }

  public final class StrictMath {
    method public static double IEEEremainder(double, double);
    method public static double abs(double);
    method public static float abs(float);
    method public static int abs(int);
    method public static long abs(long);
    method public static double acos(double);
    method public static double asin(double);
    method public static double atan(double);
    method public static double atan2(double, double);
    method public static double cbrt(double);
    method public static double ceil(double);
    method public static double cos(double);
    method public static double cosh(double);
    method public static double exp(double);
    method public static double expm1(double);
    method public static double floor(double);
    method public static double hypot(double, double);
    method public static double log(double);
    method public static double log10(double);
    method public static double log1p(double);
    method public static double max(double, double);
    method public static float max(float, float);
    method public static int max(int, int);
    method public static long max(long, long);
    method public static double min(double, double);
    method public static float min(float, float);
    method public static int min(int, int);
    method public static long min(long, long);
    method public static double pow(double, double);
    method public static double random();
    method public static double rint(double);
    method public static long round(double);
    method public static int round(float);
    method public static double signum(double);
    method public static float signum(float);
    method public static double sin(double);
    method public static double sinh(double);
    method public static double sqrt(double);
    method public static double tan(double);
    method public static double tanh(double);
    method public static double toDegrees(double);
    method public static double toRadians(double);
    method public static double ulp(double);
    method public static float ulp(float);
    field public static final double E = 2.718281828459045;
    field public static final double PI = 3.141592653589793;
  }

  public final class String implements java.lang.CharSequence java.lang.Comparable<java.lang.String> java.io.Serializable {
    ctor public String();
    ctor public String(byte[]);
    ctor public String(byte[], int);
    ctor public String(byte[], int, int);
    ctor public String(byte[], int, int, int);
    ctor public String(byte[], int, int, String) throws java.io.UnsupportedEncodingException;
    ctor public String(byte[], String) throws java.io.UnsupportedEncodingException;
    ctor public String(char[]);
    ctor public String(char[], int, int);
    ctor public String(String);
    ctor public String(StringBuffer);
    ctor public String(int[], int, int);
    ctor public String(StringBuilder);
    method public char charAt(int);
    method public int codePointAt(int);
    method public int codePointBefore(int);
    method public int codePointCount(int, int);
    method public int compareTo(String);
    method public int compareToIgnoreCase(String);
    method public String concat(String);
    method public boolean contains(CharSequence);
    method public boolean contentEquals(StringBuffer);
    method public boolean contentEquals(CharSequence);
    method public static String copyValueOf(char[]);
    method public static String copyValueOf(char[], int, int);
    method public boolean endsWith(String);
    method public boolean equalsIgnoreCase(String);
    method public static String format(String, java.lang.Object...);
    method public static String format(java.util.Locale, String, java.lang.Object...);
    method public byte[] getBytes();
    method public void getBytes(int, int, byte[], int);
    method public byte[] getBytes(String) throws java.io.UnsupportedEncodingException;
    method public void getChars(int, int, char[], int);
    method public int indexOf(int);
    method public int indexOf(int, int);
    method public int indexOf(String);
    method public int indexOf(String, int);
    method public String intern();
    method public int lastIndexOf(int);
    method public int lastIndexOf(int, int);
    method public int lastIndexOf(String);
    method public int lastIndexOf(String, int);
    method public int length();
    method public boolean matches(String);
    method public int offsetByCodePoints(int, int);
    method public boolean regionMatches(int, String, int, int);
    method public boolean regionMatches(boolean, int, String, int, int);
    method public String replace(char, char);
    method public String replace(CharSequence, CharSequence);
    method public String replaceAll(String, String);
    method public String replaceFirst(String, String);
    method public String[] split(String);
    method public String[] split(String, int);
    method public boolean startsWith(String);
    method public boolean startsWith(String, int);
    method public CharSequence subSequence(int, int);
    method public String substring(int);
    method public String substring(int, int);
    method public char[] toCharArray();
    method public String toLowerCase();
    method public String toLowerCase(java.util.Locale);
    method public String toUpperCase();
    method public String toUpperCase(java.util.Locale);
    method public String trim();
    method public static String valueOf(char[]);
    method public static String valueOf(char[], int, int);
    method public static String valueOf(char);
    method public static String valueOf(double);
    method public static String valueOf(float);
    method public static String valueOf(int);
    method public static String valueOf(long);
    method public static String valueOf(Object);
    method public static String valueOf(boolean);
    field public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
  }

  public final class StringBuffer implements java.lang.Appendable java.lang.CharSequence java.io.Serializable {
    ctor public StringBuffer();
    ctor public StringBuffer(int);
    ctor public StringBuffer(String);
    ctor public StringBuffer(CharSequence);
    method public StringBuffer append(boolean);
    method public StringBuffer append(char);
    method public StringBuffer append(double);
    method public StringBuffer append(float);
    method public StringBuffer append(int);
    method public StringBuffer append(long);
    method public StringBuffer append(Object);
    method public StringBuffer append(String);
    method public StringBuffer append(StringBuffer);
    method public StringBuffer append(char[]);
    method public StringBuffer append(char[], int, int);
    method public StringBuffer append(CharSequence);
    method public StringBuffer append(CharSequence, int, int);
    method public StringBuffer appendCodePoint(int);
    method public int capacity();
    method public char charAt(int);
    method public int codePointAt(int);
    method public int codePointBefore(int);
    method public int codePointCount(int, int);
    method public StringBuffer delete(int, int);
    method public StringBuffer deleteCharAt(int);
    method public void ensureCapacity(int);
    method public void getChars(int, int, char[], int);
    method public int indexOf(String, int);
    method public int indexOf(String);
    method public StringBuffer insert(int, char);
    method public StringBuffer insert(int, boolean);
    method public StringBuffer insert(int, int);
    method public StringBuffer insert(int, long);
    method public StringBuffer insert(int, double);
    method public StringBuffer insert(int, float);
    method public StringBuffer insert(int, Object);
    method public StringBuffer insert(int, String);
    method public StringBuffer insert(int, char[]);
    method public StringBuffer insert(int, char[], int, int);
    method public StringBuffer insert(int, CharSequence);
    method public StringBuffer insert(int, CharSequence, int, int);
    method public int lastIndexOf(String, int);
    method public int lastIndexOf(String);
    method public int length();
    method public int offsetByCodePoints(int, int);
    method public StringBuffer replace(int, int, String);
    method public StringBuffer reverse();
    method public void setCharAt(int, char);
    method public void setLength(int);
    method public CharSequence subSequence(int, int);
    method public String substring(int);
    method public String substring(int, int);
    method public void trimToSize();
  }

  public final class StringBuilder implements java.lang.Appendable java.lang.CharSequence java.io.Serializable {
    ctor public StringBuilder();
    ctor public StringBuilder(int);
    ctor public StringBuilder(CharSequence);
    ctor public StringBuilder(String);
    method public StringBuilder append(boolean);
    method public StringBuilder append(char);
    method public StringBuilder append(int);
    method public StringBuilder append(long);
    method public StringBuilder append(float);
    method public StringBuilder append(double);
    method public StringBuilder append(Object);
    method public StringBuilder append(String);
    method public StringBuilder append(StringBuffer);
    method public StringBuilder append(char[]);
    method public StringBuilder append(char[], int, int);
    method public StringBuilder append(CharSequence);
    method public StringBuilder append(CharSequence, int, int);
    method public StringBuilder appendCodePoint(int);
    method public int capacity();
    method public char charAt(int);
    method public int codePointAt(int);
    method public int codePointBefore(int);
    method public int codePointCount(int, int);
    method public StringBuilder delete(int, int);
    method public StringBuilder deleteCharAt(int);
    method public void ensureCapacity(int);
    method public void getChars(int, int, char[], int);
    method public int indexOf(String);
    method public int indexOf(String, int);
    method public StringBuilder insert(int, boolean);
    method public StringBuilder insert(int, char);
    method public StringBuilder insert(int, int);
    method public StringBuilder insert(int, long);
    method public StringBuilder insert(int, float);
    method public StringBuilder insert(int, double);
    method public StringBuilder insert(int, Object);
    method public StringBuilder insert(int, String);
    method public StringBuilder insert(int, char[]);
    method public StringBuilder insert(int, char[], int, int);
    method public StringBuilder insert(int, CharSequence);
    method public StringBuilder insert(int, CharSequence, int, int);
    method public int lastIndexOf(String);
    method public int lastIndexOf(String, int);
    method public int length();
    method public int offsetByCodePoints(int, int);
    method public StringBuilder replace(int, int, String);
    method public StringBuilder reverse();
    method public void setCharAt(int, char);
    method public void setLength(int);
    method public CharSequence subSequence(int, int);
    method public String substring(int);
    method public String substring(int, int);
    method public void trimToSize();
  }

  public class StringIndexOutOfBoundsException extends java.lang.IndexOutOfBoundsException {
    ctor public StringIndexOutOfBoundsException();
    ctor public StringIndexOutOfBoundsException(int);
    ctor public StringIndexOutOfBoundsException(String);
  }

  @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.LOCAL_VARIABLE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public @interface SuppressWarnings {
    method public abstract String[] value();
  }

  public final class System {
    method public static void arraycopy(Object, int, Object, int, int);
    method public static String clearProperty(String);
    method public static long currentTimeMillis();
    method public static void exit(int);
    method public static void gc();
    method public static java.util.Properties getProperties();
    method public static String getProperty(String);
    method public static String getProperty(String, String);
    method public static SecurityManager getSecurityManager();
    method public static String getenv(String);
    method public static java.util.Map<java.lang.String,java.lang.String> getenv();
    method public static int identityHashCode(Object);
    method public static java.nio.channels.Channel inheritedChannel() throws java.io.IOException;
    method public static void load(String);
    method public static void loadLibrary(String);
    method public static String mapLibraryName(String);
    method public static long nanoTime();
    method public static void runFinalization();
    method public static void runFinalizersOnExit(boolean);
    method public static void setErr(java.io.PrintStream);
    method public static void setIn(java.io.InputStream);
    method public static void setOut(java.io.PrintStream);
    method public static void setProperties(java.util.Properties);
    method public static String setProperty(String, String);
    method public static void setSecurityManager(SecurityManager);
    field public static final java.io.PrintStream err;
    field public static final java.io.InputStream in;
    field public static final java.io.PrintStream out;
  }

  public class Thread implements java.lang.Runnable {
    ctor public Thread();
    ctor public Thread(Runnable);
    ctor public Thread(Runnable, String);
    ctor public Thread(String);
    ctor public Thread(ThreadGroup, Runnable);
    ctor public Thread(ThreadGroup, Runnable, String);
    ctor public Thread(ThreadGroup, String);
    ctor public Thread(ThreadGroup, Runnable, String, long);
    method public static int activeCount();
    method public final void checkAccess();
    method public int countStackFrames();
    method public static Thread currentThread();
    method public void destroy();
    method public static void dumpStack();
    method public static int enumerate(Thread[]);
    method public static java.util.Map<java.lang.Thread,java.lang.StackTraceElement[]> getAllStackTraces();
    method public ClassLoader getContextClassLoader();
    method public static java.lang.Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();
    method public long getId();
    method public final String getName();
    method public final int getPriority();
    method public StackTraceElement[] getStackTrace();
    method public java.lang.Thread.State getState();
    method public final ThreadGroup getThreadGroup();
    method public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler();
    method public static boolean holdsLock(Object);
    method public void interrupt();
    method public static boolean interrupted();
    method public final boolean isAlive();
    method public final boolean isDaemon();
    method public boolean isInterrupted();
    method public final void join() throws java.lang.InterruptedException;
    method public final void join(long) throws java.lang.InterruptedException;
    method public final void join(long, int) throws java.lang.InterruptedException;
    method public final void resume();
    method public void run();
    method public void setContextClassLoader(ClassLoader);
    method public final void setDaemon(boolean);
    method public static void setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler);
    method public final void setName(String);
    method public final void setPriority(int);
    method public void setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler);
    method public static void sleep(long) throws java.lang.InterruptedException;
    method public static void sleep(long, int) throws java.lang.InterruptedException;
    method public void start();
    method public final void stop();
    method public final void stop(Throwable);
    method public final void suspend();
    method public static void yield();
    field public static final int MAX_PRIORITY = 10; // 0xa
    field public static final int MIN_PRIORITY = 1; // 0x1
    field public static final int NORM_PRIORITY = 5; // 0x5
  }

  public enum Thread.State {
    enum_constant public static final java.lang.Thread.State BLOCKED;
    enum_constant public static final java.lang.Thread.State NEW;
    enum_constant public static final java.lang.Thread.State RUNNABLE;
    enum_constant public static final java.lang.Thread.State TERMINATED;
    enum_constant public static final java.lang.Thread.State TIMED_WAITING;
    enum_constant public static final java.lang.Thread.State WAITING;
  }

  public static interface Thread.UncaughtExceptionHandler {
    method public void uncaughtException(Thread, Throwable);
  }

  public class ThreadDeath extends java.lang.Error {
    ctor public ThreadDeath();
  }

  public class ThreadGroup implements java.lang.Thread.UncaughtExceptionHandler {
    ctor public ThreadGroup(String);
    ctor public ThreadGroup(ThreadGroup, String);
    method public int activeCount();
    method public int activeGroupCount();
    method public boolean allowThreadSuspension(boolean);
    method public final void checkAccess();
    method public final void destroy();
    method public int enumerate(Thread[]);
    method public int enumerate(Thread[], boolean);
    method public int enumerate(ThreadGroup[]);
    method public int enumerate(ThreadGroup[], boolean);
    method public final int getMaxPriority();
    method public final String getName();
    method public final ThreadGroup getParent();
    method public final void interrupt();
    method public final boolean isDaemon();
    method public boolean isDestroyed();
    method public void list();
    method public final boolean parentOf(ThreadGroup);
    method public final void resume();
    method public final void setDaemon(boolean);
    method public final void setMaxPriority(int);
    method public final void stop();
    method public final void suspend();
    method public void uncaughtException(Thread, Throwable);
  }

  public class ThreadLocal<T> {
    ctor public ThreadLocal();
    method public T get();
    method protected T initialValue();
    method public void remove();
    method public void set(T);
  }

  public class Throwable implements java.io.Serializable {
    ctor public Throwable();
    ctor public Throwable(String);
    ctor public Throwable(String, Throwable);
    ctor public Throwable(Throwable);
    method public Throwable fillInStackTrace();
    method public Throwable getCause();
    method public String getLocalizedMessage();
    method public String getMessage();
    method public StackTraceElement[] getStackTrace();
    method public Throwable initCause(Throwable);
    method public void printStackTrace();
    method public void printStackTrace(java.io.PrintStream);
    method public void printStackTrace(java.io.PrintWriter);
    method public void setStackTrace(StackTraceElement[]);
  }

  public class TypeNotPresentException extends java.lang.RuntimeException {
    ctor public TypeNotPresentException(String, Throwable);
    method public String typeName();
  }

  public class UnknownError extends java.lang.VirtualMachineError {
    ctor public UnknownError();
    ctor public UnknownError(String);
  }

  public class UnsatisfiedLinkError extends java.lang.LinkageError {
    ctor public UnsatisfiedLinkError();
    ctor public UnsatisfiedLinkError(String);
  }

  public class UnsupportedClassVersionError extends java.lang.ClassFormatError {
    ctor public UnsupportedClassVersionError();
    ctor public UnsupportedClassVersionError(String);
  }

  public class UnsupportedOperationException extends java.lang.RuntimeException {
    ctor public UnsupportedOperationException();
    ctor public UnsupportedOperationException(String);
    ctor public UnsupportedOperationException(String, Throwable);
    ctor public UnsupportedOperationException(Throwable);
  }

  public class VerifyError extends java.lang.LinkageError {
    ctor public VerifyError();
    ctor public VerifyError(String);
  }

  public abstract class VirtualMachineError extends java.lang.Error {
    ctor public VirtualMachineError();
    ctor public VirtualMachineError(String);
  }

  public final class Void {
    field public static final Class<java.lang.Void> TYPE;
  }

}

package java.lang.annotation {

  public interface Annotation {
    method public Class<? extends java.lang.annotation.Annotation> annotationType();
    method public boolean equals(Object);
    method public int hashCode();
    method public String toString();
  }

  public class AnnotationFormatError extends java.lang.Error {
    ctor public AnnotationFormatError(String);
    ctor public AnnotationFormatError(String, Throwable);
    ctor public AnnotationFormatError(Throwable);
  }

  public class AnnotationTypeMismatchException extends java.lang.RuntimeException {
    ctor public AnnotationTypeMismatchException(java.lang.reflect.Method, String);
    method public java.lang.reflect.Method element();
    method public String foundType();
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Documented {
  }

  public enum ElementType {
    enum_constant public static final java.lang.annotation.ElementType ANNOTATION_TYPE;
    enum_constant public static final java.lang.annotation.ElementType CONSTRUCTOR;
    enum_constant public static final java.lang.annotation.ElementType FIELD;
    enum_constant public static final java.lang.annotation.ElementType LOCAL_VARIABLE;
    enum_constant public static final java.lang.annotation.ElementType METHOD;
    enum_constant public static final java.lang.annotation.ElementType PACKAGE;
    enum_constant public static final java.lang.annotation.ElementType PARAMETER;
    enum_constant public static final java.lang.annotation.ElementType TYPE;
  }

  public class IncompleteAnnotationException extends java.lang.RuntimeException {
    ctor public IncompleteAnnotationException(Class<? extends java.lang.annotation.Annotation>, String);
    method public Class<? extends java.lang.annotation.Annotation> annotationType();
    method public String elementName();
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Inherited {
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Retention {
    method public abstract java.lang.annotation.RetentionPolicy value();
  }

  public enum RetentionPolicy {
    enum_constant public static final java.lang.annotation.RetentionPolicy CLASS;
    enum_constant public static final java.lang.annotation.RetentionPolicy RUNTIME;
    enum_constant public static final java.lang.annotation.RetentionPolicy SOURCE;
  }

  @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Target {
    method public abstract java.lang.annotation.ElementType[] value();
  }

}

package java.lang.ref {

  public class PhantomReference<T> extends java.lang.ref.Reference<T> {
    ctor public PhantomReference(T, java.lang.ref.ReferenceQueue<? super T>);
  }

  public abstract class Reference<T> {
    method public void clear();
    method public boolean enqueue();
    method public T get();
    method public boolean isEnqueued();
  }

  public class ReferenceQueue<T> {
    ctor public ReferenceQueue();
    method public java.lang.ref.Reference<? extends T> poll();
    method public java.lang.ref.Reference<? extends T> remove() throws java.lang.InterruptedException;
    method public java.lang.ref.Reference<? extends T> remove(long) throws java.lang.IllegalArgumentException, java.lang.InterruptedException;
  }

  public class SoftReference<T> extends java.lang.ref.Reference<T> {
    ctor public SoftReference(T);
    ctor public SoftReference(T, java.lang.ref.ReferenceQueue<? super T>);
  }

  public class WeakReference<T> extends java.lang.ref.Reference<T> {
    ctor public WeakReference(T);
    ctor public WeakReference(T, java.lang.ref.ReferenceQueue<? super T>);
  }

}

package java.lang.reflect {

  public class AccessibleObject implements java.lang.reflect.AnnotatedElement {
    ctor protected AccessibleObject();
    method public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T>);
    method public java.lang.annotation.Annotation[] getAnnotations();
    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    method public boolean isAccessible();
    method public boolean isAnnotationPresent(Class<? extends java.lang.annotation.Annotation>);
    method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException;
    method public void setAccessible(boolean) throws java.lang.SecurityException;
  }

  public interface AnnotatedElement {
    method public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T>);
    method public java.lang.annotation.Annotation[] getAnnotations();
    method public java.lang.annotation.Annotation[] getDeclaredAnnotations();
    method public boolean isAnnotationPresent(Class<? extends java.lang.annotation.Annotation>);
  }

  public final class Array {
    method public static Object get(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static boolean getBoolean(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static byte getByte(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static char getChar(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static double getDouble(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static float getFloat(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static int getInt(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static int getLength(Object);
    method public static long getLong(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static short getShort(Object, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static Object newInstance(Class<?>, int[]) throws java.lang.IllegalArgumentException, java.lang.NegativeArraySizeException;
    method public static Object newInstance(Class<?>, int) throws java.lang.NegativeArraySizeException;
    method public static void set(Object, int, Object) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setBoolean(Object, int, boolean);
    method public static void setByte(Object, int, byte) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setChar(Object, int, char) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setDouble(Object, int, double) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setFloat(Object, int, float) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setInt(Object, int, int) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setLong(Object, int, long) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
    method public static void setShort(Object, int, short) throws java.lang.ArrayIndexOutOfBoundsException, java.lang.IllegalArgumentException;
  }

  public final class Constructor<T> extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
    method public Class<T> getDeclaringClass();
    method public Class<?>[] getExceptionTypes();
    method public java.lang.reflect.Type[] getGenericExceptionTypes();
    method public java.lang.reflect.Type[] getGenericParameterTypes();
    method public int getModifiers();
    method public String getName();
    method public java.lang.annotation.Annotation[][] getParameterAnnotations();
    method public Class<?>[] getParameterTypes();
    method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters();
    method public boolean isSynthetic();
    method public boolean isVarArgs();
    method public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException;
    method public String toGenericString();
  }

  public final class Field extends java.lang.reflect.AccessibleObject implements java.lang.reflect.Member {
    method public Object get(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public boolean getBoolean(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public byte getByte(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public char getChar(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public Class<?> getDeclaringClass();
    method public double getDouble(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public float getFloat(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public java.lang.reflect.Type getGenericType();
    method public int getInt(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public long getLong(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public int getModifiers();
    method public String getName();
    method public short getShort(Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public Class<?> getType();
    method public boolean isEnumConstant();
    method public boolean isSynthetic();
    method public void set(Object, Object) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setBoolean(Object, boolean) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setByte(Object, byte) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setChar(Object, char) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setDouble(Object, double) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setFloat(Object, float) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setInt(Object, int) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setLong(Object, long) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public void setShort(Object, short) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException;
    method public String toGenericString();
  }

  public interface GenericArrayType extends java.lang.reflect.Type {
    method public java.lang.reflect.Type getGenericComponentType();
  }

  public interface GenericDeclaration {
    method public java.lang.reflect.TypeVariable<?>[] getTypeParameters();
  }

  public class GenericSignatureFormatError extends java.lang.ClassFormatError {
    ctor public GenericSignatureFormatError();
  }

  public interface InvocationHandler {
    method public Object invoke(Object, java.lang.reflect.Method, Object[]) throws java.lang.Throwable;
  }

  public class InvocationTargetException extends java.lang.Exception {
    ctor protected InvocationTargetException();
    ctor public InvocationTargetException(Throwable);
    ctor public InvocationTargetException(Throwable, String);
    method public Throwable getTargetException();
  }

  public class MalformedParameterizedTypeException extends java.lang.RuntimeException {
    ctor public MalformedParameterizedTypeException();
  }

  public interface Member {
    method public Class getDeclaringClass();
    method public int getModifiers();
    method public String getName();
    method public boolean isSynthetic();
    field public static final int DECLARED = 1; // 0x1
    field public static final int PUBLIC = 0; // 0x0
  }

  public final class Method extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member {
    method public Class<?> getDeclaringClass();
    method public Object getDefaultValue();
    method public Class<?>[] getExceptionTypes();
    method public java.lang.reflect.Type[] getGenericExceptionTypes();
    method public java.lang.reflect.Type[] getGenericParameterTypes();
    method public java.lang.reflect.Type getGenericReturnType();
    method public int getModifiers();
    method public String getName();
    method public java.lang.annotation.Annotation[][] getParameterAnnotations();
    method public Class<?>[] getParameterTypes();
    method public Class<?> getReturnType();
    method public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters();
    method public Object invoke(Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException;
    method public boolean isBridge();
    method public boolean isSynthetic();
    method public boolean isVarArgs();
    method public String toGenericString();
  }

  public class Modifier {
    ctor public Modifier();
    method public static boolean isAbstract(int);
    method public static boolean isFinal(int);
    method public static boolean isInterface(int);
    method public static boolean isNative(int);
    method public static boolean isPrivate(int);
    method public static boolean isProtected(int);
    method public static boolean isPublic(int);
    method public static boolean isStatic(int);
    method public static boolean isStrict(int);
    method public static boolean isSynchronized(int);
    method public static boolean isTransient(int);
    method public static boolean isVolatile(int);
    method public static String toString(int);
    field public static final int ABSTRACT = 1024; // 0x400
    field public static final int FINAL = 16; // 0x10
    field public static final int INTERFACE = 512; // 0x200
    field public static final int NATIVE = 256; // 0x100
    field public static final int PRIVATE = 2; // 0x2
    field public static final int PROTECTED = 4; // 0x4
    field public static final int PUBLIC = 1; // 0x1
    field public static final int STATIC = 8; // 0x8
    field public static final int STRICT = 2048; // 0x800
    field public static final int SYNCHRONIZED = 32; // 0x20
    field public static final int TRANSIENT = 128; // 0x80
    field public static final int VOLATILE = 64; // 0x40
  }

  public interface ParameterizedType extends java.lang.reflect.Type {
    method public java.lang.reflect.Type[] getActualTypeArguments();
    method public java.lang.reflect.Type getOwnerType();
    method public java.lang.reflect.Type getRawType();
  }

  public class Proxy implements java.io.Serializable {
    ctor protected Proxy(java.lang.reflect.InvocationHandler);
    method public static java.lang.reflect.InvocationHandler getInvocationHandler(Object) throws java.lang.IllegalArgumentException;
    method public static Class<?> getProxyClass(ClassLoader, Class<?>...) throws java.lang.IllegalArgumentException;
    method public static boolean isProxyClass(Class<?>);
    method public static Object newProxyInstance(ClassLoader, Class<?>[], java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException;
    field protected java.lang.reflect.InvocationHandler h;
  }

  public final class ReflectPermission extends java.security.BasicPermission {
    ctor public ReflectPermission(String);
    ctor public ReflectPermission(String, String);
  }

  public interface Type {
  }

  public interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> extends java.lang.reflect.Type {
    method public java.lang.reflect.Type[] getBounds();
    method public D getGenericDeclaration();
    method public String getName();
  }

  public class UndeclaredThrowableException extends java.lang.RuntimeException {
    ctor public UndeclaredThrowableException(Throwable);
    ctor public UndeclaredThrowableException(Throwable, String);
    method public Throwable getUndeclaredThrowable();
  }

  public interface WildcardType extends java.lang.reflect.Type {
    method public java.lang.reflect.Type[] getLowerBounds();
    method public java.lang.reflect.Type[] getUpperBounds();
  }

}

package java.math {

  public class BigDecimal extends java.lang.Number implements java.lang.Comparable<java.math.BigDecimal> java.io.Serializable {
    ctor public BigDecimal(char[], int, int);
    ctor public BigDecimal(char[], int, int, java.math.MathContext);
    ctor public BigDecimal(char[]);
    ctor public BigDecimal(char[], java.math.MathContext);
    ctor public BigDecimal(String);
    ctor public BigDecimal(String, java.math.MathContext);
    ctor public BigDecimal(double);
    ctor public BigDecimal(double, java.math.MathContext);
    ctor public BigDecimal(java.math.BigInteger);
    ctor public BigDecimal(java.math.BigInteger, java.math.MathContext);
    ctor public BigDecimal(java.math.BigInteger, int);
    ctor public BigDecimal(java.math.BigInteger, int, java.math.MathContext);
    ctor public BigDecimal(int);
    ctor public BigDecimal(int, java.math.MathContext);
    ctor public BigDecimal(long);
    ctor public BigDecimal(long, java.math.MathContext);
    method public java.math.BigDecimal abs();
    method public java.math.BigDecimal abs(java.math.MathContext);
    method public java.math.BigDecimal add(java.math.BigDecimal);
    method public java.math.BigDecimal add(java.math.BigDecimal, java.math.MathContext);
    method public byte byteValueExact();
    method public int compareTo(java.math.BigDecimal);
    method public java.math.BigDecimal divide(java.math.BigDecimal, int, int);
    method public java.math.BigDecimal divide(java.math.BigDecimal, int, java.math.RoundingMode);
    method public java.math.BigDecimal divide(java.math.BigDecimal, int);
    method public java.math.BigDecimal divide(java.math.BigDecimal, java.math.RoundingMode);
    method public java.math.BigDecimal divide(java.math.BigDecimal);
    method public java.math.BigDecimal divide(java.math.BigDecimal, java.math.MathContext);
    method public java.math.BigDecimal[] divideAndRemainder(java.math.BigDecimal);
    method public java.math.BigDecimal[] divideAndRemainder(java.math.BigDecimal, java.math.MathContext);
    method public java.math.BigDecimal divideToIntegralValue(java.math.BigDecimal);
    method public java.math.BigDecimal divideToIntegralValue(java.math.BigDecimal, java.math.MathContext);
    method public double doubleValue();
    method public float floatValue();
    method public int intValue();
    method public int intValueExact();
    method public long longValue();
    method public long longValueExact();
    method public java.math.BigDecimal max(java.math.BigDecimal);
    method public java.math.BigDecimal min(java.math.BigDecimal);
    method public java.math.BigDecimal movePointLeft(int);
    method public java.math.BigDecimal movePointRight(int);
    method public java.math.BigDecimal multiply(java.math.BigDecimal);
    method public java.math.BigDecimal multiply(java.math.BigDecimal, java.math.MathContext);
    method public java.math.BigDecimal negate();
    method public java.math.BigDecimal negate(java.math.MathContext);
    method public java.math.BigDecimal plus();
    method public java.math.BigDecimal plus(java.math.MathContext);
    method public java.math.BigDecimal pow(int);
    method public java.math.BigDecimal pow(int, java.math.MathContext);
    method public int precision();
    method public java.math.BigDecimal remainder(java.math.BigDecimal);
    method public java.math.BigDecimal remainder(java.math.BigDecimal, java.math.MathContext);
    method public java.math.BigDecimal round(java.math.MathContext);
    method public int scale();
    method public java.math.BigDecimal scaleByPowerOfTen(int);
    method public java.math.BigDecimal setScale(int, java.math.RoundingMode);
    method public java.math.BigDecimal setScale(int, int);
    method public java.math.BigDecimal setScale(int);
    method public short shortValueExact();
    method public int signum();
    method public java.math.BigDecimal stripTrailingZeros();
    method public java.math.BigDecimal subtract(java.math.BigDecimal);
    method public java.math.BigDecimal subtract(java.math.BigDecimal, java.math.MathContext);
    method public java.math.BigInteger toBigInteger();
    method public java.math.BigInteger toBigIntegerExact();
    method public String toEngineeringString();
    method public String toPlainString();
    method public java.math.BigDecimal ulp();
    method public java.math.BigInteger unscaledValue();
    method public static java.math.BigDecimal valueOf(long, int);
    method public static java.math.BigDecimal valueOf(long);
    method public static java.math.BigDecimal valueOf(double);
    field public static final java.math.BigDecimal ONE;
    field public static final int ROUND_CEILING = 2; // 0x2
    field public static final int ROUND_DOWN = 1; // 0x1
    field public static final int ROUND_FLOOR = 3; // 0x3
    field public static final int ROUND_HALF_DOWN = 5; // 0x5
    field public static final int ROUND_HALF_EVEN = 6; // 0x6
    field public static final int ROUND_HALF_UP = 4; // 0x4
    field public static final int ROUND_UNNECESSARY = 7; // 0x7
    field public static final int ROUND_UP = 0; // 0x0
    field public static final java.math.BigDecimal TEN;
    field public static final java.math.BigDecimal ZERO;
  }

  public class BigInteger extends java.lang.Number implements java.lang.Comparable<java.math.BigInteger> java.io.Serializable {
    ctor public BigInteger(int, java.util.Random);
    ctor public BigInteger(int, int, java.util.Random);
    ctor public BigInteger(String);
    ctor public BigInteger(String, int);
    ctor public BigInteger(int, byte[]);
    ctor public BigInteger(byte[]);
    method public java.math.BigInteger abs();
    method public java.math.BigInteger add(java.math.BigInteger);
    method public java.math.BigInteger and(java.math.BigInteger);
    method public java.math.BigInteger andNot(java.math.BigInteger);
    method public int bitCount();
    method public int bitLength();
    method public java.math.BigInteger clearBit(int);
    method public int compareTo(java.math.BigInteger);
    method public java.math.BigInteger divide(java.math.BigInteger);
    method public java.math.BigInteger[] divideAndRemainder(java.math.BigInteger);
    method public double doubleValue();
    method public java.math.BigInteger flipBit(int);
    method public float floatValue();
    method public java.math.BigInteger gcd(java.math.BigInteger);
    method public int getLowestSetBit();
    method public int intValue();
    method public boolean isProbablePrime(int);
    method public long longValue();
    method public java.math.BigInteger max(java.math.BigInteger);
    method public java.math.BigInteger min(java.math.BigInteger);
    method public java.math.BigInteger mod(java.math.BigInteger);
    method public java.math.BigInteger modInverse(java.math.BigInteger);
    method public java.math.BigInteger modPow(java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger multiply(java.math.BigInteger);
    method public java.math.BigInteger negate();
    method public java.math.BigInteger nextProbablePrime();
    method public java.math.BigInteger not();
    method public java.math.BigInteger or(java.math.BigInteger);
    method public java.math.BigInteger pow(int);
    method public static java.math.BigInteger probablePrime(int, java.util.Random);
    method public java.math.BigInteger remainder(java.math.BigInteger);
    method public java.math.BigInteger setBit(int);
    method public java.math.BigInteger shiftLeft(int);
    method public java.math.BigInteger shiftRight(int);
    method public int signum();
    method public java.math.BigInteger subtract(java.math.BigInteger);
    method public boolean testBit(int);
    method public byte[] toByteArray();
    method public String toString(int);
    method public static java.math.BigInteger valueOf(long);
    method public java.math.BigInteger xor(java.math.BigInteger);
    field public static final java.math.BigInteger ONE;
    field public static final java.math.BigInteger TEN;
    field public static final java.math.BigInteger ZERO;
  }

  public final class MathContext implements java.io.Serializable {
    ctor public MathContext(int);
    ctor public MathContext(int, java.math.RoundingMode);
    ctor public MathContext(String);
    method public int getPrecision();
    method public java.math.RoundingMode getRoundingMode();
    field public static final java.math.MathContext DECIMAL128;
    field public static final java.math.MathContext DECIMAL32;
    field public static final java.math.MathContext DECIMAL64;
    field public static final java.math.MathContext UNLIMITED;
  }

  public enum RoundingMode {
    method public static java.math.RoundingMode valueOf(int);
    enum_constant public static final java.math.RoundingMode CEILING;
    enum_constant public static final java.math.RoundingMode DOWN;
    enum_constant public static final java.math.RoundingMode FLOOR;
    enum_constant public static final java.math.RoundingMode HALF_DOWN;
    enum_constant public static final java.math.RoundingMode HALF_EVEN;
    enum_constant public static final java.math.RoundingMode HALF_UP;
    enum_constant public static final java.math.RoundingMode UNNECESSARY;
    enum_constant public static final java.math.RoundingMode UP;
  }

}

package java.net {

  public abstract class Authenticator {
    ctor public Authenticator();
    method protected java.net.PasswordAuthentication getPasswordAuthentication();
    method protected final String getRequestingHost();
    method protected final int getRequestingPort();
    method protected final String getRequestingPrompt();
    method protected final String getRequestingProtocol();
    method protected final String getRequestingScheme();
    method protected final java.net.InetAddress getRequestingSite();
    method protected java.net.URL getRequestingURL();
    method protected java.net.Authenticator.RequestorType getRequestorType();
    method public static java.net.PasswordAuthentication requestPasswordAuthentication(java.net.InetAddress, int, String, String, String);
    method public static java.net.PasswordAuthentication requestPasswordAuthentication(String, java.net.InetAddress, int, String, String, String);
    method public static java.net.PasswordAuthentication requestPasswordAuthentication(String, java.net.InetAddress, int, String, String, String, java.net.URL, java.net.Authenticator.RequestorType);
    method public static void setDefault(java.net.Authenticator);
  }

  public enum Authenticator.RequestorType {
    enum_constant public static final java.net.Authenticator.RequestorType PROXY;
    enum_constant public static final java.net.Authenticator.RequestorType SERVER;
  }

  public class BindException extends java.net.SocketException {
    ctor public BindException();
    ctor public BindException(String);
  }

  public abstract class CacheRequest {
    ctor public CacheRequest();
    method public abstract void abort();
    method public abstract java.io.OutputStream getBody() throws java.io.IOException;
  }

  public abstract class CacheResponse {
    ctor public CacheResponse();
    method public abstract java.io.InputStream getBody() throws java.io.IOException;
    method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> getHeaders() throws java.io.IOException;
  }

  public class ConnectException extends java.net.SocketException {
    ctor public ConnectException();
    ctor public ConnectException(String);
  }

  public abstract class ContentHandler {
    ctor public ContentHandler();
    method public abstract Object getContent(java.net.URLConnection) throws java.io.IOException;
    method public Object getContent(java.net.URLConnection, Class[]) throws java.io.IOException;
  }

  public interface ContentHandlerFactory {
    method public java.net.ContentHandler createContentHandler(String);
  }

  public abstract class CookieHandler {
    ctor public CookieHandler();
    method public abstract java.util.Map<java.lang.String,java.util.List<java.lang.String>> get(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
    method public static java.net.CookieHandler getDefault();
    method public abstract void put(java.net.URI, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
    method public static void setDefault(java.net.CookieHandler);
  }

  public final class DatagramPacket {
    ctor public DatagramPacket(byte[], int);
    ctor public DatagramPacket(byte[], int, int);
    ctor public DatagramPacket(byte[], int, int, java.net.InetAddress, int);
    ctor public DatagramPacket(byte[], int, java.net.InetAddress, int);
    ctor public DatagramPacket(byte[], int, java.net.SocketAddress) throws java.net.SocketException;
    ctor public DatagramPacket(byte[], int, int, java.net.SocketAddress) throws java.net.SocketException;
    method public java.net.InetAddress getAddress();
    method public byte[] getData();
    method public int getLength();
    method public int getOffset();
    method public int getPort();
    method public java.net.SocketAddress getSocketAddress();
    method public void setAddress(java.net.InetAddress);
    method public void setData(byte[], int, int);
    method public void setData(byte[]);
    method public void setLength(int);
    method public void setPort(int);
    method public void setSocketAddress(java.net.SocketAddress);
  }

  public class DatagramSocket {
    ctor public DatagramSocket() throws java.net.SocketException;
    ctor public DatagramSocket(int) throws java.net.SocketException;
    ctor public DatagramSocket(int, java.net.InetAddress) throws java.net.SocketException;
    ctor protected DatagramSocket(java.net.DatagramSocketImpl);
    ctor public DatagramSocket(java.net.SocketAddress) throws java.net.SocketException;
    method public void bind(java.net.SocketAddress) throws java.net.SocketException;
    method public void close();
    method public void connect(java.net.InetAddress, int);
    method public void connect(java.net.SocketAddress) throws java.net.SocketException;
    method public void disconnect();
    method public boolean getBroadcast() throws java.net.SocketException;
    method public java.nio.channels.DatagramChannel getChannel();
    method public java.net.InetAddress getInetAddress();
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method public java.net.SocketAddress getLocalSocketAddress();
    method public int getPort();
    method public int getReceiveBufferSize() throws java.net.SocketException;
    method public java.net.SocketAddress getRemoteSocketAddress();
    method public boolean getReuseAddress() throws java.net.SocketException;
    method public int getSendBufferSize() throws java.net.SocketException;
    method public int getSoTimeout() throws java.net.SocketException;
    method public int getTrafficClass() throws java.net.SocketException;
    method public boolean isBound();
    method public boolean isClosed();
    method public boolean isConnected();
    method public void receive(java.net.DatagramPacket) throws java.io.IOException;
    method public void send(java.net.DatagramPacket) throws java.io.IOException;
    method public void setBroadcast(boolean) throws java.net.SocketException;
    method public static void setDatagramSocketImplFactory(java.net.DatagramSocketImplFactory) throws java.io.IOException;
    method public void setReceiveBufferSize(int) throws java.net.SocketException;
    method public void setReuseAddress(boolean) throws java.net.SocketException;
    method public void setSendBufferSize(int) throws java.net.SocketException;
    method public void setSoTimeout(int) throws java.net.SocketException;
    method public void setTrafficClass(int) throws java.net.SocketException;
  }

  public abstract class DatagramSocketImpl implements java.net.SocketOptions {
    ctor public DatagramSocketImpl();
    method protected abstract void bind(int, java.net.InetAddress) throws java.net.SocketException;
    method protected abstract void close();
    method protected void connect(java.net.InetAddress, int) throws java.net.SocketException;
    method protected abstract void create() throws java.net.SocketException;
    method protected void disconnect();
    method protected java.io.FileDescriptor getFileDescriptor();
    method protected int getLocalPort();
    method protected abstract byte getTTL() throws java.io.IOException;
    method protected abstract int getTimeToLive() throws java.io.IOException;
    method protected abstract void join(java.net.InetAddress) throws java.io.IOException;
    method protected abstract void joinGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
    method protected abstract void leave(java.net.InetAddress) throws java.io.IOException;
    method protected abstract void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
    method protected abstract int peek(java.net.InetAddress) throws java.io.IOException;
    method protected abstract int peekData(java.net.DatagramPacket) throws java.io.IOException;
    method protected abstract void receive(java.net.DatagramPacket) throws java.io.IOException;
    method protected abstract void send(java.net.DatagramPacket) throws java.io.IOException;
    method protected abstract void setTTL(byte) throws java.io.IOException;
    method protected abstract void setTimeToLive(int) throws java.io.IOException;
    field protected java.io.FileDescriptor fd;
    field protected int localPort;
  }

  public interface DatagramSocketImplFactory {
    method public java.net.DatagramSocketImpl createDatagramSocketImpl();
  }

  public interface FileNameMap {
    method public String getContentTypeFor(String);
  }

  public class HttpRetryException extends java.io.IOException {
    ctor public HttpRetryException(String, int);
    ctor public HttpRetryException(String, int, String);
    method public String getLocation();
    method public String getReason();
    method public int responseCode();
  }

  public abstract class HttpURLConnection extends java.net.URLConnection {
    ctor protected HttpURLConnection(java.net.URL);
    method public abstract void disconnect();
    method public java.io.InputStream getErrorStream();
    method public static boolean getFollowRedirects();
    method public boolean getInstanceFollowRedirects();
    method public String getRequestMethod();
    method public int getResponseCode() throws java.io.IOException;
    method public String getResponseMessage() throws java.io.IOException;
    method public void setChunkedStreamingMode(int);
    method public void setFixedLengthStreamingMode(int);
    method public static void setFollowRedirects(boolean);
    method public void setInstanceFollowRedirects(boolean);
    method public void setRequestMethod(String) throws java.net.ProtocolException;
    method public abstract boolean usingProxy();
    field public static final int HTTP_ACCEPTED = 202; // 0xca
    field public static final int HTTP_BAD_GATEWAY = 502; // 0x1f6
    field public static final int HTTP_BAD_METHOD = 405; // 0x195
    field public static final int HTTP_BAD_REQUEST = 400; // 0x190
    field public static final int HTTP_CLIENT_TIMEOUT = 408; // 0x198
    field public static final int HTTP_CONFLICT = 409; // 0x199
    field public static final int HTTP_CREATED = 201; // 0xc9
    field public static final int HTTP_ENTITY_TOO_LARGE = 413; // 0x19d
    field public static final int HTTP_FORBIDDEN = 403; // 0x193
    field public static final int HTTP_GATEWAY_TIMEOUT = 504; // 0x1f8
    field public static final int HTTP_GONE = 410; // 0x19a
    field public static final int HTTP_INTERNAL_ERROR = 500; // 0x1f4
    field public static final int HTTP_LENGTH_REQUIRED = 411; // 0x19b
    field public static final int HTTP_MOVED_PERM = 301; // 0x12d
    field public static final int HTTP_MOVED_TEMP = 302; // 0x12e
    field public static final int HTTP_MULT_CHOICE = 300; // 0x12c
    field public static final int HTTP_NOT_ACCEPTABLE = 406; // 0x196
    field public static final int HTTP_NOT_AUTHORITATIVE = 203; // 0xcb
    field public static final int HTTP_NOT_FOUND = 404; // 0x194
    field public static final int HTTP_NOT_IMPLEMENTED = 501; // 0x1f5
    field public static final int HTTP_NOT_MODIFIED = 304; // 0x130
    field public static final int HTTP_NO_CONTENT = 204; // 0xcc
    field public static final int HTTP_OK = 200; // 0xc8
    field public static final int HTTP_PARTIAL = 206; // 0xce
    field public static final int HTTP_PAYMENT_REQUIRED = 402; // 0x192
    field public static final int HTTP_PRECON_FAILED = 412; // 0x19c
    field public static final int HTTP_PROXY_AUTH = 407; // 0x197
    field public static final int HTTP_REQ_TOO_LONG = 414; // 0x19e
    field public static final int HTTP_RESET = 205; // 0xcd
    field public static final int HTTP_SEE_OTHER = 303; // 0x12f
    field public static final int HTTP_SERVER_ERROR = 500; // 0x1f4
    field public static final int HTTP_UNAUTHORIZED = 401; // 0x191
    field public static final int HTTP_UNAVAILABLE = 503; // 0x1f7
    field public static final int HTTP_UNSUPPORTED_TYPE = 415; // 0x19f
    field public static final int HTTP_USE_PROXY = 305; // 0x131
    field public static final int HTTP_VERSION = 505; // 0x1f9
    field protected int chunkLength;
    field protected int fixedContentLength;
    field protected boolean instanceFollowRedirects;
    field protected String method;
    field protected int responseCode;
    field protected String responseMessage;
  }

  public final class Inet4Address extends java.net.InetAddress {
  }

  public final class Inet6Address extends java.net.InetAddress {
    method public static java.net.Inet6Address getByAddress(String, byte[], int) throws java.net.UnknownHostException;
    method public static java.net.Inet6Address getByAddress(String, byte[], java.net.NetworkInterface) throws java.net.UnknownHostException;
    method public int getScopeId();
    method public java.net.NetworkInterface getScopedInterface();
    method public boolean isIPv4CompatibleAddress();
  }

  public class InetAddress implements java.io.Serializable {
    method public byte[] getAddress();
    method public static java.net.InetAddress[] getAllByName(String) throws java.net.UnknownHostException;
    method public static java.net.InetAddress getByAddress(byte[]) throws java.net.UnknownHostException;
    method public static java.net.InetAddress getByAddress(String, byte[]) throws java.net.UnknownHostException;
    method public static java.net.InetAddress getByName(String) throws java.net.UnknownHostException;
    method public String getCanonicalHostName();
    method public String getHostAddress();
    method public String getHostName();
    method public static java.net.InetAddress getLocalHost() throws java.net.UnknownHostException;
    method public boolean isAnyLocalAddress();
    method public boolean isLinkLocalAddress();
    method public boolean isLoopbackAddress();
    method public boolean isMCGlobal();
    method public boolean isMCLinkLocal();
    method public boolean isMCNodeLocal();
    method public boolean isMCOrgLocal();
    method public boolean isMCSiteLocal();
    method public boolean isMulticastAddress();
    method public boolean isReachable(int) throws java.io.IOException;
    method public boolean isReachable(java.net.NetworkInterface, int, int) throws java.io.IOException;
    method public boolean isSiteLocalAddress();
  }

  public class InetSocketAddress extends java.net.SocketAddress {
    ctor public InetSocketAddress(int);
    ctor public InetSocketAddress(java.net.InetAddress, int);
    ctor public InetSocketAddress(String, int);
    method public static java.net.InetSocketAddress createUnresolved(String, int);
    method public final boolean equals(Object);
    method public final java.net.InetAddress getAddress();
    method public final String getHostName();
    method public final int getPort();
    method public final int hashCode();
    method public final boolean isUnresolved();
  }

  public abstract class JarURLConnection extends java.net.URLConnection {
    ctor protected JarURLConnection(java.net.URL) throws java.net.MalformedURLException;
    method public java.util.jar.Attributes getAttributes() throws java.io.IOException;
    method public java.security.cert.Certificate[] getCertificates() throws java.io.IOException;
    method public String getEntryName();
    method public java.util.jar.JarEntry getJarEntry() throws java.io.IOException;
    method public abstract java.util.jar.JarFile getJarFile() throws java.io.IOException;
    method public java.net.URL getJarFileURL();
    method public java.util.jar.Attributes getMainAttributes() throws java.io.IOException;
    method public java.util.jar.Manifest getManifest() throws java.io.IOException;
    field protected java.net.URLConnection jarFileURLConnection;
  }

  public class MalformedURLException extends java.io.IOException {
    ctor public MalformedURLException();
    ctor public MalformedURLException(String);
  }

  public class MulticastSocket extends java.net.DatagramSocket {
    ctor public MulticastSocket() throws java.io.IOException;
    ctor public MulticastSocket(int) throws java.io.IOException;
    ctor public MulticastSocket(java.net.SocketAddress) throws java.io.IOException;
    method public java.net.InetAddress getInterface() throws java.net.SocketException;
    method public boolean getLoopbackMode() throws java.net.SocketException;
    method public java.net.NetworkInterface getNetworkInterface() throws java.net.SocketException;
    method public byte getTTL() throws java.io.IOException;
    method public int getTimeToLive() throws java.io.IOException;
    method public void joinGroup(java.net.InetAddress) throws java.io.IOException;
    method public void joinGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
    method public void leaveGroup(java.net.InetAddress) throws java.io.IOException;
    method public void leaveGroup(java.net.SocketAddress, java.net.NetworkInterface) throws java.io.IOException;
    method public void send(java.net.DatagramPacket, byte) throws java.io.IOException;
    method public void setInterface(java.net.InetAddress) throws java.net.SocketException;
    method public void setLoopbackMode(boolean) throws java.net.SocketException;
    method public void setNetworkInterface(java.net.NetworkInterface) throws java.net.SocketException;
    method public void setTTL(byte) throws java.io.IOException;
    method public void setTimeToLive(int) throws java.io.IOException;
  }

  public final class NetPermission extends java.security.BasicPermission {
    ctor public NetPermission(String);
    ctor public NetPermission(String, String);
  }

  public final class NetworkInterface {
    method public static java.net.NetworkInterface getByInetAddress(java.net.InetAddress) throws java.net.SocketException;
    method public static java.net.NetworkInterface getByName(String) throws java.net.SocketException;
    method public String getDisplayName();
    method public java.util.Enumeration<java.net.InetAddress> getInetAddresses();
    method public String getName();
    method public static java.util.Enumeration<java.net.NetworkInterface> getNetworkInterfaces() throws java.net.SocketException;
  }

  public class NoRouteToHostException extends java.net.SocketException {
    ctor public NoRouteToHostException();
    ctor public NoRouteToHostException(String);
  }

  public final class PasswordAuthentication {
    ctor public PasswordAuthentication(String, char[]);
    method public char[] getPassword();
    method public String getUserName();
  }

  public class PortUnreachableException extends java.net.SocketException {
    ctor public PortUnreachableException();
    ctor public PortUnreachableException(String);
  }

  public class ProtocolException extends java.io.IOException {
    ctor public ProtocolException();
    ctor public ProtocolException(String);
  }

  public class Proxy {
    ctor public Proxy(java.net.Proxy.Type, java.net.SocketAddress);
    method public java.net.SocketAddress address();
    method public final boolean equals(Object);
    method public final int hashCode();
    method public java.net.Proxy.Type type();
    field public static final java.net.Proxy NO_PROXY;
  }

  public enum Proxy.Type {
    enum_constant public static final java.net.Proxy.Type DIRECT;
    enum_constant public static final java.net.Proxy.Type HTTP;
    enum_constant public static final java.net.Proxy.Type SOCKS;
  }

  public abstract class ProxySelector {
    ctor public ProxySelector();
    method public abstract void connectFailed(java.net.URI, java.net.SocketAddress, java.io.IOException);
    method public static java.net.ProxySelector getDefault();
    method public abstract java.util.List<java.net.Proxy> select(java.net.URI);
    method public static void setDefault(java.net.ProxySelector);
  }

  public abstract class ResponseCache {
    ctor public ResponseCache();
    method public abstract java.net.CacheResponse get(java.net.URI, String, java.util.Map<java.lang.String,java.util.List<java.lang.String>>) throws java.io.IOException;
    method public static java.net.ResponseCache getDefault();
    method public abstract java.net.CacheRequest put(java.net.URI, java.net.URLConnection) throws java.io.IOException;
    method public static void setDefault(java.net.ResponseCache);
  }

  public abstract class SecureCacheResponse extends java.net.CacheResponse {
    ctor public SecureCacheResponse();
    method public abstract String getCipherSuite();
    method public abstract java.util.List<java.security.cert.Certificate> getLocalCertificateChain();
    method public abstract java.security.Principal getLocalPrincipal();
    method public abstract java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public abstract java.util.List<java.security.cert.Certificate> getServerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
  }

  public class ServerSocket {
    ctor public ServerSocket() throws java.io.IOException;
    ctor public ServerSocket(int) throws java.io.IOException;
    ctor public ServerSocket(int, int) throws java.io.IOException;
    ctor public ServerSocket(int, int, java.net.InetAddress) throws java.io.IOException;
    method public java.net.Socket accept() throws java.io.IOException;
    method public void bind(java.net.SocketAddress) throws java.io.IOException;
    method public void bind(java.net.SocketAddress, int) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public java.nio.channels.ServerSocketChannel getChannel();
    method public java.net.InetAddress getInetAddress();
    method public int getLocalPort();
    method public java.net.SocketAddress getLocalSocketAddress();
    method public int getReceiveBufferSize() throws java.net.SocketException;
    method public boolean getReuseAddress() throws java.net.SocketException;
    method public int getSoTimeout() throws java.io.IOException;
    method protected final void implAccept(java.net.Socket) throws java.io.IOException;
    method public boolean isBound();
    method public boolean isClosed();
    method public void setPerformancePreferences(int, int, int);
    method public void setReceiveBufferSize(int) throws java.net.SocketException;
    method public void setReuseAddress(boolean) throws java.net.SocketException;
    method public void setSoTimeout(int) throws java.net.SocketException;
    method public static void setSocketFactory(java.net.SocketImplFactory) throws java.io.IOException;
  }

  public class Socket {
    ctor public Socket();
    ctor public Socket(java.net.Proxy);
    ctor public Socket(String, int) throws java.io.IOException, java.net.UnknownHostException;
    ctor public Socket(String, int, java.net.InetAddress, int) throws java.io.IOException;
    ctor public Socket(String, int, boolean) throws java.io.IOException;
    ctor public Socket(java.net.InetAddress, int) throws java.io.IOException;
    ctor public Socket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
    ctor public Socket(java.net.InetAddress, int, boolean) throws java.io.IOException;
    ctor protected Socket(java.net.SocketImpl) throws java.net.SocketException;
    method public void bind(java.net.SocketAddress) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public void connect(java.net.SocketAddress) throws java.io.IOException;
    method public void connect(java.net.SocketAddress, int) throws java.io.IOException;
    method public java.nio.channels.SocketChannel getChannel();
    method public java.net.InetAddress getInetAddress();
    method public java.io.InputStream getInputStream() throws java.io.IOException;
    method public boolean getKeepAlive() throws java.net.SocketException;
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method public java.net.SocketAddress getLocalSocketAddress();
    method public boolean getOOBInline() throws java.net.SocketException;
    method public java.io.OutputStream getOutputStream() throws java.io.IOException;
    method public int getPort();
    method public int getReceiveBufferSize() throws java.net.SocketException;
    method public java.net.SocketAddress getRemoteSocketAddress();
    method public boolean getReuseAddress() throws java.net.SocketException;
    method public int getSendBufferSize() throws java.net.SocketException;
    method public int getSoLinger() throws java.net.SocketException;
    method public int getSoTimeout() throws java.net.SocketException;
    method public boolean getTcpNoDelay() throws java.net.SocketException;
    method public int getTrafficClass() throws java.net.SocketException;
    method public boolean isBound();
    method public boolean isClosed();
    method public boolean isConnected();
    method public boolean isInputShutdown();
    method public boolean isOutputShutdown();
    method public void sendUrgentData(int) throws java.io.IOException;
    method public void setKeepAlive(boolean) throws java.net.SocketException;
    method public void setOOBInline(boolean) throws java.net.SocketException;
    method public void setPerformancePreferences(int, int, int);
    method public void setReceiveBufferSize(int) throws java.net.SocketException;
    method public void setReuseAddress(boolean) throws java.net.SocketException;
    method public void setSendBufferSize(int) throws java.net.SocketException;
    method public void setSoLinger(boolean, int) throws java.net.SocketException;
    method public void setSoTimeout(int) throws java.net.SocketException;
    method public static void setSocketImplFactory(java.net.SocketImplFactory) throws java.io.IOException;
    method public void setTcpNoDelay(boolean) throws java.net.SocketException;
    method public void setTrafficClass(int) throws java.net.SocketException;
    method public void shutdownInput() throws java.io.IOException;
    method public void shutdownOutput() throws java.io.IOException;
  }

  public abstract class SocketAddress implements java.io.Serializable {
    ctor public SocketAddress();
  }

  public class SocketException extends java.io.IOException {
    ctor public SocketException();
    ctor public SocketException(String);
  }

  public abstract class SocketImpl implements java.net.SocketOptions {
    ctor public SocketImpl();
    method protected abstract void accept(java.net.SocketImpl) throws java.io.IOException;
    method protected abstract int available() throws java.io.IOException;
    method protected abstract void bind(java.net.InetAddress, int) throws java.io.IOException;
    method protected abstract void close() throws java.io.IOException;
    method protected abstract void connect(String, int) throws java.io.IOException;
    method protected abstract void connect(java.net.InetAddress, int) throws java.io.IOException;
    method protected abstract void connect(java.net.SocketAddress, int) throws java.io.IOException;
    method protected abstract void create(boolean) throws java.io.IOException;
    method protected java.io.FileDescriptor getFileDescriptor();
    method protected java.net.InetAddress getInetAddress();
    method protected abstract java.io.InputStream getInputStream() throws java.io.IOException;
    method protected int getLocalPort();
    method protected abstract java.io.OutputStream getOutputStream() throws java.io.IOException;
    method protected int getPort();
    method protected abstract void listen(int) throws java.io.IOException;
    method protected abstract void sendUrgentData(int) throws java.io.IOException;
    method protected void setPerformancePreferences(int, int, int);
    method protected void shutdownInput() throws java.io.IOException;
    method protected void shutdownOutput() throws java.io.IOException;
    method protected boolean supportsUrgentData();
    field protected java.net.InetAddress address;
    field protected java.io.FileDescriptor fd;
    field protected int localport;
    field protected int port;
  }

  public interface SocketImplFactory {
    method public java.net.SocketImpl createSocketImpl();
  }

  public interface SocketOptions {
    method public Object getOption(int) throws java.net.SocketException;
    method public void setOption(int, Object) throws java.net.SocketException;
    field public static final int IP_MULTICAST_IF = 16; // 0x10
    field public static final int IP_MULTICAST_IF2 = 31; // 0x1f
    field public static final int IP_MULTICAST_LOOP = 18; // 0x12
    field public static final int IP_TOS = 3; // 0x3
    field public static final int SO_BINDADDR = 15; // 0xf
    field public static final int SO_BROADCAST = 32; // 0x20
    field public static final int SO_KEEPALIVE = 8; // 0x8
    field public static final int SO_LINGER = 128; // 0x80
    field public static final int SO_OOBINLINE = 4099; // 0x1003
    field public static final int SO_RCVBUF = 4098; // 0x1002
    field public static final int SO_REUSEADDR = 4; // 0x4
    field public static final int SO_SNDBUF = 4097; // 0x1001
    field public static final int SO_TIMEOUT = 4102; // 0x1006
    field public static final int TCP_NODELAY = 1; // 0x1
  }

  public final class SocketPermission extends java.security.Permission implements java.io.Serializable {
    ctor public SocketPermission(String, String);
    method public String getActions();
    method public boolean implies(java.security.Permission);
  }

  public class SocketTimeoutException extends java.io.InterruptedIOException {
    ctor public SocketTimeoutException();
    ctor public SocketTimeoutException(String);
  }

  public final class URI implements java.lang.Comparable<java.net.URI> java.io.Serializable {
    ctor public URI(String) throws java.net.URISyntaxException;
    ctor public URI(String, String, String) throws java.net.URISyntaxException;
    ctor public URI(String, String, String, int, String, String, String) throws java.net.URISyntaxException;
    ctor public URI(String, String, String, String) throws java.net.URISyntaxException;
    ctor public URI(String, String, String, String, String) throws java.net.URISyntaxException;
    method public int compareTo(java.net.URI);
    method public static java.net.URI create(String);
    method public String getAuthority();
    method public String getFragment();
    method public String getHost();
    method public String getPath();
    method public int getPort();
    method public String getQuery();
    method public String getRawAuthority();
    method public String getRawFragment();
    method public String getRawPath();
    method public String getRawQuery();
    method public String getRawSchemeSpecificPart();
    method public String getRawUserInfo();
    method public String getScheme();
    method public String getSchemeSpecificPart();
    method public String getUserInfo();
    method public boolean isAbsolute();
    method public boolean isOpaque();
    method public java.net.URI normalize();
    method public java.net.URI parseServerAuthority() throws java.net.URISyntaxException;
    method public java.net.URI relativize(java.net.URI);
    method public java.net.URI resolve(java.net.URI);
    method public java.net.URI resolve(String);
    method public String toASCIIString();
    method public java.net.URL toURL() throws java.net.MalformedURLException;
  }

  public class URISyntaxException extends java.lang.Exception {
    ctor public URISyntaxException(String, String, int);
    ctor public URISyntaxException(String, String);
    method public int getIndex();
    method public String getInput();
    method public String getReason();
  }

  public final class URL implements java.io.Serializable {
    ctor public URL(String) throws java.net.MalformedURLException;
    ctor public URL(java.net.URL, String) throws java.net.MalformedURLException;
    ctor public URL(java.net.URL, String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
    ctor public URL(String, String, String) throws java.net.MalformedURLException;
    ctor public URL(String, String, int, String) throws java.net.MalformedURLException;
    ctor public URL(String, String, int, String, java.net.URLStreamHandler) throws java.net.MalformedURLException;
    method public String getAuthority();
    method public Object getContent() throws java.io.IOException;
    method public Object getContent(Class[]) throws java.io.IOException;
    method public int getDefaultPort();
    method public String getFile();
    method public String getHost();
    method public String getPath();
    method public int getPort();
    method public String getProtocol();
    method public String getQuery();
    method public String getRef();
    method public String getUserInfo();
    method public java.net.URLConnection openConnection() throws java.io.IOException;
    method public java.net.URLConnection openConnection(java.net.Proxy) throws java.io.IOException;
    method public java.io.InputStream openStream() throws java.io.IOException;
    method public boolean sameFile(java.net.URL);
    method protected void set(String, String, int, String, String);
    method protected void set(String, String, int, String, String, String, String, String);
    method public static void setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory);
    method public String toExternalForm();
    method public java.net.URI toURI() throws java.net.URISyntaxException;
  }

  public class URLClassLoader extends java.security.SecureClassLoader {
    ctor public URLClassLoader(java.net.URL[]);
    ctor public URLClassLoader(java.net.URL[], ClassLoader);
    ctor public URLClassLoader(java.net.URL[], ClassLoader, java.net.URLStreamHandlerFactory);
    method protected void addURL(java.net.URL);
    method protected Package definePackage(String, java.util.jar.Manifest, java.net.URL) throws java.lang.IllegalArgumentException;
    method public java.net.URL findResource(String);
    method public java.util.Enumeration<java.net.URL> findResources(String) throws java.io.IOException;
    method public java.net.URL[] getURLs();
    method public static java.net.URLClassLoader newInstance(java.net.URL[]);
    method public static java.net.URLClassLoader newInstance(java.net.URL[], ClassLoader);
  }

  public abstract class URLConnection {
    ctor protected URLConnection(java.net.URL);
    method public void addRequestProperty(String, String);
    method public abstract void connect() throws java.io.IOException;
    method public boolean getAllowUserInteraction();
    method public int getConnectTimeout();
    method public Object getContent() throws java.io.IOException;
    method public Object getContent(Class[]) throws java.io.IOException;
    method public String getContentEncoding();
    method public int getContentLength();
    method public String getContentType();
    method public long getDate();
    method public static boolean getDefaultAllowUserInteraction();
    method public static String getDefaultRequestProperty(String);
    method public boolean getDefaultUseCaches();
    method public boolean getDoInput();
    method public boolean getDoOutput();
    method public long getExpiration();
    method public static java.net.FileNameMap getFileNameMap();
    method public String getHeaderField(int);
    method public String getHeaderField(String);
    method public long getHeaderFieldDate(String, long);
    method public int getHeaderFieldInt(String, int);
    method public String getHeaderFieldKey(int);
    method public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getHeaderFields();
    method public long getIfModifiedSince();
    method public java.io.InputStream getInputStream() throws java.io.IOException;
    method public long getLastModified();
    method public java.io.OutputStream getOutputStream() throws java.io.IOException;
    method public java.security.Permission getPermission() throws java.io.IOException;
    method public int getReadTimeout();
    method public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getRequestProperties();
    method public String getRequestProperty(String);
    method public java.net.URL getURL();
    method public boolean getUseCaches();
    method public static String guessContentTypeFromName(String);
    method public static String guessContentTypeFromStream(java.io.InputStream) throws java.io.IOException;
    method public void setAllowUserInteraction(boolean);
    method public void setConnectTimeout(int);
    method public static void setContentHandlerFactory(java.net.ContentHandlerFactory);
    method public static void setDefaultAllowUserInteraction(boolean);
    method public static void setDefaultRequestProperty(String, String);
    method public void setDefaultUseCaches(boolean);
    method public void setDoInput(boolean);
    method public void setDoOutput(boolean);
    method public static void setFileNameMap(java.net.FileNameMap);
    method public void setIfModifiedSince(long);
    method public void setReadTimeout(int);
    method public void setRequestProperty(String, String);
    method public void setUseCaches(boolean);
    field protected boolean allowUserInteraction;
    field protected boolean connected;
    field protected boolean doInput;
    field protected boolean doOutput;
    field protected long ifModifiedSince;
    field protected java.net.URL url;
    field protected boolean useCaches;
  }

  public class URLDecoder {
    ctor public URLDecoder();
    method public static String decode(String);
    method public static String decode(String, String) throws java.io.UnsupportedEncodingException;
  }

  public class URLEncoder {
    method public static String encode(String);
    method public static String encode(String, String) throws java.io.UnsupportedEncodingException;
  }

  public abstract class URLStreamHandler {
    ctor public URLStreamHandler();
    method protected boolean equals(java.net.URL, java.net.URL);
    method protected int getDefaultPort();
    method protected java.net.InetAddress getHostAddress(java.net.URL);
    method protected int hashCode(java.net.URL);
    method protected boolean hostsEqual(java.net.URL, java.net.URL);
    method protected abstract java.net.URLConnection openConnection(java.net.URL) throws java.io.IOException;
    method protected java.net.URLConnection openConnection(java.net.URL, java.net.Proxy) throws java.io.IOException;
    method protected void parseURL(java.net.URL, String, int, int);
    method protected boolean sameFile(java.net.URL, java.net.URL);
    method protected void setURL(java.net.URL, String, String, int, String, String);
    method protected void setURL(java.net.URL, String, String, int, String, String, String, String, String);
    method protected String toExternalForm(java.net.URL);
  }

  public interface URLStreamHandlerFactory {
    method public java.net.URLStreamHandler createURLStreamHandler(String);
  }

  public class UnknownHostException extends java.io.IOException {
    ctor public UnknownHostException();
    ctor public UnknownHostException(String);
  }

  public class UnknownServiceException extends java.io.IOException {
    ctor public UnknownServiceException();
    ctor public UnknownServiceException(String);
  }

}

package java.nio {

  public abstract class Buffer {
    method public final int capacity();
    method public final java.nio.Buffer clear();
    method public final java.nio.Buffer flip();
    method public final boolean hasRemaining();
    method public abstract boolean isReadOnly();
    method public final int limit();
    method public final java.nio.Buffer limit(int);
    method public final java.nio.Buffer mark();
    method public final int position();
    method public final java.nio.Buffer position(int);
    method public final int remaining();
    method public final java.nio.Buffer reset();
    method public final java.nio.Buffer rewind();
  }

  public class BufferOverflowException extends java.lang.RuntimeException {
    ctor public BufferOverflowException();
  }

  public class BufferUnderflowException extends java.lang.RuntimeException {
    ctor public BufferUnderflowException();
  }

  public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ByteBuffer> {
    method public static java.nio.ByteBuffer allocate(int);
    method public static java.nio.ByteBuffer allocateDirect(int);
    method public final byte[] array();
    method public final int arrayOffset();
    method public abstract java.nio.CharBuffer asCharBuffer();
    method public abstract java.nio.DoubleBuffer asDoubleBuffer();
    method public abstract java.nio.FloatBuffer asFloatBuffer();
    method public abstract java.nio.IntBuffer asIntBuffer();
    method public abstract java.nio.LongBuffer asLongBuffer();
    method public abstract java.nio.ByteBuffer asReadOnlyBuffer();
    method public abstract java.nio.ShortBuffer asShortBuffer();
    method public abstract java.nio.ByteBuffer compact();
    method public int compareTo(java.nio.ByteBuffer);
    method public abstract java.nio.ByteBuffer duplicate();
    method public abstract byte get();
    method public java.nio.ByteBuffer get(byte[]);
    method public java.nio.ByteBuffer get(byte[], int, int);
    method public abstract byte get(int);
    method public abstract char getChar();
    method public abstract char getChar(int);
    method public abstract double getDouble();
    method public abstract double getDouble(int);
    method public abstract float getFloat();
    method public abstract float getFloat(int);
    method public abstract int getInt();
    method public abstract int getInt(int);
    method public abstract long getLong();
    method public abstract long getLong(int);
    method public abstract short getShort();
    method public abstract short getShort(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public final java.nio.ByteOrder order();
    method public final java.nio.ByteBuffer order(java.nio.ByteOrder);
    method public abstract java.nio.ByteBuffer put(byte);
    method public final java.nio.ByteBuffer put(byte[]);
    method public java.nio.ByteBuffer put(byte[], int, int);
    method public java.nio.ByteBuffer put(java.nio.ByteBuffer);
    method public abstract java.nio.ByteBuffer put(int, byte);
    method public abstract java.nio.ByteBuffer putChar(char);
    method public abstract java.nio.ByteBuffer putChar(int, char);
    method public abstract java.nio.ByteBuffer putDouble(double);
    method public abstract java.nio.ByteBuffer putDouble(int, double);
    method public abstract java.nio.ByteBuffer putFloat(float);
    method public abstract java.nio.ByteBuffer putFloat(int, float);
    method public abstract java.nio.ByteBuffer putInt(int);
    method public abstract java.nio.ByteBuffer putInt(int, int);
    method public abstract java.nio.ByteBuffer putLong(long);
    method public abstract java.nio.ByteBuffer putLong(int, long);
    method public abstract java.nio.ByteBuffer putShort(short);
    method public abstract java.nio.ByteBuffer putShort(int, short);
    method public abstract java.nio.ByteBuffer slice();
    method public static java.nio.ByteBuffer wrap(byte[]);
    method public static java.nio.ByteBuffer wrap(byte[], int, int);
  }

  public final class ByteOrder {
    method public static java.nio.ByteOrder nativeOrder();
    field public static final java.nio.ByteOrder BIG_ENDIAN;
    field public static final java.nio.ByteOrder LITTLE_ENDIAN;
  }

  public abstract class CharBuffer extends java.nio.Buffer implements java.lang.Appendable java.lang.CharSequence java.lang.Comparable<java.nio.CharBuffer> java.lang.Readable {
    method public static java.nio.CharBuffer allocate(int);
    method public java.nio.CharBuffer append(char);
    method public java.nio.CharBuffer append(CharSequence);
    method public java.nio.CharBuffer append(CharSequence, int, int);
    method public final char[] array();
    method public final int arrayOffset();
    method public abstract java.nio.CharBuffer asReadOnlyBuffer();
    method public final char charAt(int);
    method public abstract java.nio.CharBuffer compact();
    method public int compareTo(java.nio.CharBuffer);
    method public abstract java.nio.CharBuffer duplicate();
    method public abstract char get();
    method public java.nio.CharBuffer get(char[]);
    method public java.nio.CharBuffer get(char[], int, int);
    method public abstract char get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public final int length();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.CharBuffer put(char);
    method public final java.nio.CharBuffer put(char[]);
    method public java.nio.CharBuffer put(char[], int, int);
    method public java.nio.CharBuffer put(java.nio.CharBuffer);
    method public abstract java.nio.CharBuffer put(int, char);
    method public final java.nio.CharBuffer put(String);
    method public java.nio.CharBuffer put(String, int, int);
    method public int read(java.nio.CharBuffer) throws java.io.IOException;
    method public abstract java.nio.CharBuffer slice();
    method public static java.nio.CharBuffer wrap(char[]);
    method public static java.nio.CharBuffer wrap(char[], int, int);
    method public static java.nio.CharBuffer wrap(CharSequence);
    method public static java.nio.CharBuffer wrap(CharSequence, int, int);
  }

  public abstract class DoubleBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.DoubleBuffer> {
    method public static java.nio.DoubleBuffer allocate(int);
    method public final double[] array();
    method public final int arrayOffset();
    method public abstract java.nio.DoubleBuffer asReadOnlyBuffer();
    method public abstract java.nio.DoubleBuffer compact();
    method public int compareTo(java.nio.DoubleBuffer);
    method public abstract java.nio.DoubleBuffer duplicate();
    method public abstract double get();
    method public java.nio.DoubleBuffer get(double[]);
    method public java.nio.DoubleBuffer get(double[], int, int);
    method public abstract double get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.DoubleBuffer put(double);
    method public final java.nio.DoubleBuffer put(double[]);
    method public java.nio.DoubleBuffer put(double[], int, int);
    method public java.nio.DoubleBuffer put(java.nio.DoubleBuffer);
    method public abstract java.nio.DoubleBuffer put(int, double);
    method public abstract java.nio.DoubleBuffer slice();
    method public static java.nio.DoubleBuffer wrap(double[]);
    method public static java.nio.DoubleBuffer wrap(double[], int, int);
  }

  public abstract class FloatBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.FloatBuffer> {
    method public static java.nio.FloatBuffer allocate(int);
    method public final float[] array();
    method public final int arrayOffset();
    method public abstract java.nio.FloatBuffer asReadOnlyBuffer();
    method public abstract java.nio.FloatBuffer compact();
    method public int compareTo(java.nio.FloatBuffer);
    method public abstract java.nio.FloatBuffer duplicate();
    method public abstract float get();
    method public java.nio.FloatBuffer get(float[]);
    method public java.nio.FloatBuffer get(float[], int, int);
    method public abstract float get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.FloatBuffer put(float);
    method public final java.nio.FloatBuffer put(float[]);
    method public java.nio.FloatBuffer put(float[], int, int);
    method public java.nio.FloatBuffer put(java.nio.FloatBuffer);
    method public abstract java.nio.FloatBuffer put(int, float);
    method public abstract java.nio.FloatBuffer slice();
    method public static java.nio.FloatBuffer wrap(float[]);
    method public static java.nio.FloatBuffer wrap(float[], int, int);
  }

  public abstract class IntBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.IntBuffer> {
    method public static java.nio.IntBuffer allocate(int);
    method public final int[] array();
    method public final int arrayOffset();
    method public abstract java.nio.IntBuffer asReadOnlyBuffer();
    method public abstract java.nio.IntBuffer compact();
    method public int compareTo(java.nio.IntBuffer);
    method public abstract java.nio.IntBuffer duplicate();
    method public abstract int get();
    method public java.nio.IntBuffer get(int[]);
    method public java.nio.IntBuffer get(int[], int, int);
    method public abstract int get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.IntBuffer put(int);
    method public final java.nio.IntBuffer put(int[]);
    method public java.nio.IntBuffer put(int[], int, int);
    method public java.nio.IntBuffer put(java.nio.IntBuffer);
    method public abstract java.nio.IntBuffer put(int, int);
    method public abstract java.nio.IntBuffer slice();
    method public static java.nio.IntBuffer wrap(int[]);
    method public static java.nio.IntBuffer wrap(int[], int, int);
  }

  public class InvalidMarkException extends java.lang.IllegalStateException {
    ctor public InvalidMarkException();
  }

  public abstract class LongBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.LongBuffer> {
    method public static java.nio.LongBuffer allocate(int);
    method public final long[] array();
    method public final int arrayOffset();
    method public abstract java.nio.LongBuffer asReadOnlyBuffer();
    method public abstract java.nio.LongBuffer compact();
    method public int compareTo(java.nio.LongBuffer);
    method public abstract java.nio.LongBuffer duplicate();
    method public abstract long get();
    method public java.nio.LongBuffer get(long[]);
    method public java.nio.LongBuffer get(long[], int, int);
    method public abstract long get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.LongBuffer put(long);
    method public final java.nio.LongBuffer put(long[]);
    method public java.nio.LongBuffer put(long[], int, int);
    method public java.nio.LongBuffer put(java.nio.LongBuffer);
    method public abstract java.nio.LongBuffer put(int, long);
    method public abstract java.nio.LongBuffer slice();
    method public static java.nio.LongBuffer wrap(long[]);
    method public static java.nio.LongBuffer wrap(long[], int, int);
  }

  public abstract class MappedByteBuffer extends java.nio.ByteBuffer {
    method public final java.nio.MappedByteBuffer force();
    method public final boolean isLoaded();
    method public final java.nio.MappedByteBuffer load();
  }

  public class ReadOnlyBufferException extends java.lang.UnsupportedOperationException {
    ctor public ReadOnlyBufferException();
  }

  public abstract class ShortBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ShortBuffer> {
    method public static java.nio.ShortBuffer allocate(int);
    method public final short[] array();
    method public final int arrayOffset();
    method public abstract java.nio.ShortBuffer asReadOnlyBuffer();
    method public abstract java.nio.ShortBuffer compact();
    method public int compareTo(java.nio.ShortBuffer);
    method public abstract java.nio.ShortBuffer duplicate();
    method public abstract short get();
    method public java.nio.ShortBuffer get(short[]);
    method public java.nio.ShortBuffer get(short[], int, int);
    method public abstract short get(int);
    method public final boolean hasArray();
    method public abstract boolean isDirect();
    method public abstract java.nio.ByteOrder order();
    method public abstract java.nio.ShortBuffer put(short);
    method public final java.nio.ShortBuffer put(short[]);
    method public java.nio.ShortBuffer put(short[], int, int);
    method public java.nio.ShortBuffer put(java.nio.ShortBuffer);
    method public abstract java.nio.ShortBuffer put(int, short);
    method public abstract java.nio.ShortBuffer slice();
    method public static java.nio.ShortBuffer wrap(short[]);
    method public static java.nio.ShortBuffer wrap(short[], int, int);
  }

}

package java.nio.channels {

  public class AlreadyConnectedException extends java.lang.IllegalStateException {
    ctor public AlreadyConnectedException();
  }

  public class AsynchronousCloseException extends java.nio.channels.ClosedChannelException {
    ctor public AsynchronousCloseException();
  }

  public interface ByteChannel extends java.nio.channels.ReadableByteChannel java.nio.channels.WritableByteChannel {
  }

  public class CancelledKeyException extends java.lang.IllegalStateException {
    ctor public CancelledKeyException();
  }

  public interface Channel extends java.io.Closeable {
    method public boolean isOpen();
  }

  public final class Channels {
    method public static java.nio.channels.ReadableByteChannel newChannel(java.io.InputStream);
    method public static java.nio.channels.WritableByteChannel newChannel(java.io.OutputStream);
    method public static java.io.InputStream newInputStream(java.nio.channels.ReadableByteChannel);
    method public static java.io.OutputStream newOutputStream(java.nio.channels.WritableByteChannel);
    method public static java.io.Reader newReader(java.nio.channels.ReadableByteChannel, java.nio.charset.CharsetDecoder, int);
    method public static java.io.Reader newReader(java.nio.channels.ReadableByteChannel, String);
    method public static java.io.Writer newWriter(java.nio.channels.WritableByteChannel, java.nio.charset.CharsetEncoder, int);
    method public static java.io.Writer newWriter(java.nio.channels.WritableByteChannel, String);
  }

  public class ClosedByInterruptException extends java.nio.channels.AsynchronousCloseException {
    ctor public ClosedByInterruptException();
  }

  public class ClosedChannelException extends java.io.IOException {
    ctor public ClosedChannelException();
  }

  public class ClosedSelectorException extends java.lang.IllegalStateException {
    ctor public ClosedSelectorException();
  }

  public class ConnectionPendingException extends java.lang.IllegalStateException {
    ctor public ConnectionPendingException();
  }

  public abstract class DatagramChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.ScatteringByteChannel {
    ctor protected DatagramChannel(java.nio.channels.spi.SelectorProvider);
    method public abstract java.nio.channels.DatagramChannel connect(java.net.SocketAddress) throws java.io.IOException;
    method public abstract java.nio.channels.DatagramChannel disconnect() throws java.io.IOException;
    method public abstract boolean isConnected();
    method public static java.nio.channels.DatagramChannel open() throws java.io.IOException;
    method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
    method public abstract java.net.SocketAddress receive(java.nio.ByteBuffer) throws java.io.IOException;
    method public abstract int send(java.nio.ByteBuffer, java.net.SocketAddress) throws java.io.IOException;
    method public abstract java.net.DatagramSocket socket();
    method public final int validOps();
    method public final long write(java.nio.ByteBuffer[]) throws java.io.IOException;
  }

  public abstract class FileChannel extends java.nio.channels.spi.AbstractInterruptibleChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.ScatteringByteChannel {
    ctor protected FileChannel();
    method public abstract void force(boolean) throws java.io.IOException;
    method public final java.nio.channels.FileLock lock() throws java.io.IOException;
    method public abstract java.nio.channels.FileLock lock(long, long, boolean) throws java.io.IOException;
    method public abstract java.nio.MappedByteBuffer map(java.nio.channels.FileChannel.MapMode, long, long) throws java.io.IOException;
    method public abstract long position() throws java.io.IOException;
    method public abstract java.nio.channels.FileChannel position(long) throws java.io.IOException;
    method public abstract int read(java.nio.ByteBuffer, long) throws java.io.IOException;
    method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
    method public abstract long size() throws java.io.IOException;
    method public abstract long transferFrom(java.nio.channels.ReadableByteChannel, long, long) throws java.io.IOException;
    method public abstract long transferTo(long, long, java.nio.channels.WritableByteChannel) throws java.io.IOException;
    method public abstract java.nio.channels.FileChannel truncate(long) throws java.io.IOException;
    method public final java.nio.channels.FileLock tryLock() throws java.io.IOException;
    method public abstract java.nio.channels.FileLock tryLock(long, long, boolean) throws java.io.IOException;
    method public abstract int write(java.nio.ByteBuffer, long) throws java.io.IOException;
    method public final long write(java.nio.ByteBuffer[]) throws java.io.IOException;
  }

  public static class FileChannel.MapMode {
    field public static final java.nio.channels.FileChannel.MapMode PRIVATE;
    field public static final java.nio.channels.FileChannel.MapMode READ_ONLY;
    field public static final java.nio.channels.FileChannel.MapMode READ_WRITE;
  }

  public abstract class FileLock {
    ctor protected FileLock(java.nio.channels.FileChannel, long, long, boolean);
    method public final java.nio.channels.FileChannel channel();
    method public final boolean isShared();
    method public abstract boolean isValid();
    method public final boolean overlaps(long, long);
    method public final long position();
    method public abstract void release() throws java.io.IOException;
    method public final long size();
    method public final String toString();
  }

  public class FileLockInterruptionException extends java.io.IOException {
    ctor public FileLockInterruptionException();
  }

  public interface GatheringByteChannel extends java.nio.channels.WritableByteChannel {
    method public long write(java.nio.ByteBuffer[]) throws java.io.IOException;
    method public long write(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
  }

  public class IllegalBlockingModeException extends java.lang.IllegalStateException {
    ctor public IllegalBlockingModeException();
  }

  public class IllegalSelectorException extends java.lang.IllegalArgumentException {
    ctor public IllegalSelectorException();
  }

  public interface InterruptibleChannel extends java.nio.channels.Channel {
  }

  public class NoConnectionPendingException extends java.lang.IllegalStateException {
    ctor public NoConnectionPendingException();
  }

  public class NonReadableChannelException extends java.lang.IllegalStateException {
    ctor public NonReadableChannelException();
  }

  public class NonWritableChannelException extends java.lang.IllegalStateException {
    ctor public NonWritableChannelException();
  }

  public class NotYetBoundException extends java.lang.IllegalStateException {
    ctor public NotYetBoundException();
  }

  public class NotYetConnectedException extends java.lang.IllegalStateException {
    ctor public NotYetConnectedException();
  }

  public class OverlappingFileLockException extends java.lang.IllegalStateException {
    ctor public OverlappingFileLockException();
  }

  public abstract class Pipe {
    ctor protected Pipe();
    method public static java.nio.channels.Pipe open() throws java.io.IOException;
    method public abstract java.nio.channels.Pipe.SinkChannel sink();
    method public abstract java.nio.channels.Pipe.SourceChannel source();
  }

  public abstract static class Pipe.SinkChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.GatheringByteChannel java.nio.channels.WritableByteChannel {
    ctor protected Pipe.SinkChannel(java.nio.channels.spi.SelectorProvider);
    method public final int validOps();
  }

  public abstract static class Pipe.SourceChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ReadableByteChannel java.nio.channels.ScatteringByteChannel {
    ctor protected Pipe.SourceChannel(java.nio.channels.spi.SelectorProvider);
    method public final int validOps();
  }

  public interface ReadableByteChannel extends java.nio.channels.Channel {
    method public int read(java.nio.ByteBuffer) throws java.io.IOException;
  }

  public interface ScatteringByteChannel extends java.nio.channels.ReadableByteChannel {
    method public long read(java.nio.ByteBuffer[]) throws java.io.IOException;
    method public long read(java.nio.ByteBuffer[], int, int) throws java.io.IOException;
  }

  public abstract class SelectableChannel extends java.nio.channels.spi.AbstractInterruptibleChannel implements java.nio.channels.Channel {
    ctor protected SelectableChannel();
    method public abstract Object blockingLock();
    method public abstract java.nio.channels.SelectableChannel configureBlocking(boolean) throws java.io.IOException;
    method public abstract boolean isBlocking();
    method public abstract boolean isRegistered();
    method public abstract java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    method public abstract java.nio.channels.spi.SelectorProvider provider();
    method public final java.nio.channels.SelectionKey register(java.nio.channels.Selector, int) throws java.nio.channels.ClosedChannelException;
    method public abstract java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, Object) throws java.nio.channels.ClosedChannelException;
    method public abstract int validOps();
  }

  public abstract class SelectionKey {
    ctor protected SelectionKey();
    method public final Object attach(Object);
    method public final Object attachment();
    method public abstract void cancel();
    method public abstract java.nio.channels.SelectableChannel channel();
    method public abstract int interestOps();
    method public abstract java.nio.channels.SelectionKey interestOps(int);
    method public final boolean isAcceptable();
    method public final boolean isConnectable();
    method public final boolean isReadable();
    method public abstract boolean isValid();
    method public final boolean isWritable();
    method public abstract int readyOps();
    method public abstract java.nio.channels.Selector selector();
    field public static final int OP_ACCEPT = 16; // 0x10
    field public static final int OP_CONNECT = 8; // 0x8
    field public static final int OP_READ = 1; // 0x1
    field public static final int OP_WRITE = 4; // 0x4
  }

  public abstract class Selector {
    ctor protected Selector();
    method public abstract void close() throws java.io.IOException;
    method public abstract boolean isOpen();
    method public abstract java.util.Set<java.nio.channels.SelectionKey> keys();
    method public static java.nio.channels.Selector open() throws java.io.IOException;
    method public abstract java.nio.channels.spi.SelectorProvider provider();
    method public abstract int select() throws java.io.IOException;
    method public abstract int select(long) throws java.io.IOException;
    method public abstract int selectNow() throws java.io.IOException;
    method public abstract java.util.Set<java.nio.channels.SelectionKey> selectedKeys();
    method public abstract java.nio.channels.Selector wakeup();
  }

  public abstract class ServerSocketChannel extends java.nio.channels.spi.AbstractSelectableChannel {
    ctor protected ServerSocketChannel(java.nio.channels.spi.SelectorProvider);
    method public abstract java.nio.channels.SocketChannel accept() throws java.io.IOException;
    method public static java.nio.channels.ServerSocketChannel open() throws java.io.IOException;
    method public abstract java.net.ServerSocket socket();
    method public final int validOps();
  }

  public abstract class SocketChannel extends java.nio.channels.spi.AbstractSelectableChannel implements java.nio.channels.ByteChannel java.nio.channels.GatheringByteChannel java.nio.channels.ScatteringByteChannel {
    ctor protected SocketChannel(java.nio.channels.spi.SelectorProvider);
    method public abstract boolean connect(java.net.SocketAddress) throws java.io.IOException;
    method public abstract boolean finishConnect() throws java.io.IOException;
    method public abstract boolean isConnected();
    method public abstract boolean isConnectionPending();
    method public static java.nio.channels.SocketChannel open() throws java.io.IOException;
    method public static java.nio.channels.SocketChannel open(java.net.SocketAddress) throws java.io.IOException;
    method public final long read(java.nio.ByteBuffer[]) throws java.io.IOException;
    method public abstract java.net.Socket socket();
    method public final int validOps();
    method public final long write(java.nio.ByteBuffer[]) throws java.io.IOException;
  }

  public class UnresolvedAddressException extends java.lang.IllegalArgumentException {
    ctor public UnresolvedAddressException();
  }

  public class UnsupportedAddressTypeException extends java.lang.IllegalArgumentException {
    ctor public UnsupportedAddressTypeException();
  }

  public interface WritableByteChannel extends java.nio.channels.Channel {
    method public int write(java.nio.ByteBuffer) throws java.io.IOException;
  }

}

package java.nio.channels.spi {

  public abstract class AbstractInterruptibleChannel implements java.nio.channels.Channel java.nio.channels.InterruptibleChannel {
    ctor protected AbstractInterruptibleChannel();
    method protected final void begin();
    method public final void close() throws java.io.IOException;
    method protected final void end(boolean) throws java.nio.channels.AsynchronousCloseException;
    method protected abstract void implCloseChannel() throws java.io.IOException;
    method public final boolean isOpen();
  }

  public abstract class AbstractSelectableChannel extends java.nio.channels.SelectableChannel {
    ctor protected AbstractSelectableChannel(java.nio.channels.spi.SelectorProvider);
    method public final Object blockingLock();
    method public final java.nio.channels.SelectableChannel configureBlocking(boolean) throws java.io.IOException;
    method protected final void implCloseChannel() throws java.io.IOException;
    method protected abstract void implCloseSelectableChannel() throws java.io.IOException;
    method protected abstract void implConfigureBlocking(boolean) throws java.io.IOException;
    method public final boolean isBlocking();
    method public final boolean isRegistered();
    method public final java.nio.channels.SelectionKey keyFor(java.nio.channels.Selector);
    method public final java.nio.channels.spi.SelectorProvider provider();
    method public final java.nio.channels.SelectionKey register(java.nio.channels.Selector, int, Object) throws java.nio.channels.ClosedChannelException;
  }

  public abstract class AbstractSelectionKey extends java.nio.channels.SelectionKey {
    ctor protected AbstractSelectionKey();
    method public final void cancel();
    method public final boolean isValid();
  }

  public abstract class AbstractSelector extends java.nio.channels.Selector {
    ctor protected AbstractSelector(java.nio.channels.spi.SelectorProvider);
    method protected final void begin();
    method protected final java.util.Set<java.nio.channels.SelectionKey> cancelledKeys();
    method public final void close() throws java.io.IOException;
    method protected final void deregister(java.nio.channels.spi.AbstractSelectionKey);
    method protected final void end();
    method protected abstract void implCloseSelector() throws java.io.IOException;
    method public final boolean isOpen();
    method public final java.nio.channels.spi.SelectorProvider provider();
    method protected abstract java.nio.channels.SelectionKey register(java.nio.channels.spi.AbstractSelectableChannel, int, Object);
  }

  public abstract class SelectorProvider {
    ctor protected SelectorProvider();
    method public java.nio.channels.Channel inheritedChannel() throws java.io.IOException;
    method public abstract java.nio.channels.DatagramChannel openDatagramChannel() throws java.io.IOException;
    method public abstract java.nio.channels.Pipe openPipe() throws java.io.IOException;
    method public abstract java.nio.channels.spi.AbstractSelector openSelector() throws java.io.IOException;
    method public abstract java.nio.channels.ServerSocketChannel openServerSocketChannel() throws java.io.IOException;
    method public abstract java.nio.channels.SocketChannel openSocketChannel() throws java.io.IOException;
    method public static java.nio.channels.spi.SelectorProvider provider();
  }

}

package java.nio.charset {

  public class CharacterCodingException extends java.io.IOException {
    ctor public CharacterCodingException();
  }

  public abstract class Charset implements java.lang.Comparable<java.nio.charset.Charset> {
    ctor protected Charset(String, String[]) throws java.nio.charset.IllegalCharsetNameException;
    method public final java.util.Set<java.lang.String> aliases();
    method public static java.util.SortedMap<java.lang.String,java.nio.charset.Charset> availableCharsets();
    method public boolean canEncode();
    method public final int compareTo(java.nio.charset.Charset);
    method public abstract boolean contains(java.nio.charset.Charset);
    method public final java.nio.CharBuffer decode(java.nio.ByteBuffer);
    method public static java.nio.charset.Charset defaultCharset();
    method public String displayName();
    method public String displayName(java.util.Locale);
    method public final java.nio.ByteBuffer encode(java.nio.CharBuffer);
    method public final java.nio.ByteBuffer encode(String);
    method public final boolean equals(Object);
    method public static java.nio.charset.Charset forName(String) throws java.nio.charset.IllegalCharsetNameException, java.nio.charset.UnsupportedCharsetException;
    method public final int hashCode();
    method public final boolean isRegistered();
    method public static boolean isSupported(String) throws java.nio.charset.IllegalCharsetNameException;
    method public final String name();
    method public abstract java.nio.charset.CharsetDecoder newDecoder();
    method public abstract java.nio.charset.CharsetEncoder newEncoder();
    method public final String toString();
  }

  public abstract class CharsetDecoder {
    ctor protected CharsetDecoder(java.nio.charset.Charset, float, float);
    method public final float averageCharsPerByte();
    method public final java.nio.charset.Charset charset();
    method public final java.nio.CharBuffer decode(java.nio.ByteBuffer) throws java.nio.charset.CharacterCodingException;
    method public final java.nio.charset.CoderResult decode(java.nio.ByteBuffer, java.nio.CharBuffer, boolean);
    method protected abstract java.nio.charset.CoderResult decodeLoop(java.nio.ByteBuffer, java.nio.CharBuffer);
    method public java.nio.charset.Charset detectedCharset();
    method public final java.nio.charset.CoderResult flush(java.nio.CharBuffer);
    method protected java.nio.charset.CoderResult implFlush(java.nio.CharBuffer);
    method protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    method protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    method protected void implReplaceWith(String);
    method protected void implReset();
    method public boolean isAutoDetecting();
    method public boolean isCharsetDetected();
    method public java.nio.charset.CodingErrorAction malformedInputAction();
    method public final float maxCharsPerByte();
    method public final java.nio.charset.CharsetDecoder onMalformedInput(java.nio.charset.CodingErrorAction);
    method public final java.nio.charset.CharsetDecoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    method public final java.nio.charset.CharsetDecoder replaceWith(String);
    method public final String replacement();
    method public final java.nio.charset.CharsetDecoder reset();
    method public java.nio.charset.CodingErrorAction unmappableCharacterAction();
  }

  public abstract class CharsetEncoder {
    ctor protected CharsetEncoder(java.nio.charset.Charset, float, float);
    ctor protected CharsetEncoder(java.nio.charset.Charset, float, float, byte[]);
    method public final float averageBytesPerChar();
    method public boolean canEncode(char);
    method public boolean canEncode(CharSequence);
    method public final java.nio.charset.Charset charset();
    method public final java.nio.ByteBuffer encode(java.nio.CharBuffer) throws java.nio.charset.CharacterCodingException;
    method public final java.nio.charset.CoderResult encode(java.nio.CharBuffer, java.nio.ByteBuffer, boolean);
    method protected abstract java.nio.charset.CoderResult encodeLoop(java.nio.CharBuffer, java.nio.ByteBuffer);
    method public final java.nio.charset.CoderResult flush(java.nio.ByteBuffer);
    method protected java.nio.charset.CoderResult implFlush(java.nio.ByteBuffer);
    method protected void implOnMalformedInput(java.nio.charset.CodingErrorAction);
    method protected void implOnUnmappableCharacter(java.nio.charset.CodingErrorAction);
    method protected void implReplaceWith(byte[]);
    method protected void implReset();
    method public boolean isLegalReplacement(byte[]);
    method public java.nio.charset.CodingErrorAction malformedInputAction();
    method public final float maxBytesPerChar();
    method public final java.nio.charset.CharsetEncoder onMalformedInput(java.nio.charset.CodingErrorAction);
    method public final java.nio.charset.CharsetEncoder onUnmappableCharacter(java.nio.charset.CodingErrorAction);
    method public final java.nio.charset.CharsetEncoder replaceWith(byte[]);
    method public final byte[] replacement();
    method public final java.nio.charset.CharsetEncoder reset();
    method public java.nio.charset.CodingErrorAction unmappableCharacterAction();
  }

  public class CoderMalfunctionError extends java.lang.Error {
    ctor public CoderMalfunctionError(Exception);
  }

  public class CoderResult {
    method public boolean isError();
    method public boolean isMalformed();
    method public boolean isOverflow();
    method public boolean isUnderflow();
    method public boolean isUnmappable();
    method public int length() throws java.lang.UnsupportedOperationException;
    method public static java.nio.charset.CoderResult malformedForLength(int) throws java.lang.IllegalArgumentException;
    method public void throwException() throws java.nio.BufferOverflowException, java.nio.BufferUnderflowException, java.nio.charset.CharacterCodingException, java.nio.charset.MalformedInputException, java.nio.charset.UnmappableCharacterException;
    method public static java.nio.charset.CoderResult unmappableForLength(int) throws java.lang.IllegalArgumentException;
    field public static final java.nio.charset.CoderResult OVERFLOW;
    field public static final java.nio.charset.CoderResult UNDERFLOW;
  }

  public class CodingErrorAction {
    field public static final java.nio.charset.CodingErrorAction IGNORE;
    field public static final java.nio.charset.CodingErrorAction REPLACE;
    field public static final java.nio.charset.CodingErrorAction REPORT;
  }

  public class IllegalCharsetNameException extends java.lang.IllegalArgumentException {
    ctor public IllegalCharsetNameException(String);
    method public String getCharsetName();
  }

  public class MalformedInputException extends java.nio.charset.CharacterCodingException {
    ctor public MalformedInputException(int);
    method public int getInputLength();
  }

  public class UnmappableCharacterException extends java.nio.charset.CharacterCodingException {
    ctor public UnmappableCharacterException(int);
    method public int getInputLength();
  }

  public class UnsupportedCharsetException extends java.lang.IllegalArgumentException {
    ctor public UnsupportedCharsetException(String);
    method public String getCharsetName();
  }

}

package java.nio.charset.spi {

  public abstract class CharsetProvider {
    ctor protected CharsetProvider();
    method public abstract java.nio.charset.Charset charsetForName(String);
    method public abstract java.util.Iterator<java.nio.charset.Charset> charsets();
  }

}

package java.security {

  public final class AccessControlContext {
    ctor public AccessControlContext(java.security.AccessControlContext, java.security.DomainCombiner);
    ctor public AccessControlContext(java.security.ProtectionDomain[]);
    method public void checkPermission(java.security.Permission) throws java.security.AccessControlException;
    method public java.security.DomainCombiner getDomainCombiner();
  }

  public class AccessControlException extends java.lang.SecurityException {
    ctor public AccessControlException(String);
    ctor public AccessControlException(String, java.security.Permission);
    method public java.security.Permission getPermission();
  }

  public final class AccessController {
    method public static void checkPermission(java.security.Permission) throws java.security.AccessControlException;
    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>);
    method public static <T> T doPrivileged(java.security.PrivilegedAction<T>, java.security.AccessControlContext);
    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>) throws java.security.PrivilegedActionException;
    method public static <T> T doPrivileged(java.security.PrivilegedExceptionAction<T>, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
    method public static java.security.AccessControlContext getContext();
  }

  public class AlgorithmParameterGenerator {
    ctor protected AlgorithmParameterGenerator(java.security.AlgorithmParameterGeneratorSpi, java.security.Provider, String);
    method public final java.security.AlgorithmParameters generateParameters();
    method public final String getAlgorithm();
    method public static java.security.AlgorithmParameterGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.AlgorithmParameterGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.AlgorithmParameterGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final void init(int);
    method public final void init(int, java.security.SecureRandom);
    method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
    method public final void init(java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException;
  }

  public abstract class AlgorithmParameterGeneratorSpi {
    ctor public AlgorithmParameterGeneratorSpi();
    method protected abstract java.security.AlgorithmParameters engineGenerateParameters();
    method protected abstract void engineInit(int, java.security.SecureRandom);
    method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException;
  }

  public class AlgorithmParameters {
    ctor protected AlgorithmParameters(java.security.AlgorithmParametersSpi, java.security.Provider, String);
    method public final String getAlgorithm();
    method public final byte[] getEncoded() throws java.io.IOException;
    method public final byte[] getEncoded(String) throws java.io.IOException;
    method public static java.security.AlgorithmParameters getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.AlgorithmParameters getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.AlgorithmParameters getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final <T extends java.security.spec.AlgorithmParameterSpec> T getParameterSpec(Class<T>) throws java.security.spec.InvalidParameterSpecException;
    method public final java.security.Provider getProvider();
    method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
    method public final void init(byte[]) throws java.io.IOException;
    method public final void init(byte[], String) throws java.io.IOException;
    method public final String toString();
  }

  public abstract class AlgorithmParametersSpi {
    ctor public AlgorithmParametersSpi();
    method protected abstract byte[] engineGetEncoded() throws java.io.IOException;
    method protected abstract byte[] engineGetEncoded(String) throws java.io.IOException;
    method protected abstract <T extends java.security.spec.AlgorithmParameterSpec> T engineGetParameterSpec(Class<T>) throws java.security.spec.InvalidParameterSpecException;
    method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec) throws java.security.spec.InvalidParameterSpecException;
    method protected abstract void engineInit(byte[]) throws java.io.IOException;
    method protected abstract void engineInit(byte[], String) throws java.io.IOException;
    method protected abstract String engineToString();
  }

  public final class AllPermission extends java.security.Permission {
    ctor public AllPermission(String, String);
    ctor public AllPermission();
    method public String getActions();
    method public boolean implies(java.security.Permission);
  }

  public abstract class AuthProvider extends java.security.Provider {
    ctor protected AuthProvider(String, double, String);
    method public abstract void login(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler) throws javax.security.auth.login.LoginException;
    method public abstract void logout() throws javax.security.auth.login.LoginException;
    method public abstract void setCallbackHandler(javax.security.auth.callback.CallbackHandler);
  }

  public abstract class BasicPermission extends java.security.Permission implements java.io.Serializable {
    ctor public BasicPermission(String);
    ctor public BasicPermission(String, String);
    method public String getActions();
    method public boolean implies(java.security.Permission);
  }

  @Deprecated public interface Certificate {
    method public void decode(java.io.InputStream) throws java.io.IOException, java.security.KeyException;
    method public void encode(java.io.OutputStream) throws java.io.IOException, java.security.KeyException;
    method public String getFormat();
    method public java.security.Principal getGuarantor();
    method public java.security.Principal getPrincipal();
    method public java.security.PublicKey getPublicKey();
    method public String toString(boolean);
  }

  public final class CodeSigner implements java.io.Serializable {
    ctor public CodeSigner(java.security.cert.CertPath, java.security.Timestamp);
    method public java.security.cert.CertPath getSignerCertPath();
    method public java.security.Timestamp getTimestamp();
  }

  public class CodeSource implements java.io.Serializable {
    ctor public CodeSource(java.net.URL, java.security.cert.Certificate[]);
    ctor public CodeSource(java.net.URL, java.security.CodeSigner[]);
    method public final java.security.cert.Certificate[] getCertificates();
    method public final java.security.CodeSigner[] getCodeSigners();
    method public final java.net.URL getLocation();
    method public boolean implies(java.security.CodeSource);
  }

  public class DigestException extends java.security.GeneralSecurityException {
    ctor public DigestException(String);
    ctor public DigestException();
    ctor public DigestException(String, Throwable);
    ctor public DigestException(Throwable);
  }

  public class DigestInputStream extends java.io.FilterInputStream {
    ctor public DigestInputStream(java.io.InputStream, java.security.MessageDigest);
    method public java.security.MessageDigest getMessageDigest();
    method public void on(boolean);
    method public void setMessageDigest(java.security.MessageDigest);
    field protected java.security.MessageDigest digest;
  }

  public class DigestOutputStream extends java.io.FilterOutputStream {
    ctor public DigestOutputStream(java.io.OutputStream, java.security.MessageDigest);
    method public java.security.MessageDigest getMessageDigest();
    method public void on(boolean);
    method public void setMessageDigest(java.security.MessageDigest);
    field protected java.security.MessageDigest digest;
  }

  public interface DomainCombiner {
    method public java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);
  }

  public class GeneralSecurityException extends java.lang.Exception {
    ctor public GeneralSecurityException(String);
    ctor public GeneralSecurityException();
    ctor public GeneralSecurityException(String, Throwable);
    ctor public GeneralSecurityException(Throwable);
  }

  public interface Guard {
    method public void checkGuard(Object) throws java.lang.SecurityException;
  }

  public class GuardedObject implements java.io.Serializable {
    ctor public GuardedObject(Object, java.security.Guard);
    method public Object getObject() throws java.lang.SecurityException;
  }

  @Deprecated public abstract class Identity implements java.security.Principal java.io.Serializable {
    ctor protected Identity();
    ctor public Identity(String);
    ctor public Identity(String, java.security.IdentityScope) throws java.security.KeyManagementException;
    method public void addCertificate(java.security.Certificate) throws java.security.KeyManagementException;
    method public java.security.Certificate[] certificates();
    method public final boolean equals(Object);
    method public String getInfo();
    method public final String getName();
    method public java.security.PublicKey getPublicKey();
    method public final java.security.IdentityScope getScope();
    method protected boolean identityEquals(java.security.Identity);
    method public void removeCertificate(java.security.Certificate) throws java.security.KeyManagementException;
    method public void setInfo(String);
    method public void setPublicKey(java.security.PublicKey) throws java.security.KeyManagementException;
    method public String toString(boolean);
  }

  @Deprecated public abstract class IdentityScope extends java.security.Identity {
    ctor protected IdentityScope();
    ctor public IdentityScope(String);
    ctor public IdentityScope(String, java.security.IdentityScope) throws java.security.KeyManagementException;
    method public abstract void addIdentity(java.security.Identity) throws java.security.KeyManagementException;
    method public abstract java.security.Identity getIdentity(String);
    method public java.security.Identity getIdentity(java.security.Principal);
    method public abstract java.security.Identity getIdentity(java.security.PublicKey);
    method public static java.security.IdentityScope getSystemScope();
    method public abstract java.util.Enumeration<java.security.Identity> identities();
    method public abstract void removeIdentity(java.security.Identity) throws java.security.KeyManagementException;
    method protected static void setSystemScope(java.security.IdentityScope);
    method public abstract int size();
  }

  public class InvalidAlgorithmParameterException extends java.security.GeneralSecurityException {
    ctor public InvalidAlgorithmParameterException(String);
    ctor public InvalidAlgorithmParameterException();
    ctor public InvalidAlgorithmParameterException(String, Throwable);
    ctor public InvalidAlgorithmParameterException(Throwable);
  }

  public class InvalidKeyException extends java.security.KeyException {
    ctor public InvalidKeyException(String);
    ctor public InvalidKeyException();
    ctor public InvalidKeyException(String, Throwable);
    ctor public InvalidKeyException(Throwable);
  }

  public class InvalidParameterException extends java.lang.IllegalArgumentException {
    ctor public InvalidParameterException(String);
    ctor public InvalidParameterException();
  }

  public interface Key extends java.io.Serializable {
    method public String getAlgorithm();
    method public byte[] getEncoded();
    method public String getFormat();
    field public static final long serialVersionUID = 6603384152749567654L; // 0x5ba3eee69414eea6L
  }

  public class KeyException extends java.security.GeneralSecurityException {
    ctor public KeyException(String);
    ctor public KeyException();
    ctor public KeyException(String, Throwable);
    ctor public KeyException(Throwable);
  }

  public class KeyFactory {
    ctor protected KeyFactory(java.security.KeyFactorySpi, java.security.Provider, String);
    method public final java.security.PrivateKey generatePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method public final java.security.PublicKey generatePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method public final String getAlgorithm();
    method public static java.security.KeyFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.KeyFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.KeyFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final <T extends java.security.spec.KeySpec> T getKeySpec(java.security.Key, Class<T>) throws java.security.spec.InvalidKeySpecException;
    method public final java.security.Provider getProvider();
    method public final java.security.Key translateKey(java.security.Key) throws java.security.InvalidKeyException;
  }

  public abstract class KeyFactorySpi {
    ctor public KeyFactorySpi();
    method protected abstract java.security.PrivateKey engineGeneratePrivate(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method protected abstract java.security.PublicKey engineGeneratePublic(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method protected abstract <T extends java.security.spec.KeySpec> T engineGetKeySpec(java.security.Key, Class<T>) throws java.security.spec.InvalidKeySpecException;
    method protected abstract java.security.Key engineTranslateKey(java.security.Key) throws java.security.InvalidKeyException;
  }

  public class KeyManagementException extends java.security.KeyException {
    ctor public KeyManagementException(String);
    ctor public KeyManagementException();
    ctor public KeyManagementException(String, Throwable);
    ctor public KeyManagementException(Throwable);
  }

  public final class KeyPair implements java.io.Serializable {
    ctor public KeyPair(java.security.PublicKey, java.security.PrivateKey);
    method public java.security.PrivateKey getPrivate();
    method public java.security.PublicKey getPublic();
  }

  public abstract class KeyPairGenerator extends java.security.KeyPairGeneratorSpi {
    ctor protected KeyPairGenerator(String);
    method public final java.security.KeyPair genKeyPair();
    method public java.security.KeyPair generateKeyPair();
    method public String getAlgorithm();
    method public static java.security.KeyPairGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.KeyPairGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.KeyPairGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public void initialize(int);
    method public void initialize(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
    method public void initialize(int, java.security.SecureRandom);
  }

  public abstract class KeyPairGeneratorSpi {
    ctor public KeyPairGeneratorSpi();
    method public abstract java.security.KeyPair generateKeyPair();
    method public abstract void initialize(int, java.security.SecureRandom);
    method public void initialize(java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException;
  }

  public class KeyRep implements java.io.Serializable {
    ctor public KeyRep(java.security.KeyRep.Type, String, String, byte[]);
    method protected Object readResolve() throws java.io.ObjectStreamException;
  }

  public enum KeyRep.Type {
    enum_constant public static final java.security.KeyRep.Type PRIVATE;
    enum_constant public static final java.security.KeyRep.Type PUBLIC;
    enum_constant public static final java.security.KeyRep.Type SECRET;
  }

  public class KeyStore {
    ctor protected KeyStore(java.security.KeyStoreSpi, java.security.Provider, String);
    method public final java.util.Enumeration<java.lang.String> aliases() throws java.security.KeyStoreException;
    method public final boolean containsAlias(String) throws java.security.KeyStoreException;
    method public final void deleteEntry(String) throws java.security.KeyStoreException;
    method public final boolean entryInstanceOf(String, Class<? extends java.security.KeyStore.Entry>) throws java.security.KeyStoreException;
    method public final java.security.cert.Certificate getCertificate(String) throws java.security.KeyStoreException;
    method public final String getCertificateAlias(java.security.cert.Certificate) throws java.security.KeyStoreException;
    method public final java.security.cert.Certificate[] getCertificateChain(String) throws java.security.KeyStoreException;
    method public final java.util.Date getCreationDate(String) throws java.security.KeyStoreException;
    method public static final String getDefaultType();
    method public final java.security.KeyStore.Entry getEntry(String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
    method public static java.security.KeyStore getInstance(String) throws java.security.KeyStoreException;
    method public static java.security.KeyStore getInstance(String, String) throws java.security.KeyStoreException, java.security.NoSuchProviderException;
    method public static java.security.KeyStore getInstance(String, java.security.Provider) throws java.security.KeyStoreException;
    method public final java.security.Key getKey(String, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    method public final java.security.Provider getProvider();
    method public final String getType();
    method public final boolean isCertificateEntry(String) throws java.security.KeyStoreException;
    method public final boolean isKeyEntry(String) throws java.security.KeyStoreException;
    method public final void load(java.io.InputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
    method public final void load(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
    method public final void setCertificateEntry(String, java.security.cert.Certificate) throws java.security.KeyStoreException;
    method public final void setEntry(String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
    method public final void setKeyEntry(String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
    method public final void setKeyEntry(String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
    method public final int size() throws java.security.KeyStoreException;
    method public final void store(java.io.OutputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException;
    method public final void store(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException;
  }

  public abstract static class KeyStore.Builder {
    ctor protected KeyStore.Builder();
    method public abstract java.security.KeyStore getKeyStore() throws java.security.KeyStoreException;
    method public abstract java.security.KeyStore.ProtectionParameter getProtectionParameter(String) throws java.security.KeyStoreException;
    method public static java.security.KeyStore.Builder newInstance(java.security.KeyStore, java.security.KeyStore.ProtectionParameter);
    method public static java.security.KeyStore.Builder newInstance(String, java.security.Provider, java.io.File, java.security.KeyStore.ProtectionParameter);
    method public static java.security.KeyStore.Builder newInstance(String, java.security.Provider, java.security.KeyStore.ProtectionParameter);
  }

  public static class KeyStore.CallbackHandlerProtection implements java.security.KeyStore.ProtectionParameter {
    ctor public KeyStore.CallbackHandlerProtection(javax.security.auth.callback.CallbackHandler);
    method public javax.security.auth.callback.CallbackHandler getCallbackHandler();
  }

  public static interface KeyStore.Entry {
  }

  public static interface KeyStore.LoadStoreParameter {
    method public java.security.KeyStore.ProtectionParameter getProtectionParameter();
  }

  public static class KeyStore.PasswordProtection implements javax.security.auth.Destroyable java.security.KeyStore.ProtectionParameter {
    ctor public KeyStore.PasswordProtection(char[]);
    method public void destroy() throws javax.security.auth.DestroyFailedException;
    method public char[] getPassword();
    method public boolean isDestroyed();
  }

  public static final class KeyStore.PrivateKeyEntry implements java.security.KeyStore.Entry {
    ctor public KeyStore.PrivateKeyEntry(java.security.PrivateKey, java.security.cert.Certificate[]);
    method public java.security.cert.Certificate getCertificate();
    method public java.security.cert.Certificate[] getCertificateChain();
    method public java.security.PrivateKey getPrivateKey();
  }

  public static interface KeyStore.ProtectionParameter {
  }

  public static final class KeyStore.SecretKeyEntry implements java.security.KeyStore.Entry {
    ctor public KeyStore.SecretKeyEntry(javax.crypto.SecretKey);
    method public javax.crypto.SecretKey getSecretKey();
  }

  public static final class KeyStore.TrustedCertificateEntry implements java.security.KeyStore.Entry {
    ctor public KeyStore.TrustedCertificateEntry(java.security.cert.Certificate);
    method public java.security.cert.Certificate getTrustedCertificate();
  }

  public class KeyStoreException extends java.security.GeneralSecurityException {
    ctor public KeyStoreException(String);
    ctor public KeyStoreException();
    ctor public KeyStoreException(String, Throwable);
    ctor public KeyStoreException(Throwable);
  }

  public abstract class KeyStoreSpi {
    ctor public KeyStoreSpi();
    method public abstract java.util.Enumeration<java.lang.String> engineAliases();
    method public abstract boolean engineContainsAlias(String);
    method public abstract void engineDeleteEntry(String) throws java.security.KeyStoreException;
    method public boolean engineEntryInstanceOf(String, Class<? extends java.security.KeyStore.Entry>);
    method public abstract java.security.cert.Certificate engineGetCertificate(String);
    method public abstract String engineGetCertificateAlias(java.security.cert.Certificate);
    method public abstract java.security.cert.Certificate[] engineGetCertificateChain(String);
    method public abstract java.util.Date engineGetCreationDate(String);
    method public java.security.KeyStore.Entry engineGetEntry(String, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableEntryException;
    method public abstract java.security.Key engineGetKey(String, char[]) throws java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    method public abstract boolean engineIsCertificateEntry(String);
    method public abstract boolean engineIsKeyEntry(String);
    method public abstract void engineLoad(java.io.InputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
    method public void engineLoad(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
    method public abstract void engineSetCertificateEntry(String, java.security.cert.Certificate) throws java.security.KeyStoreException;
    method public void engineSetEntry(String, java.security.KeyStore.Entry, java.security.KeyStore.ProtectionParameter) throws java.security.KeyStoreException;
    method public abstract void engineSetKeyEntry(String, java.security.Key, char[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
    method public abstract void engineSetKeyEntry(String, byte[], java.security.cert.Certificate[]) throws java.security.KeyStoreException;
    method public abstract int engineSize();
    method public abstract void engineStore(java.io.OutputStream, char[]) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
    method public void engineStore(java.security.KeyStore.LoadStoreParameter) throws java.security.cert.CertificateException, java.io.IOException, java.security.NoSuchAlgorithmException;
  }

  public abstract class MessageDigest extends java.security.MessageDigestSpi {
    ctor protected MessageDigest(String);
    method public byte[] digest();
    method public int digest(byte[], int, int) throws java.security.DigestException;
    method public byte[] digest(byte[]);
    method public final String getAlgorithm();
    method public final int getDigestLength();
    method public static java.security.MessageDigest getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.MessageDigest getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.MessageDigest getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public static boolean isEqual(byte[], byte[]);
    method public void reset();
    method public void update(byte);
    method public void update(byte[], int, int);
    method public void update(byte[]);
    method public final void update(java.nio.ByteBuffer);
  }

  public abstract class MessageDigestSpi {
    ctor public MessageDigestSpi();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method protected abstract byte[] engineDigest();
    method protected int engineDigest(byte[], int, int) throws java.security.DigestException;
    method protected int engineGetDigestLength();
    method protected abstract void engineReset();
    method protected abstract void engineUpdate(byte);
    method protected abstract void engineUpdate(byte[], int, int);
    method protected void engineUpdate(java.nio.ByteBuffer);
  }

  public class NoSuchAlgorithmException extends java.security.GeneralSecurityException {
    ctor public NoSuchAlgorithmException(String);
    ctor public NoSuchAlgorithmException();
    ctor public NoSuchAlgorithmException(String, Throwable);
    ctor public NoSuchAlgorithmException(Throwable);
  }

  public class NoSuchProviderException extends java.security.GeneralSecurityException {
    ctor public NoSuchProviderException(String);
    ctor public NoSuchProviderException();
  }

  public abstract class Permission implements java.security.Guard java.io.Serializable {
    ctor public Permission(String);
    method public void checkGuard(Object) throws java.lang.SecurityException;
    method public abstract boolean equals(Object);
    method public abstract String getActions();
    method public final String getName();
    method public abstract int hashCode();
    method public abstract boolean implies(java.security.Permission);
    method public java.security.PermissionCollection newPermissionCollection();
  }

  public abstract class PermissionCollection implements java.io.Serializable {
    ctor public PermissionCollection();
    method public abstract void add(java.security.Permission);
    method public abstract java.util.Enumeration<java.security.Permission> elements();
    method public abstract boolean implies(java.security.Permission);
    method public boolean isReadOnly();
    method public void setReadOnly();
  }

  public final class Permissions extends java.security.PermissionCollection implements java.io.Serializable {
    ctor public Permissions();
    method public void add(java.security.Permission);
    method public java.util.Enumeration<java.security.Permission> elements();
    method public boolean implies(java.security.Permission);
  }

  public abstract class Policy {
    ctor public Policy();
    method public abstract java.security.PermissionCollection getPermissions(java.security.CodeSource);
    method public java.security.PermissionCollection getPermissions(java.security.ProtectionDomain);
    method public static java.security.Policy getPolicy();
    method public boolean implies(java.security.ProtectionDomain, java.security.Permission);
    method public abstract void refresh();
    method public static void setPolicy(java.security.Policy);
  }

  public interface Principal {
    method public boolean equals(Object);
    method public String getName();
    method public int hashCode();
    method public String toString();
  }

  public interface PrivateKey extends java.security.Key {
    field public static final long serialVersionUID = 6034044314589513430L; // 0x53bd3b559a12c6d6L
  }

  public interface PrivilegedAction<T> {
    method public T run();
  }

  public class PrivilegedActionException extends java.lang.Exception {
    ctor public PrivilegedActionException(Exception);
    method public Exception getException();
  }

  public interface PrivilegedExceptionAction<T> {
    method public T run() throws java.lang.Exception;
  }

  public class ProtectionDomain {
    ctor public ProtectionDomain(java.security.CodeSource, java.security.PermissionCollection);
    ctor public ProtectionDomain(java.security.CodeSource, java.security.PermissionCollection, ClassLoader, java.security.Principal[]);
    method public final ClassLoader getClassLoader();
    method public final java.security.CodeSource getCodeSource();
    method public final java.security.PermissionCollection getPermissions();
    method public final java.security.Principal[] getPrincipals();
    method public boolean implies(java.security.Permission);
  }

  public abstract class Provider extends java.util.Properties {
    ctor protected Provider(String, double, String);
    method public java.util.Set<java.util.Map.Entry<java.lang.Object,java.lang.Object>> entrySet();
    method public String getInfo();
    method public String getName();
    method public java.security.Provider.Service getService(String, String);
    method public java.util.Set<java.security.Provider.Service> getServices();
    method public double getVersion();
    method public java.util.Set<java.lang.Object> keySet();
    method public Object put(Object, Object);
    method public void putAll(java.util.Map<?,?>);
    method protected void putService(java.security.Provider.Service);
    method public Object remove(Object);
    method protected void removeService(java.security.Provider.Service);
    method public java.util.Collection<java.lang.Object> values();
  }

  public static class Provider.Service {
    ctor public Provider.Service(java.security.Provider, String, String, String, java.util.List<java.lang.String>, java.util.Map<java.lang.String,java.lang.String>);
    method public final String getAlgorithm();
    method public final String getAttribute(String);
    method public final String getClassName();
    method public final java.security.Provider getProvider();
    method public final String getType();
    method public Object newInstance(Object) throws java.security.NoSuchAlgorithmException;
    method public boolean supportsParameter(Object);
  }

  public class ProviderException extends java.lang.RuntimeException {
    ctor public ProviderException(String);
    ctor public ProviderException();
    ctor public ProviderException(String, Throwable);
    ctor public ProviderException(Throwable);
  }

  public interface PublicKey extends java.security.Key {
    field public static final long serialVersionUID = 7187392471159151072L; // 0x63bebf5f40c219e0L
  }

  public class SecureClassLoader extends java.lang.ClassLoader {
    ctor protected SecureClassLoader();
    ctor protected SecureClassLoader(ClassLoader);
    method protected final Class<?> defineClass(String, byte[], int, int, java.security.CodeSource);
    method protected final Class<?> defineClass(String, java.nio.ByteBuffer, java.security.CodeSource);
    method protected java.security.PermissionCollection getPermissions(java.security.CodeSource);
  }

  public class SecureRandom extends java.util.Random {
    ctor public SecureRandom();
    ctor public SecureRandom(byte[]);
    ctor protected SecureRandom(java.security.SecureRandomSpi, java.security.Provider);
    method public byte[] generateSeed(int);
    method public String getAlgorithm();
    method public static java.security.SecureRandom getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.SecureRandom getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.SecureRandom getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public static byte[] getSeed(int);
    method protected final int next(int);
    method public void setSeed(byte[]);
  }

  public abstract class SecureRandomSpi implements java.io.Serializable {
    ctor public SecureRandomSpi();
    method protected abstract byte[] engineGenerateSeed(int);
    method protected abstract void engineNextBytes(byte[]);
    method protected abstract void engineSetSeed(byte[]);
  }

  public final class Security {
    method public static int addProvider(java.security.Provider);
    method public static String getAlgorithmProperty(String, String);
    method public static java.util.Set<java.lang.String> getAlgorithms(String);
    method public static String getProperty(String);
    method public static java.security.Provider getProvider(String);
    method public static java.security.Provider[] getProviders();
    method public static java.security.Provider[] getProviders(String);
    method public static java.security.Provider[] getProviders(java.util.Map<java.lang.String,java.lang.String>);
    method public static int insertProviderAt(java.security.Provider, int);
    method public static void removeProvider(String);
    method public static void setProperty(String, String);
  }

  public final class SecurityPermission extends java.security.BasicPermission {
    ctor public SecurityPermission(String);
    ctor public SecurityPermission(String, String);
  }

  public abstract class Signature extends java.security.SignatureSpi {
    ctor protected Signature(String);
    method public final String getAlgorithm();
    method public static java.security.Signature getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.Signature getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.Signature getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final Object getParameter(String) throws java.security.InvalidParameterException;
    method public final java.security.AlgorithmParameters getParameters();
    method public final java.security.Provider getProvider();
    method public final void initSign(java.security.PrivateKey) throws java.security.InvalidKeyException;
    method public final void initSign(java.security.PrivateKey, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method public final void initVerify(java.security.PublicKey) throws java.security.InvalidKeyException;
    method public final void initVerify(java.security.cert.Certificate) throws java.security.InvalidKeyException;
    method public final void setParameter(String, Object) throws java.security.InvalidParameterException;
    method public final void setParameter(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
    method public final byte[] sign() throws java.security.SignatureException;
    method public final int sign(byte[], int, int) throws java.security.SignatureException;
    method public final void update(byte) throws java.security.SignatureException;
    method public final void update(byte[]) throws java.security.SignatureException;
    method public final void update(byte[], int, int) throws java.security.SignatureException;
    method public final void update(java.nio.ByteBuffer) throws java.security.SignatureException;
    method public final boolean verify(byte[]) throws java.security.SignatureException;
    method public final boolean verify(byte[], int, int) throws java.security.SignatureException;
    field protected static final int SIGN = 2; // 0x2
    field protected static final int UNINITIALIZED = 0; // 0x0
    field protected static final int VERIFY = 3; // 0x3
    field protected int state;
  }

  public class SignatureException extends java.security.GeneralSecurityException {
    ctor public SignatureException(String);
    ctor public SignatureException();
    ctor public SignatureException(String, Throwable);
    ctor public SignatureException(Throwable);
  }

  public abstract class SignatureSpi {
    ctor public SignatureSpi();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method protected abstract Object engineGetParameter(String) throws java.security.InvalidParameterException;
    method protected java.security.AlgorithmParameters engineGetParameters();
    method protected abstract void engineInitSign(java.security.PrivateKey) throws java.security.InvalidKeyException;
    method protected void engineInitSign(java.security.PrivateKey, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method protected abstract void engineInitVerify(java.security.PublicKey) throws java.security.InvalidKeyException;
    method protected abstract void engineSetParameter(String, Object) throws java.security.InvalidParameterException;
    method protected void engineSetParameter(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
    method protected abstract byte[] engineSign() throws java.security.SignatureException;
    method protected int engineSign(byte[], int, int) throws java.security.SignatureException;
    method protected abstract void engineUpdate(byte) throws java.security.SignatureException;
    method protected abstract void engineUpdate(byte[], int, int) throws java.security.SignatureException;
    method protected void engineUpdate(java.nio.ByteBuffer);
    method protected abstract boolean engineVerify(byte[]) throws java.security.SignatureException;
    method protected boolean engineVerify(byte[], int, int) throws java.security.SignatureException;
    field protected java.security.SecureRandom appRandom;
  }

  public final class SignedObject implements java.io.Serializable {
    ctor public SignedObject(java.io.Serializable, java.security.PrivateKey, java.security.Signature) throws java.io.IOException, java.security.InvalidKeyException, java.security.SignatureException;
    method public String getAlgorithm();
    method public Object getObject() throws java.lang.ClassNotFoundException, java.io.IOException;
    method public byte[] getSignature();
    method public boolean verify(java.security.PublicKey, java.security.Signature) throws java.security.InvalidKeyException, java.security.SignatureException;
  }

  @Deprecated public abstract class Signer extends java.security.Identity {
    ctor protected Signer();
    ctor public Signer(String);
    ctor public Signer(String, java.security.IdentityScope) throws java.security.KeyManagementException;
    method public java.security.PrivateKey getPrivateKey();
    method public final void setKeyPair(java.security.KeyPair) throws java.security.InvalidParameterException, java.security.KeyException;
  }

  public final class Timestamp implements java.io.Serializable {
    ctor public Timestamp(java.util.Date, java.security.cert.CertPath);
    method public java.security.cert.CertPath getSignerCertPath();
    method public java.util.Date getTimestamp();
  }

  public class UnrecoverableEntryException extends java.security.GeneralSecurityException {
    ctor public UnrecoverableEntryException();
    ctor public UnrecoverableEntryException(String);
  }

  public class UnrecoverableKeyException extends java.security.GeneralSecurityException {
    ctor public UnrecoverableKeyException(String);
    ctor public UnrecoverableKeyException();
  }

  public final class UnresolvedPermission extends java.security.Permission implements java.io.Serializable {
    ctor public UnresolvedPermission(String, String, String, java.security.cert.Certificate[]);
    method public String getActions();
    method public String getUnresolvedActions();
    method public java.security.cert.Certificate[] getUnresolvedCerts();
    method public String getUnresolvedName();
    method public String getUnresolvedType();
    method public boolean implies(java.security.Permission);
  }

}

package java.security.acl {

  public interface Acl extends java.security.acl.Owner {
    method public boolean addEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
    method public boolean checkPermission(java.security.Principal, java.security.acl.Permission);
    method public java.util.Enumeration<java.security.acl.AclEntry> entries();
    method public String getName();
    method public java.util.Enumeration<java.security.acl.Permission> getPermissions(java.security.Principal);
    method public boolean removeEntry(java.security.Principal, java.security.acl.AclEntry) throws java.security.acl.NotOwnerException;
    method public void setName(java.security.Principal, String) throws java.security.acl.NotOwnerException;
    method public String toString();
  }

  public interface AclEntry extends java.lang.Cloneable {
    method public boolean addPermission(java.security.acl.Permission);
    method public boolean checkPermission(java.security.acl.Permission);
    method public Object clone();
    method public java.security.Principal getPrincipal();
    method public boolean isNegative();
    method public java.util.Enumeration<java.security.acl.Permission> permissions();
    method public boolean removePermission(java.security.acl.Permission);
    method public void setNegativePermissions();
    method public boolean setPrincipal(java.security.Principal);
    method public String toString();
  }

  public class AclNotFoundException extends java.lang.Exception {
    ctor public AclNotFoundException();
  }

  public interface Group extends java.security.Principal {
    method public boolean addMember(java.security.Principal);
    method public boolean isMember(java.security.Principal);
    method public java.util.Enumeration<? extends java.security.Principal> members();
    method public boolean removeMember(java.security.Principal);
  }

  public class LastOwnerException extends java.lang.Exception {
    ctor public LastOwnerException();
  }

  public class NotOwnerException extends java.lang.Exception {
    ctor public NotOwnerException();
  }

  public interface Owner {
    method public boolean addOwner(java.security.Principal, java.security.Principal) throws java.security.acl.NotOwnerException;
    method public boolean deleteOwner(java.security.Principal, java.security.Principal) throws java.security.acl.LastOwnerException, java.security.acl.NotOwnerException;
    method public boolean isOwner(java.security.Principal);
  }

  public interface Permission {
    method public boolean equals(Object);
    method public String toString();
  }

}

package java.security.cert {

  public abstract class CRL {
    ctor protected CRL(String);
    method public final String getType();
    method public abstract boolean isRevoked(java.security.cert.Certificate);
    method public abstract String toString();
  }

  public class CRLException extends java.security.GeneralSecurityException {
    ctor public CRLException(String);
    ctor public CRLException();
    ctor public CRLException(String, Throwable);
    ctor public CRLException(Throwable);
  }

  public interface CRLSelector extends java.lang.Cloneable {
    method public Object clone();
    method public boolean match(java.security.cert.CRL);
  }

  public abstract class CertPath implements java.io.Serializable {
    ctor protected CertPath(String);
    method public abstract java.util.List<? extends java.security.cert.Certificate> getCertificates();
    method public abstract byte[] getEncoded() throws java.security.cert.CertificateEncodingException;
    method public abstract byte[] getEncoded(String) throws java.security.cert.CertificateEncodingException;
    method public abstract java.util.Iterator<java.lang.String> getEncodings();
    method public String getType();
    method protected Object writeReplace() throws java.io.ObjectStreamException;
  }

  protected static class CertPath.CertPathRep implements java.io.Serializable {
    ctor protected CertPath.CertPathRep(String, byte[]);
    method protected Object readResolve() throws java.io.ObjectStreamException;
  }

  public class CertPathBuilder {
    ctor protected CertPathBuilder(java.security.cert.CertPathBuilderSpi, java.security.Provider, String);
    method public final java.security.cert.CertPathBuilderResult build(java.security.cert.CertPathParameters) throws java.security.cert.CertPathBuilderException, java.security.InvalidAlgorithmParameterException;
    method public final String getAlgorithm();
    method public static final String getDefaultType();
    method public static java.security.cert.CertPathBuilder getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.cert.CertPathBuilder getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.cert.CertPathBuilder getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
  }

  public class CertPathBuilderException extends java.security.GeneralSecurityException {
    ctor public CertPathBuilderException(String, Throwable);
    ctor public CertPathBuilderException(Throwable);
    ctor public CertPathBuilderException(String);
    ctor public CertPathBuilderException();
  }

  public interface CertPathBuilderResult extends java.lang.Cloneable {
    method public Object clone();
    method public java.security.cert.CertPath getCertPath();
  }

  public abstract class CertPathBuilderSpi {
    ctor public CertPathBuilderSpi();
    method public abstract java.security.cert.CertPathBuilderResult engineBuild(java.security.cert.CertPathParameters) throws java.security.cert.CertPathBuilderException, java.security.InvalidAlgorithmParameterException;
  }

  public interface CertPathParameters extends java.lang.Cloneable {
    method public Object clone();
  }

  public class CertPathValidator {
    ctor protected CertPathValidator(java.security.cert.CertPathValidatorSpi, java.security.Provider, String);
    method public final String getAlgorithm();
    method public static final String getDefaultType();
    method public static java.security.cert.CertPathValidator getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static java.security.cert.CertPathValidator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.cert.CertPathValidator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final java.security.cert.CertPathValidatorResult validate(java.security.cert.CertPath, java.security.cert.CertPathParameters) throws java.security.cert.CertPathValidatorException, java.security.InvalidAlgorithmParameterException;
  }

  public class CertPathValidatorException extends java.security.GeneralSecurityException {
    ctor public CertPathValidatorException(String, Throwable, java.security.cert.CertPath, int);
    ctor public CertPathValidatorException(String, Throwable);
    ctor public CertPathValidatorException(Throwable);
    ctor public CertPathValidatorException(String);
    ctor public CertPathValidatorException();
    method public java.security.cert.CertPath getCertPath();
    method public int getIndex();
  }

  public interface CertPathValidatorResult extends java.lang.Cloneable {
    method public Object clone();
  }

  public abstract class CertPathValidatorSpi {
    ctor public CertPathValidatorSpi();
    method public abstract java.security.cert.CertPathValidatorResult engineValidate(java.security.cert.CertPath, java.security.cert.CertPathParameters) throws java.security.cert.CertPathValidatorException, java.security.InvalidAlgorithmParameterException;
  }

  public interface CertSelector extends java.lang.Cloneable {
    method public Object clone();
    method public boolean match(java.security.cert.Certificate);
  }

  public class CertStore {
    ctor protected CertStore(java.security.cert.CertStoreSpi, java.security.Provider, String, java.security.cert.CertStoreParameters);
    method public final java.util.Collection<? extends java.security.cert.CRL> getCRLs(java.security.cert.CRLSelector) throws java.security.cert.CertStoreException;
    method public final java.security.cert.CertStoreParameters getCertStoreParameters();
    method public final java.util.Collection<? extends java.security.cert.Certificate> getCertificates(java.security.cert.CertSelector) throws java.security.cert.CertStoreException;
    method public static final String getDefaultType();
    method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
    method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters, String) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static java.security.cert.CertStore getInstance(String, java.security.cert.CertStoreParameters, java.security.Provider) throws java.security.InvalidAlgorithmParameterException, java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final String getType();
  }

  public class CertStoreException extends java.security.GeneralSecurityException {
    ctor public CertStoreException(String, Throwable);
    ctor public CertStoreException(Throwable);
    ctor public CertStoreException(String);
    ctor public CertStoreException();
  }

  public interface CertStoreParameters extends java.lang.Cloneable {
    method public Object clone();
  }

  public abstract class CertStoreSpi {
    ctor public CertStoreSpi(java.security.cert.CertStoreParameters) throws java.security.InvalidAlgorithmParameterException;
    method public abstract java.util.Collection<? extends java.security.cert.CRL> engineGetCRLs(java.security.cert.CRLSelector) throws java.security.cert.CertStoreException;
    method public abstract java.util.Collection<? extends java.security.cert.Certificate> engineGetCertificates(java.security.cert.CertSelector) throws java.security.cert.CertStoreException;
  }

  public abstract class Certificate implements java.io.Serializable {
    ctor protected Certificate(String);
    method public abstract byte[] getEncoded() throws java.security.cert.CertificateEncodingException;
    method public abstract java.security.PublicKey getPublicKey();
    method public final String getType();
    method public abstract String toString();
    method public abstract void verify(java.security.PublicKey) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
    method public abstract void verify(java.security.PublicKey, String) throws java.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
    method protected Object writeReplace() throws java.io.ObjectStreamException;
  }

  protected static class Certificate.CertificateRep implements java.io.Serializable {
    ctor protected Certificate.CertificateRep(String, byte[]);
    method protected Object readResolve() throws java.io.ObjectStreamException;
  }

  public class CertificateEncodingException extends java.security.cert.CertificateException {
    ctor public CertificateEncodingException(String);
    ctor public CertificateEncodingException();
    ctor public CertificateEncodingException(String, Throwable);
    ctor public CertificateEncodingException(Throwable);
  }

  public class CertificateException extends java.security.GeneralSecurityException {
    ctor public CertificateException(String);
    ctor public CertificateException();
    ctor public CertificateException(String, Throwable);
    ctor public CertificateException(Throwable);
  }

  public class CertificateExpiredException extends java.security.cert.CertificateException {
    ctor public CertificateExpiredException(String);
    ctor public CertificateExpiredException();
  }

  public class CertificateFactory {
    ctor protected CertificateFactory(java.security.cert.CertificateFactorySpi, java.security.Provider, String);
    method public final java.security.cert.CRL generateCRL(java.io.InputStream) throws java.security.cert.CRLException;
    method public final java.util.Collection<? extends java.security.cert.CRL> generateCRLs(java.io.InputStream) throws java.security.cert.CRLException;
    method public final java.security.cert.CertPath generateCertPath(java.io.InputStream) throws java.security.cert.CertificateException;
    method public final java.security.cert.CertPath generateCertPath(java.io.InputStream, String) throws java.security.cert.CertificateException;
    method public final java.security.cert.CertPath generateCertPath(java.util.List<? extends java.security.cert.Certificate>) throws java.security.cert.CertificateException;
    method public final java.security.cert.Certificate generateCertificate(java.io.InputStream) throws java.security.cert.CertificateException;
    method public final java.util.Collection<? extends java.security.cert.Certificate> generateCertificates(java.io.InputStream) throws java.security.cert.CertificateException;
    method public final java.util.Iterator<java.lang.String> getCertPathEncodings();
    method public static final java.security.cert.CertificateFactory getInstance(String) throws java.security.cert.CertificateException;
    method public static final java.security.cert.CertificateFactory getInstance(String, String) throws java.security.cert.CertificateException, java.security.NoSuchProviderException;
    method public static final java.security.cert.CertificateFactory getInstance(String, java.security.Provider) throws java.security.cert.CertificateException;
    method public final java.security.Provider getProvider();
    method public final String getType();
  }

  public abstract class CertificateFactorySpi {
    ctor public CertificateFactorySpi();
    method public abstract java.security.cert.CRL engineGenerateCRL(java.io.InputStream) throws java.security.cert.CRLException;
    method public abstract java.util.Collection<? extends java.security.cert.CRL> engineGenerateCRLs(java.io.InputStream) throws java.security.cert.CRLException;
    method public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream) throws java.security.cert.CertificateException;
    method public java.security.cert.CertPath engineGenerateCertPath(java.io.InputStream, String) throws java.security.cert.CertificateException;
    method public java.security.cert.CertPath engineGenerateCertPath(java.util.List<? extends java.security.cert.Certificate>) throws java.security.cert.CertificateException;
    method public abstract java.security.cert.Certificate engineGenerateCertificate(java.io.InputStream) throws java.security.cert.CertificateException;
    method public abstract java.util.Collection<? extends java.security.cert.Certificate> engineGenerateCertificates(java.io.InputStream) throws java.security.cert.CertificateException;
    method public java.util.Iterator<java.lang.String> engineGetCertPathEncodings();
  }

  public class CertificateNotYetValidException extends java.security.cert.CertificateException {
    ctor public CertificateNotYetValidException(String);
    ctor public CertificateNotYetValidException();
  }

  public class CertificateParsingException extends java.security.cert.CertificateException {
    ctor public CertificateParsingException(String);
    ctor public CertificateParsingException();
    ctor public CertificateParsingException(String, Throwable);
    ctor public CertificateParsingException(Throwable);
  }

  public class CollectionCertStoreParameters implements java.security.cert.CertStoreParameters {
    ctor public CollectionCertStoreParameters();
    ctor public CollectionCertStoreParameters(java.util.Collection<?>);
    method public Object clone();
    method public java.util.Collection<?> getCollection();
  }

  public class LDAPCertStoreParameters implements java.security.cert.CertStoreParameters {
    ctor public LDAPCertStoreParameters(String, int);
    ctor public LDAPCertStoreParameters();
    ctor public LDAPCertStoreParameters(String);
    method public Object clone();
    method public int getPort();
    method public String getServerName();
  }

  public class PKIXBuilderParameters extends java.security.cert.PKIXParameters {
    ctor public PKIXBuilderParameters(java.util.Set<java.security.cert.TrustAnchor>, java.security.cert.CertSelector) throws java.security.InvalidAlgorithmParameterException;
    ctor public PKIXBuilderParameters(java.security.KeyStore, java.security.cert.CertSelector) throws java.security.InvalidAlgorithmParameterException, java.security.KeyStoreException;
    method public int getMaxPathLength();
    method public void setMaxPathLength(int);
  }

  public class PKIXCertPathBuilderResult extends java.security.cert.PKIXCertPathValidatorResult implements java.security.cert.CertPathBuilderResult {
    ctor public PKIXCertPathBuilderResult(java.security.cert.CertPath, java.security.cert.TrustAnchor, java.security.cert.PolicyNode, java.security.PublicKey);
    method public java.security.cert.CertPath getCertPath();
  }

  public abstract class PKIXCertPathChecker implements java.lang.Cloneable {
    ctor protected PKIXCertPathChecker();
    method public abstract void check(java.security.cert.Certificate, java.util.Collection<java.lang.String>) throws java.security.cert.CertPathValidatorException;
    method public Object clone();
    method public abstract java.util.Set<java.lang.String> getSupportedExtensions();
    method public abstract void init(boolean) throws java.security.cert.CertPathValidatorException;
    method public abstract boolean isForwardCheckingSupported();
  }

  public class PKIXCertPathValidatorResult implements java.security.cert.CertPathValidatorResult {
    ctor public PKIXCertPathValidatorResult(java.security.cert.TrustAnchor, java.security.cert.PolicyNode, java.security.PublicKey);
    method public Object clone();
    method public java.security.cert.PolicyNode getPolicyTree();
    method public java.security.PublicKey getPublicKey();
    method public java.security.cert.TrustAnchor getTrustAnchor();
  }

  public class PKIXParameters implements java.security.cert.CertPathParameters {
    ctor public PKIXParameters(java.util.Set<java.security.cert.TrustAnchor>) throws java.security.InvalidAlgorithmParameterException;
    ctor public PKIXParameters(java.security.KeyStore) throws java.security.InvalidAlgorithmParameterException, java.security.KeyStoreException;
    method public void addCertPathChecker(java.security.cert.PKIXCertPathChecker);
    method public void addCertStore(java.security.cert.CertStore);
    method public Object clone();
    method public java.util.List<java.security.cert.PKIXCertPathChecker> getCertPathCheckers();
    method public java.util.List<java.security.cert.CertStore> getCertStores();
    method public java.util.Date getDate();
    method public java.util.Set<java.lang.String> getInitialPolicies();
    method public boolean getPolicyQualifiersRejected();
    method public String getSigProvider();
    method public java.security.cert.CertSelector getTargetCertConstraints();
    method public java.util.Set<java.security.cert.TrustAnchor> getTrustAnchors();
    method public boolean isAnyPolicyInhibited();
    method public boolean isExplicitPolicyRequired();
    method public boolean isPolicyMappingInhibited();
    method public boolean isRevocationEnabled();
    method public void setAnyPolicyInhibited(boolean);
    method public void setCertPathCheckers(java.util.List<java.security.cert.PKIXCertPathChecker>);
    method public void setCertStores(java.util.List<java.security.cert.CertStore>);
    method public void setDate(java.util.Date);
    method public void setExplicitPolicyRequired(boolean);
    method public void setInitialPolicies(java.util.Set<java.lang.String>);
    method public void setPolicyMappingInhibited(boolean);
    method public void setPolicyQualifiersRejected(boolean);
    method public void setRevocationEnabled(boolean);
    method public void setSigProvider(String);
    method public void setTargetCertConstraints(java.security.cert.CertSelector);
    method public void setTrustAnchors(java.util.Set<java.security.cert.TrustAnchor>) throws java.security.InvalidAlgorithmParameterException;
  }

  public interface PolicyNode {
    method public java.util.Iterator<? extends java.security.cert.PolicyNode> getChildren();
    method public int getDepth();
    method public java.util.Set<java.lang.String> getExpectedPolicies();
    method public java.security.cert.PolicyNode getParent();
    method public java.util.Set<? extends java.security.cert.PolicyQualifierInfo> getPolicyQualifiers();
    method public String getValidPolicy();
    method public boolean isCritical();
  }

  public class PolicyQualifierInfo {
    ctor public PolicyQualifierInfo(byte[]) throws java.io.IOException;
    method public final byte[] getEncoded();
    method public final byte[] getPolicyQualifier();
    method public final String getPolicyQualifierId();
  }

  public class TrustAnchor {
    ctor public TrustAnchor(java.security.cert.X509Certificate, byte[]);
    ctor public TrustAnchor(String, java.security.PublicKey, byte[]);
    ctor public TrustAnchor(javax.security.auth.x500.X500Principal, java.security.PublicKey, byte[]);
    method public final javax.security.auth.x500.X500Principal getCA();
    method public final String getCAName();
    method public final java.security.PublicKey getCAPublicKey();
    method public final byte[] getNameConstraints();
    method public final java.security.cert.X509Certificate getTrustedCert();
  }

  public abstract class X509CRL extends java.security.cert.CRL implements java.security.cert.X509Extension {
    ctor protected X509CRL();
    method public abstract byte[] getEncoded() throws java.security.cert.CRLException;
    method public abstract java.security.Principal getIssuerDN();
    method public javax.security.auth.x500.X500Principal getIssuerX500Principal();
    method public abstract java.util.Date getNextUpdate();
    method public abstract java.security.cert.X509CRLEntry getRevokedCertificate(java.math.BigInteger);
    method public java.security.cert.X509CRLEntry getRevokedCertificate(java.security.cert.X509Certificate);
    method public abstract java.util.Set<? extends java.security.cert.X509CRLEntry> getRevokedCertificates();
    method public abstract String getSigAlgName();
    method public abstract String getSigAlgOID();
    method public abstract byte[] getSigAlgParams();
    method public abstract byte[] getSignature();
    method public abstract byte[] getTBSCertList() throws java.security.cert.CRLException;
    method public abstract java.util.Date getThisUpdate();
    method public abstract int getVersion();
    method public abstract void verify(java.security.PublicKey) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
    method public abstract void verify(java.security.PublicKey, String) throws java.security.cert.CRLException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
  }

  public abstract class X509CRLEntry implements java.security.cert.X509Extension {
    ctor public X509CRLEntry();
    method public javax.security.auth.x500.X500Principal getCertificateIssuer();
    method public abstract byte[] getEncoded() throws java.security.cert.CRLException;
    method public abstract java.util.Date getRevocationDate();
    method public abstract java.math.BigInteger getSerialNumber();
    method public abstract boolean hasExtensions();
    method public abstract String toString();
  }

  public class X509CRLSelector implements java.security.cert.CRLSelector {
    ctor public X509CRLSelector();
    method public void addIssuer(javax.security.auth.x500.X500Principal);
    method public void addIssuerName(String) throws java.io.IOException;
    method public void addIssuerName(byte[]) throws java.io.IOException;
    method public Object clone();
    method public java.security.cert.X509Certificate getCertificateChecking();
    method public java.util.Date getDateAndTime();
    method public java.util.Collection<java.lang.Object> getIssuerNames();
    method public java.util.Collection<javax.security.auth.x500.X500Principal> getIssuers();
    method public java.math.BigInteger getMaxCRL();
    method public java.math.BigInteger getMinCRL();
    method public boolean match(java.security.cert.CRL);
    method public void setCertificateChecking(java.security.cert.X509Certificate);
    method public void setDateAndTime(java.util.Date);
    method public void setIssuerNames(java.util.Collection<?>) throws java.io.IOException;
    method public void setIssuers(java.util.Collection<javax.security.auth.x500.X500Principal>);
    method public void setMaxCRLNumber(java.math.BigInteger);
    method public void setMinCRLNumber(java.math.BigInteger);
  }

  public class X509CertSelector implements java.security.cert.CertSelector {
    ctor public X509CertSelector();
    method public void addPathToName(int, String) throws java.io.IOException;
    method public void addPathToName(int, byte[]) throws java.io.IOException;
    method public void addSubjectAlternativeName(int, String) throws java.io.IOException;
    method public void addSubjectAlternativeName(int, byte[]) throws java.io.IOException;
    method public Object clone();
    method public byte[] getAuthorityKeyIdentifier();
    method public int getBasicConstraints();
    method public java.security.cert.X509Certificate getCertificate();
    method public java.util.Date getCertificateValid();
    method public java.util.Set<java.lang.String> getExtendedKeyUsage();
    method public javax.security.auth.x500.X500Principal getIssuer();
    method public byte[] getIssuerAsBytes() throws java.io.IOException;
    method public String getIssuerAsString();
    method public boolean[] getKeyUsage();
    method public boolean getMatchAllSubjectAltNames();
    method public byte[] getNameConstraints();
    method public java.util.Collection<java.util.List<?>> getPathToNames();
    method public java.util.Set<java.lang.String> getPolicy();
    method public java.util.Date getPrivateKeyValid();
    method public java.math.BigInteger getSerialNumber();
    method public javax.security.auth.x500.X500Principal getSubject();
    method public java.util.Collection<java.util.List<?>> getSubjectAlternativeNames();
    method public byte[] getSubjectAsBytes() throws java.io.IOException;
    method public String getSubjectAsString();
    method public byte[] getSubjectKeyIdentifier();
    method public java.security.PublicKey getSubjectPublicKey();
    method public String getSubjectPublicKeyAlgID();
    method public boolean match(java.security.cert.Certificate);
    method public void setAuthorityKeyIdentifier(byte[]);
    method public void setBasicConstraints(int);
    method public void setCertificate(java.security.cert.X509Certificate);
    method public void setCertificateValid(java.util.Date);
    method public void setExtendedKeyUsage(java.util.Set<java.lang.String>) throws java.io.IOException;
    method public void setIssuer(javax.security.auth.x500.X500Principal);
    method public void setIssuer(String) throws java.io.IOException;
    method public void setIssuer(byte[]) throws java.io.IOException;
    method public void setKeyUsage(boolean[]);
    method public void setMatchAllSubjectAltNames(boolean);
    method public void setNameConstraints(byte[]) throws java.io.IOException;
    method public void setPathToNames(java.util.Collection<java.util.List<?>>) throws java.io.IOException;
    method public void setPolicy(java.util.Set<java.lang.String>) throws java.io.IOException;
    method public void setPrivateKeyValid(java.util.Date);
    method public void setSerialNumber(java.math.BigInteger);
    method public void setSubject(javax.security.auth.x500.X500Principal);
    method public void setSubject(String) throws java.io.IOException;
    method public void setSubject(byte[]) throws java.io.IOException;
    method public void setSubjectAlternativeNames(java.util.Collection<java.util.List<?>>) throws java.io.IOException;
    method public void setSubjectKeyIdentifier(byte[]);
    method public void setSubjectPublicKey(java.security.PublicKey);
    method public void setSubjectPublicKey(byte[]) throws java.io.IOException;
    method public void setSubjectPublicKeyAlgID(String) throws java.io.IOException;
  }

  public abstract class X509Certificate extends java.security.cert.Certificate implements java.security.cert.X509Extension {
    ctor protected X509Certificate();
    method public abstract void checkValidity() throws java.security.cert.CertificateExpiredException, java.security.cert.CertificateNotYetValidException;
    method public abstract void checkValidity(java.util.Date) throws java.security.cert.CertificateExpiredException, java.security.cert.CertificateNotYetValidException;
    method public abstract int getBasicConstraints();
    method public java.util.List<java.lang.String> getExtendedKeyUsage() throws java.security.cert.CertificateParsingException;
    method public java.util.Collection<java.util.List<?>> getIssuerAlternativeNames() throws java.security.cert.CertificateParsingException;
    method public abstract java.security.Principal getIssuerDN();
    method public abstract boolean[] getIssuerUniqueID();
    method public javax.security.auth.x500.X500Principal getIssuerX500Principal();
    method public abstract boolean[] getKeyUsage();
    method public abstract java.util.Date getNotAfter();
    method public abstract java.util.Date getNotBefore();
    method public abstract java.math.BigInteger getSerialNumber();
    method public abstract String getSigAlgName();
    method public abstract String getSigAlgOID();
    method public abstract byte[] getSigAlgParams();
    method public abstract byte[] getSignature();
    method public java.util.Collection<java.util.List<?>> getSubjectAlternativeNames() throws java.security.cert.CertificateParsingException;
    method public abstract java.security.Principal getSubjectDN();
    method public abstract boolean[] getSubjectUniqueID();
    method public javax.security.auth.x500.X500Principal getSubjectX500Principal();
    method public abstract byte[] getTBSCertificate() throws java.security.cert.CertificateEncodingException;
    method public abstract int getVersion();
  }

  public interface X509Extension {
    method public java.util.Set<java.lang.String> getCriticalExtensionOIDs();
    method public byte[] getExtensionValue(String);
    method public java.util.Set<java.lang.String> getNonCriticalExtensionOIDs();
    method public boolean hasUnsupportedCriticalExtension();
  }

}

package java.security.interfaces {

  public interface DSAKey {
    method public java.security.interfaces.DSAParams getParams();
  }

  public interface DSAKeyPairGenerator {
    method public void initialize(java.security.interfaces.DSAParams, java.security.SecureRandom) throws java.security.InvalidParameterException;
    method public void initialize(int, boolean, java.security.SecureRandom) throws java.security.InvalidParameterException;
  }

  public interface DSAParams {
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getQ();
  }

  public interface DSAPrivateKey extends java.security.interfaces.DSAKey java.security.PrivateKey {
    method public java.math.BigInteger getX();
    field public static final long serialVersionUID = 7776497482533790279L; // 0x6bebab423b256247L
  }

  public interface DSAPublicKey extends java.security.interfaces.DSAKey java.security.PublicKey {
    method public java.math.BigInteger getY();
    field public static final long serialVersionUID = 1234526332779022332L; // 0x1121eb28ab28c7fcL
  }

  public interface ECKey {
    method public java.security.spec.ECParameterSpec getParams();
  }

  public interface ECPrivateKey extends java.security.PrivateKey java.security.interfaces.ECKey {
    method public java.math.BigInteger getS();
    field public static final long serialVersionUID = -7896394956925609184L; // 0x926a5e9fa2435b20L
  }

  public interface ECPublicKey extends java.security.PublicKey java.security.interfaces.ECKey {
    method public java.security.spec.ECPoint getW();
    field public static final long serialVersionUID = -3314988629879632826L; // 0xd1fecb679990cc46L
  }

  public interface RSAKey {
    method public java.math.BigInteger getModulus();
  }

  public interface RSAMultiPrimePrivateCrtKey extends java.security.interfaces.RSAPrivateKey {
    method public java.math.BigInteger getCrtCoefficient();
    method public java.security.spec.RSAOtherPrimeInfo[] getOtherPrimeInfo();
    method public java.math.BigInteger getPrimeExponentP();
    method public java.math.BigInteger getPrimeExponentQ();
    method public java.math.BigInteger getPrimeP();
    method public java.math.BigInteger getPrimeQ();
    method public java.math.BigInteger getPublicExponent();
    field public static final long serialVersionUID = 618058533534628008L; // 0x893c8f62dbaf8a8L
  }

  public interface RSAPrivateCrtKey extends java.security.interfaces.RSAPrivateKey {
    method public java.math.BigInteger getCrtCoefficient();
    method public java.math.BigInteger getPrimeExponentP();
    method public java.math.BigInteger getPrimeExponentQ();
    method public java.math.BigInteger getPrimeP();
    method public java.math.BigInteger getPrimeQ();
    method public java.math.BigInteger getPublicExponent();
    field public static final long serialVersionUID = -5682214253527700368L; // 0xb124b83df8d1ec70L
  }

  public interface RSAPrivateKey extends java.security.PrivateKey java.security.interfaces.RSAKey {
    method public java.math.BigInteger getPrivateExponent();
    field public static final long serialVersionUID = 5187144804936595022L; // 0x47fc70b7a8c2364eL
  }

  public interface RSAPublicKey extends java.security.PublicKey java.security.interfaces.RSAKey {
    method public java.math.BigInteger getPublicExponent();
    field public static final long serialVersionUID = -8727434096241101194L; // 0x86e1ecedeceab676L
  }

}

package java.security.spec {

  public interface AlgorithmParameterSpec {
  }

  public class DSAParameterSpec implements java.security.spec.AlgorithmParameterSpec java.security.interfaces.DSAParams {
    ctor public DSAParameterSpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getQ();
  }

  public class DSAPrivateKeySpec implements java.security.spec.KeySpec {
    ctor public DSAPrivateKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getQ();
    method public java.math.BigInteger getX();
  }

  public class DSAPublicKeySpec implements java.security.spec.KeySpec {
    ctor public DSAPublicKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getQ();
    method public java.math.BigInteger getY();
  }

  public interface ECField {
    method public int getFieldSize();
  }

  public class ECFieldF2m implements java.security.spec.ECField {
    ctor public ECFieldF2m(int);
    ctor public ECFieldF2m(int, java.math.BigInteger);
    ctor public ECFieldF2m(int, int[]);
    method public int getFieldSize();
    method public int getM();
    method public int[] getMidTermsOfReductionPolynomial();
    method public java.math.BigInteger getReductionPolynomial();
  }

  public class ECFieldFp implements java.security.spec.ECField {
    ctor public ECFieldFp(java.math.BigInteger);
    method public int getFieldSize();
    method public java.math.BigInteger getP();
  }

  public class ECGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public ECGenParameterSpec(String);
    method public String getName();
  }

  public class ECParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public ECParameterSpec(java.security.spec.EllipticCurve, java.security.spec.ECPoint, java.math.BigInteger, int);
    method public int getCofactor();
    method public java.security.spec.EllipticCurve getCurve();
    method public java.security.spec.ECPoint getGenerator();
    method public java.math.BigInteger getOrder();
  }

  public class ECPoint {
    ctor public ECPoint(java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getAffineX();
    method public java.math.BigInteger getAffineY();
    field public static final java.security.spec.ECPoint POINT_INFINITY;
  }

  public class ECPrivateKeySpec implements java.security.spec.KeySpec {
    ctor public ECPrivateKeySpec(java.math.BigInteger, java.security.spec.ECParameterSpec);
    method public java.security.spec.ECParameterSpec getParams();
    method public java.math.BigInteger getS();
  }

  public class ECPublicKeySpec implements java.security.spec.KeySpec {
    ctor public ECPublicKeySpec(java.security.spec.ECPoint, java.security.spec.ECParameterSpec);
    method public java.security.spec.ECParameterSpec getParams();
    method public java.security.spec.ECPoint getW();
  }

  public class EllipticCurve {
    ctor public EllipticCurve(java.security.spec.ECField, java.math.BigInteger, java.math.BigInteger, byte[]);
    ctor public EllipticCurve(java.security.spec.ECField, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getA();
    method public java.math.BigInteger getB();
    method public java.security.spec.ECField getField();
    method public byte[] getSeed();
  }

  public abstract class EncodedKeySpec implements java.security.spec.KeySpec {
    ctor public EncodedKeySpec(byte[]);
    method public byte[] getEncoded();
    method public abstract String getFormat();
  }

  public class InvalidKeySpecException extends java.security.GeneralSecurityException {
    ctor public InvalidKeySpecException(String);
    ctor public InvalidKeySpecException();
    ctor public InvalidKeySpecException(String, Throwable);
    ctor public InvalidKeySpecException(Throwable);
  }

  public class InvalidParameterSpecException extends java.security.GeneralSecurityException {
    ctor public InvalidParameterSpecException(String);
    ctor public InvalidParameterSpecException();
  }

  public interface KeySpec {
  }

  public class MGF1ParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public MGF1ParameterSpec(String);
    method public String getDigestAlgorithm();
    field public static final java.security.spec.MGF1ParameterSpec SHA1;
    field public static final java.security.spec.MGF1ParameterSpec SHA256;
    field public static final java.security.spec.MGF1ParameterSpec SHA384;
    field public static final java.security.spec.MGF1ParameterSpec SHA512;
  }

  public class PKCS8EncodedKeySpec extends java.security.spec.EncodedKeySpec {
    ctor public PKCS8EncodedKeySpec(byte[]);
    method public final String getFormat();
  }

  public class PSSParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public PSSParameterSpec(int);
    ctor public PSSParameterSpec(String, String, java.security.spec.AlgorithmParameterSpec, int, int);
    method public String getDigestAlgorithm();
    method public String getMGFAlgorithm();
    method public java.security.spec.AlgorithmParameterSpec getMGFParameters();
    method public int getSaltLength();
    method public int getTrailerField();
    field public static final java.security.spec.PSSParameterSpec DEFAULT;
  }

  public class RSAKeyGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public RSAKeyGenParameterSpec(int, java.math.BigInteger);
    method public int getKeysize();
    method public java.math.BigInteger getPublicExponent();
    field public static final java.math.BigInteger F0;
    field public static final java.math.BigInteger F4;
  }

  public class RSAMultiPrimePrivateCrtKeySpec extends java.security.spec.RSAPrivateKeySpec {
    ctor public RSAMultiPrimePrivateCrtKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.security.spec.RSAOtherPrimeInfo[]);
    method public java.math.BigInteger getCrtCoefficient();
    method public java.security.spec.RSAOtherPrimeInfo[] getOtherPrimeInfo();
    method public java.math.BigInteger getPrimeExponentP();
    method public java.math.BigInteger getPrimeExponentQ();
    method public java.math.BigInteger getPrimeP();
    method public java.math.BigInteger getPrimeQ();
    method public java.math.BigInteger getPublicExponent();
  }

  public class RSAOtherPrimeInfo {
    ctor public RSAOtherPrimeInfo(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public final java.math.BigInteger getCrtCoefficient();
    method public final java.math.BigInteger getExponent();
    method public final java.math.BigInteger getPrime();
  }

  public class RSAPrivateCrtKeySpec extends java.security.spec.RSAPrivateKeySpec {
    ctor public RSAPrivateCrtKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getCrtCoefficient();
    method public java.math.BigInteger getPrimeExponentP();
    method public java.math.BigInteger getPrimeExponentQ();
    method public java.math.BigInteger getPrimeP();
    method public java.math.BigInteger getPrimeQ();
    method public java.math.BigInteger getPublicExponent();
  }

  public class RSAPrivateKeySpec implements java.security.spec.KeySpec {
    ctor public RSAPrivateKeySpec(java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getModulus();
    method public java.math.BigInteger getPrivateExponent();
  }

  public class RSAPublicKeySpec implements java.security.spec.KeySpec {
    ctor public RSAPublicKeySpec(java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getModulus();
    method public java.math.BigInteger getPublicExponent();
  }

  public class X509EncodedKeySpec extends java.security.spec.EncodedKeySpec {
    ctor public X509EncodedKeySpec(byte[]);
    method public final String getFormat();
  }

}

package java.sql {

  public interface Array {
    method public Object getArray() throws java.sql.SQLException;
    method public Object getArray(long, int) throws java.sql.SQLException;
    method public Object getArray(long, int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public Object getArray(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public int getBaseType() throws java.sql.SQLException;
    method public String getBaseTypeName() throws java.sql.SQLException;
    method public java.sql.ResultSet getResultSet() throws java.sql.SQLException;
    method public java.sql.ResultSet getResultSet(long, int) throws java.sql.SQLException;
    method public java.sql.ResultSet getResultSet(long, int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public java.sql.ResultSet getResultSet(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
  }

  public class BatchUpdateException extends java.sql.SQLException implements java.io.Serializable {
    ctor public BatchUpdateException();
    ctor public BatchUpdateException(int[]);
    ctor public BatchUpdateException(String, int[]);
    ctor public BatchUpdateException(String, String, int[]);
    ctor public BatchUpdateException(String, String, int, int[]);
    method public int[] getUpdateCounts();
  }

  public interface Blob {
    method public java.io.InputStream getBinaryStream() throws java.sql.SQLException;
    method public byte[] getBytes(long, int) throws java.sql.SQLException;
    method public long length() throws java.sql.SQLException;
    method public long position(java.sql.Blob, long) throws java.sql.SQLException;
    method public long position(byte[], long) throws java.sql.SQLException;
    method public java.io.OutputStream setBinaryStream(long) throws java.sql.SQLException;
    method public int setBytes(long, byte[]) throws java.sql.SQLException;
    method public int setBytes(long, byte[], int, int) throws java.sql.SQLException;
    method public void truncate(long) throws java.sql.SQLException;
  }

  public interface CallableStatement extends java.sql.PreparedStatement {
    method public java.sql.Array getArray(int) throws java.sql.SQLException;
    method public java.sql.Array getArray(String) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(String) throws java.sql.SQLException;
    method public java.sql.Blob getBlob(int) throws java.sql.SQLException;
    method public java.sql.Blob getBlob(String) throws java.sql.SQLException;
    method public boolean getBoolean(int) throws java.sql.SQLException;
    method public boolean getBoolean(String) throws java.sql.SQLException;
    method public byte getByte(int) throws java.sql.SQLException;
    method public byte getByte(String) throws java.sql.SQLException;
    method public byte[] getBytes(int) throws java.sql.SQLException;
    method public byte[] getBytes(String) throws java.sql.SQLException;
    method public java.sql.Clob getClob(int) throws java.sql.SQLException;
    method public java.sql.Clob getClob(String) throws java.sql.SQLException;
    method public java.sql.Date getDate(int) throws java.sql.SQLException;
    method public java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Date getDate(String) throws java.sql.SQLException;
    method public java.sql.Date getDate(String, java.util.Calendar) throws java.sql.SQLException;
    method public double getDouble(int) throws java.sql.SQLException;
    method public double getDouble(String) throws java.sql.SQLException;
    method public float getFloat(int) throws java.sql.SQLException;
    method public float getFloat(String) throws java.sql.SQLException;
    method public int getInt(int) throws java.sql.SQLException;
    method public int getInt(String) throws java.sql.SQLException;
    method public long getLong(int) throws java.sql.SQLException;
    method public long getLong(String) throws java.sql.SQLException;
    method public Object getObject(int) throws java.sql.SQLException;
    method public Object getObject(int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public Object getObject(String) throws java.sql.SQLException;
    method public Object getObject(String, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public java.sql.Ref getRef(int) throws java.sql.SQLException;
    method public java.sql.Ref getRef(String) throws java.sql.SQLException;
    method public short getShort(int) throws java.sql.SQLException;
    method public short getShort(String) throws java.sql.SQLException;
    method public String getString(int) throws java.sql.SQLException;
    method public String getString(String) throws java.sql.SQLException;
    method public java.sql.Time getTime(int) throws java.sql.SQLException;
    method public java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Time getTime(String) throws java.sql.SQLException;
    method public java.sql.Time getTime(String, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(String) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(String, java.util.Calendar) throws java.sql.SQLException;
    method public java.net.URL getURL(int) throws java.sql.SQLException;
    method public java.net.URL getURL(String) throws java.sql.SQLException;
    method public void registerOutParameter(int, int) throws java.sql.SQLException;
    method public void registerOutParameter(int, int, int) throws java.sql.SQLException;
    method public void registerOutParameter(int, int, String) throws java.sql.SQLException;
    method public void registerOutParameter(String, int) throws java.sql.SQLException;
    method public void registerOutParameter(String, int, int) throws java.sql.SQLException;
    method public void registerOutParameter(String, int, String) throws java.sql.SQLException;
    method public void setAsciiStream(String, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBigDecimal(String, java.math.BigDecimal) throws java.sql.SQLException;
    method public void setBinaryStream(String, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBoolean(String, boolean) throws java.sql.SQLException;
    method public void setByte(String, byte) throws java.sql.SQLException;
    method public void setBytes(String, byte[]) throws java.sql.SQLException;
    method public void setCharacterStream(String, java.io.Reader, int) throws java.sql.SQLException;
    method public void setDate(String, java.sql.Date) throws java.sql.SQLException;
    method public void setDate(String, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
    method public void setDouble(String, double) throws java.sql.SQLException;
    method public void setFloat(String, float) throws java.sql.SQLException;
    method public void setInt(String, int) throws java.sql.SQLException;
    method public void setLong(String, long) throws java.sql.SQLException;
    method public void setNull(String, int) throws java.sql.SQLException;
    method public void setNull(String, int, String) throws java.sql.SQLException;
    method public void setObject(String, Object) throws java.sql.SQLException;
    method public void setObject(String, Object, int) throws java.sql.SQLException;
    method public void setObject(String, Object, int, int) throws java.sql.SQLException;
    method public void setShort(String, short) throws java.sql.SQLException;
    method public void setString(String, String) throws java.sql.SQLException;
    method public void setTime(String, java.sql.Time) throws java.sql.SQLException;
    method public void setTime(String, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
    method public void setTimestamp(String, java.sql.Timestamp) throws java.sql.SQLException;
    method public void setTimestamp(String, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
    method public void setURL(String, java.net.URL) throws java.sql.SQLException;
    method public boolean wasNull() throws java.sql.SQLException;
  }

  public interface Clob {
    method public java.io.InputStream getAsciiStream() throws java.sql.SQLException;
    method public java.io.Reader getCharacterStream() throws java.sql.SQLException;
    method public String getSubString(long, int) throws java.sql.SQLException;
    method public long length() throws java.sql.SQLException;
    method public long position(java.sql.Clob, long) throws java.sql.SQLException;
    method public long position(String, long) throws java.sql.SQLException;
    method public java.io.OutputStream setAsciiStream(long) throws java.sql.SQLException;
    method public java.io.Writer setCharacterStream(long) throws java.sql.SQLException;
    method public int setString(long, String) throws java.sql.SQLException;
    method public int setString(long, String, int, int) throws java.sql.SQLException;
    method public void truncate(long) throws java.sql.SQLException;
  }

  public interface Connection {
    method public void clearWarnings() throws java.sql.SQLException;
    method public void close() throws java.sql.SQLException;
    method public void commit() throws java.sql.SQLException;
    method public java.sql.Statement createStatement() throws java.sql.SQLException;
    method public java.sql.Statement createStatement(int, int) throws java.sql.SQLException;
    method public java.sql.Statement createStatement(int, int, int) throws java.sql.SQLException;
    method public boolean getAutoCommit() throws java.sql.SQLException;
    method public String getCatalog() throws java.sql.SQLException;
    method public int getHoldability() throws java.sql.SQLException;
    method public java.sql.DatabaseMetaData getMetaData() throws java.sql.SQLException;
    method public int getTransactionIsolation() throws java.sql.SQLException;
    method public java.util.Map<java.lang.String,java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
    method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
    method public boolean isClosed() throws java.sql.SQLException;
    method public boolean isReadOnly() throws java.sql.SQLException;
    method public String nativeSQL(String) throws java.sql.SQLException;
    method public java.sql.CallableStatement prepareCall(String) throws java.sql.SQLException;
    method public java.sql.CallableStatement prepareCall(String, int, int) throws java.sql.SQLException;
    method public java.sql.CallableStatement prepareCall(String, int, int, int) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String, int) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String, int[]) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String, int, int) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String, int, int, int) throws java.sql.SQLException;
    method public java.sql.PreparedStatement prepareStatement(String, String[]) throws java.sql.SQLException;
    method public void releaseSavepoint(java.sql.Savepoint) throws java.sql.SQLException;
    method public void rollback() throws java.sql.SQLException;
    method public void rollback(java.sql.Savepoint) throws java.sql.SQLException;
    method public void setAutoCommit(boolean) throws java.sql.SQLException;
    method public void setCatalog(String) throws java.sql.SQLException;
    method public void setHoldability(int) throws java.sql.SQLException;
    method public void setReadOnly(boolean) throws java.sql.SQLException;
    method public java.sql.Savepoint setSavepoint() throws java.sql.SQLException;
    method public java.sql.Savepoint setSavepoint(String) throws java.sql.SQLException;
    method public void setTransactionIsolation(int) throws java.sql.SQLException;
    method public void setTypeMap(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    field public static final int TRANSACTION_NONE = 0; // 0x0
    field public static final int TRANSACTION_READ_COMMITTED = 2; // 0x2
    field public static final int TRANSACTION_READ_UNCOMMITTED = 1; // 0x1
    field public static final int TRANSACTION_REPEATABLE_READ = 4; // 0x4
    field public static final int TRANSACTION_SERIALIZABLE = 8; // 0x8
  }

  public class DataTruncation extends java.sql.SQLWarning implements java.io.Serializable {
    ctor public DataTruncation(int, boolean, boolean, int, int);
    method public int getDataSize();
    method public int getIndex();
    method public boolean getParameter();
    method public boolean getRead();
    method public int getTransferSize();
  }

  public interface DatabaseMetaData {
    method public boolean allProceduresAreCallable() throws java.sql.SQLException;
    method public boolean allTablesAreSelectable() throws java.sql.SQLException;
    method public boolean dataDefinitionCausesTransactionCommit() throws java.sql.SQLException;
    method public boolean dataDefinitionIgnoredInTransactions() throws java.sql.SQLException;
    method public boolean deletesAreDetected(int) throws java.sql.SQLException;
    method public boolean doesMaxRowSizeIncludeBlobs() throws java.sql.SQLException;
    method public java.sql.ResultSet getAttributes(String, String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getBestRowIdentifier(String, String, String, int, boolean) throws java.sql.SQLException;
    method public String getCatalogSeparator() throws java.sql.SQLException;
    method public String getCatalogTerm() throws java.sql.SQLException;
    method public java.sql.ResultSet getCatalogs() throws java.sql.SQLException;
    method public java.sql.ResultSet getColumnPrivileges(String, String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getColumns(String, String, String, String) throws java.sql.SQLException;
    method public java.sql.Connection getConnection() throws java.sql.SQLException;
    method public java.sql.ResultSet getCrossReference(String, String, String, String, String, String) throws java.sql.SQLException;
    method public int getDatabaseMajorVersion() throws java.sql.SQLException;
    method public int getDatabaseMinorVersion() throws java.sql.SQLException;
    method public String getDatabaseProductName() throws java.sql.SQLException;
    method public String getDatabaseProductVersion() throws java.sql.SQLException;
    method public int getDefaultTransactionIsolation() throws java.sql.SQLException;
    method public int getDriverMajorVersion();
    method public int getDriverMinorVersion();
    method public String getDriverName() throws java.sql.SQLException;
    method public String getDriverVersion() throws java.sql.SQLException;
    method public java.sql.ResultSet getExportedKeys(String, String, String) throws java.sql.SQLException;
    method public String getExtraNameCharacters() throws java.sql.SQLException;
    method public String getIdentifierQuoteString() throws java.sql.SQLException;
    method public java.sql.ResultSet getImportedKeys(String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getIndexInfo(String, String, String, boolean, boolean) throws java.sql.SQLException;
    method public int getJDBCMajorVersion() throws java.sql.SQLException;
    method public int getJDBCMinorVersion() throws java.sql.SQLException;
    method public int getMaxBinaryLiteralLength() throws java.sql.SQLException;
    method public int getMaxCatalogNameLength() throws java.sql.SQLException;
    method public int getMaxCharLiteralLength() throws java.sql.SQLException;
    method public int getMaxColumnNameLength() throws java.sql.SQLException;
    method public int getMaxColumnsInGroupBy() throws java.sql.SQLException;
    method public int getMaxColumnsInIndex() throws java.sql.SQLException;
    method public int getMaxColumnsInOrderBy() throws java.sql.SQLException;
    method public int getMaxColumnsInSelect() throws java.sql.SQLException;
    method public int getMaxColumnsInTable() throws java.sql.SQLException;
    method public int getMaxConnections() throws java.sql.SQLException;
    method public int getMaxCursorNameLength() throws java.sql.SQLException;
    method public int getMaxIndexLength() throws java.sql.SQLException;
    method public int getMaxProcedureNameLength() throws java.sql.SQLException;
    method public int getMaxRowSize() throws java.sql.SQLException;
    method public int getMaxSchemaNameLength() throws java.sql.SQLException;
    method public int getMaxStatementLength() throws java.sql.SQLException;
    method public int getMaxStatements() throws java.sql.SQLException;
    method public int getMaxTableNameLength() throws java.sql.SQLException;
    method public int getMaxTablesInSelect() throws java.sql.SQLException;
    method public int getMaxUserNameLength() throws java.sql.SQLException;
    method public String getNumericFunctions() throws java.sql.SQLException;
    method public java.sql.ResultSet getPrimaryKeys(String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getProcedureColumns(String, String, String, String) throws java.sql.SQLException;
    method public String getProcedureTerm() throws java.sql.SQLException;
    method public java.sql.ResultSet getProcedures(String, String, String) throws java.sql.SQLException;
    method public int getResultSetHoldability() throws java.sql.SQLException;
    method public String getSQLKeywords() throws java.sql.SQLException;
    method public int getSQLStateType() throws java.sql.SQLException;
    method public String getSchemaTerm() throws java.sql.SQLException;
    method public java.sql.ResultSet getSchemas() throws java.sql.SQLException;
    method public String getSearchStringEscape() throws java.sql.SQLException;
    method public String getStringFunctions() throws java.sql.SQLException;
    method public java.sql.ResultSet getSuperTables(String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getSuperTypes(String, String, String) throws java.sql.SQLException;
    method public String getSystemFunctions() throws java.sql.SQLException;
    method public java.sql.ResultSet getTablePrivileges(String, String, String) throws java.sql.SQLException;
    method public java.sql.ResultSet getTableTypes() throws java.sql.SQLException;
    method public java.sql.ResultSet getTables(String, String, String, String[]) throws java.sql.SQLException;
    method public String getTimeDateFunctions() throws java.sql.SQLException;
    method public java.sql.ResultSet getTypeInfo() throws java.sql.SQLException;
    method public java.sql.ResultSet getUDTs(String, String, String, int[]) throws java.sql.SQLException;
    method public String getURL() throws java.sql.SQLException;
    method public String getUserName() throws java.sql.SQLException;
    method public java.sql.ResultSet getVersionColumns(String, String, String) throws java.sql.SQLException;
    method public boolean insertsAreDetected(int) throws java.sql.SQLException;
    method public boolean isCatalogAtStart() throws java.sql.SQLException;
    method public boolean isReadOnly() throws java.sql.SQLException;
    method public boolean locatorsUpdateCopy() throws java.sql.SQLException;
    method public boolean nullPlusNonNullIsNull() throws java.sql.SQLException;
    method public boolean nullsAreSortedAtEnd() throws java.sql.SQLException;
    method public boolean nullsAreSortedAtStart() throws java.sql.SQLException;
    method public boolean nullsAreSortedHigh() throws java.sql.SQLException;
    method public boolean nullsAreSortedLow() throws java.sql.SQLException;
    method public boolean othersDeletesAreVisible(int) throws java.sql.SQLException;
    method public boolean othersInsertsAreVisible(int) throws java.sql.SQLException;
    method public boolean othersUpdatesAreVisible(int) throws java.sql.SQLException;
    method public boolean ownDeletesAreVisible(int) throws java.sql.SQLException;
    method public boolean ownInsertsAreVisible(int) throws java.sql.SQLException;
    method public boolean ownUpdatesAreVisible(int) throws java.sql.SQLException;
    method public boolean storesLowerCaseIdentifiers() throws java.sql.SQLException;
    method public boolean storesLowerCaseQuotedIdentifiers() throws java.sql.SQLException;
    method public boolean storesMixedCaseIdentifiers() throws java.sql.SQLException;
    method public boolean storesMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
    method public boolean storesUpperCaseIdentifiers() throws java.sql.SQLException;
    method public boolean storesUpperCaseQuotedIdentifiers() throws java.sql.SQLException;
    method public boolean supportsANSI92EntryLevelSQL() throws java.sql.SQLException;
    method public boolean supportsANSI92FullSQL() throws java.sql.SQLException;
    method public boolean supportsANSI92IntermediateSQL() throws java.sql.SQLException;
    method public boolean supportsAlterTableWithAddColumn() throws java.sql.SQLException;
    method public boolean supportsAlterTableWithDropColumn() throws java.sql.SQLException;
    method public boolean supportsBatchUpdates() throws java.sql.SQLException;
    method public boolean supportsCatalogsInDataManipulation() throws java.sql.SQLException;
    method public boolean supportsCatalogsInIndexDefinitions() throws java.sql.SQLException;
    method public boolean supportsCatalogsInPrivilegeDefinitions() throws java.sql.SQLException;
    method public boolean supportsCatalogsInProcedureCalls() throws java.sql.SQLException;
    method public boolean supportsCatalogsInTableDefinitions() throws java.sql.SQLException;
    method public boolean supportsColumnAliasing() throws java.sql.SQLException;
    method public boolean supportsConvert() throws java.sql.SQLException;
    method public boolean supportsConvert(int, int) throws java.sql.SQLException;
    method public boolean supportsCoreSQLGrammar() throws java.sql.SQLException;
    method public boolean supportsCorrelatedSubqueries() throws java.sql.SQLException;
    method public boolean supportsDataDefinitionAndDataManipulationTransactions() throws java.sql.SQLException;
    method public boolean supportsDataManipulationTransactionsOnly() throws java.sql.SQLException;
    method public boolean supportsDifferentTableCorrelationNames() throws java.sql.SQLException;
    method public boolean supportsExpressionsInOrderBy() throws java.sql.SQLException;
    method public boolean supportsExtendedSQLGrammar() throws java.sql.SQLException;
    method public boolean supportsFullOuterJoins() throws java.sql.SQLException;
    method public boolean supportsGetGeneratedKeys() throws java.sql.SQLException;
    method public boolean supportsGroupBy() throws java.sql.SQLException;
    method public boolean supportsGroupByBeyondSelect() throws java.sql.SQLException;
    method public boolean supportsGroupByUnrelated() throws java.sql.SQLException;
    method public boolean supportsIntegrityEnhancementFacility() throws java.sql.SQLException;
    method public boolean supportsLikeEscapeClause() throws java.sql.SQLException;
    method public boolean supportsLimitedOuterJoins() throws java.sql.SQLException;
    method public boolean supportsMinimumSQLGrammar() throws java.sql.SQLException;
    method public boolean supportsMixedCaseIdentifiers() throws java.sql.SQLException;
    method public boolean supportsMixedCaseQuotedIdentifiers() throws java.sql.SQLException;
    method public boolean supportsMultipleOpenResults() throws java.sql.SQLException;
    method public boolean supportsMultipleResultSets() throws java.sql.SQLException;
    method public boolean supportsMultipleTransactions() throws java.sql.SQLException;
    method public boolean supportsNamedParameters() throws java.sql.SQLException;
    method public boolean supportsNonNullableColumns() throws java.sql.SQLException;
    method public boolean supportsOpenCursorsAcrossCommit() throws java.sql.SQLException;
    method public boolean supportsOpenCursorsAcrossRollback() throws java.sql.SQLException;
    method public boolean supportsOpenStatementsAcrossCommit() throws java.sql.SQLException;
    method public boolean supportsOpenStatementsAcrossRollback() throws java.sql.SQLException;
    method public boolean supportsOrderByUnrelated() throws java.sql.SQLException;
    method public boolean supportsOuterJoins() throws java.sql.SQLException;
    method public boolean supportsPositionedDelete() throws java.sql.SQLException;
    method public boolean supportsPositionedUpdate() throws java.sql.SQLException;
    method public boolean supportsResultSetConcurrency(int, int) throws java.sql.SQLException;
    method public boolean supportsResultSetHoldability(int) throws java.sql.SQLException;
    method public boolean supportsResultSetType(int) throws java.sql.SQLException;
    method public boolean supportsSavepoints() throws java.sql.SQLException;
    method public boolean supportsSchemasInDataManipulation() throws java.sql.SQLException;
    method public boolean supportsSchemasInIndexDefinitions() throws java.sql.SQLException;
    method public boolean supportsSchemasInPrivilegeDefinitions() throws java.sql.SQLException;
    method public boolean supportsSchemasInProcedureCalls() throws java.sql.SQLException;
    method public boolean supportsSchemasInTableDefinitions() throws java.sql.SQLException;
    method public boolean supportsSelectForUpdate() throws java.sql.SQLException;
    method public boolean supportsStatementPooling() throws java.sql.SQLException;
    method public boolean supportsStoredProcedures() throws java.sql.SQLException;
    method public boolean supportsSubqueriesInComparisons() throws java.sql.SQLException;
    method public boolean supportsSubqueriesInExists() throws java.sql.SQLException;
    method public boolean supportsSubqueriesInIns() throws java.sql.SQLException;
    method public boolean supportsSubqueriesInQuantifieds() throws java.sql.SQLException;
    method public boolean supportsTableCorrelationNames() throws java.sql.SQLException;
    method public boolean supportsTransactionIsolationLevel(int) throws java.sql.SQLException;
    method public boolean supportsTransactions() throws java.sql.SQLException;
    method public boolean supportsUnion() throws java.sql.SQLException;
    method public boolean supportsUnionAll() throws java.sql.SQLException;
    method public boolean updatesAreDetected(int) throws java.sql.SQLException;
    method public boolean usesLocalFilePerTable() throws java.sql.SQLException;
    method public boolean usesLocalFiles() throws java.sql.SQLException;
    field public static final short attributeNoNulls = 0; // 0x0
    field public static final short attributeNullable = 1; // 0x1
    field public static final short attributeNullableUnknown = 2; // 0x2
    field public static final int bestRowNotPseudo = 1; // 0x1
    field public static final int bestRowPseudo = 2; // 0x2
    field public static final int bestRowSession = 2; // 0x2
    field public static final int bestRowTemporary = 0; // 0x0
    field public static final int bestRowTransaction = 1; // 0x1
    field public static final int bestRowUnknown = 0; // 0x0
    field public static final int columnNoNulls = 0; // 0x0
    field public static final int columnNullable = 1; // 0x1
    field public static final int columnNullableUnknown = 2; // 0x2
    field public static final int importedKeyCascade = 0; // 0x0
    field public static final int importedKeyInitiallyDeferred = 5; // 0x5
    field public static final int importedKeyInitiallyImmediate = 6; // 0x6
    field public static final int importedKeyNoAction = 3; // 0x3
    field public static final int importedKeyNotDeferrable = 7; // 0x7
    field public static final int importedKeyRestrict = 1; // 0x1
    field public static final int importedKeySetDefault = 4; // 0x4
    field public static final int importedKeySetNull = 2; // 0x2
    field public static final int procedureColumnIn = 1; // 0x1
    field public static final int procedureColumnInOut = 2; // 0x2
    field public static final int procedureColumnOut = 4; // 0x4
    field public static final int procedureColumnResult = 3; // 0x3
    field public static final int procedureColumnReturn = 5; // 0x5
    field public static final int procedureColumnUnknown = 0; // 0x0
    field public static final int procedureNoNulls = 0; // 0x0
    field public static final int procedureNoResult = 1; // 0x1
    field public static final int procedureNullable = 1; // 0x1
    field public static final int procedureNullableUnknown = 2; // 0x2
    field public static final int procedureResultUnknown = 0; // 0x0
    field public static final int procedureReturnsResult = 2; // 0x2
    field public static final int sqlStateSQL99 = 2; // 0x2
    field public static final int sqlStateXOpen = 1; // 0x1
    field public static final short tableIndexClustered = 1; // 0x1
    field public static final short tableIndexHashed = 2; // 0x2
    field public static final short tableIndexOther = 3; // 0x3
    field public static final short tableIndexStatistic = 0; // 0x0
    field public static final int typeNoNulls = 0; // 0x0
    field public static final int typeNullable = 1; // 0x1
    field public static final int typeNullableUnknown = 2; // 0x2
    field public static final int typePredBasic = 2; // 0x2
    field public static final int typePredChar = 1; // 0x1
    field public static final int typePredNone = 0; // 0x0
    field public static final int typeSearchable = 3; // 0x3
    field public static final int versionColumnNotPseudo = 1; // 0x1
    field public static final int versionColumnPseudo = 2; // 0x2
    field public static final int versionColumnUnknown = 0; // 0x0
  }

  public class Date extends java.util.Date {
    ctor public Date(int, int, int);
    ctor public Date(long);
    method public static java.sql.Date valueOf(String);
  }

  public interface Driver {
    method public boolean acceptsURL(String) throws java.sql.SQLException;
    method public java.sql.Connection connect(String, java.util.Properties) throws java.sql.SQLException;
    method public int getMajorVersion();
    method public int getMinorVersion();
    method public java.sql.DriverPropertyInfo[] getPropertyInfo(String, java.util.Properties) throws java.sql.SQLException;
    method public boolean jdbcCompliant();
  }

  public class DriverManager {
    method public static void deregisterDriver(java.sql.Driver) throws java.sql.SQLException;
    method public static java.sql.Connection getConnection(String) throws java.sql.SQLException;
    method public static java.sql.Connection getConnection(String, java.util.Properties) throws java.sql.SQLException;
    method public static java.sql.Connection getConnection(String, String, String) throws java.sql.SQLException;
    method public static java.sql.Driver getDriver(String) throws java.sql.SQLException;
    method public static java.util.Enumeration<java.sql.Driver> getDrivers();
    method public static java.io.PrintStream getLogStream();
    method public static java.io.PrintWriter getLogWriter();
    method public static int getLoginTimeout();
    method public static void println(String);
    method public static void registerDriver(java.sql.Driver) throws java.sql.SQLException;
    method public static void setLogStream(java.io.PrintStream);
    method public static void setLogWriter(java.io.PrintWriter);
    method public static void setLoginTimeout(int);
  }

  public class DriverPropertyInfo {
    ctor public DriverPropertyInfo(String, String);
    field public String[] choices;
    field public String description;
    field public String name;
    field public boolean required;
    field public String value;
  }

  public interface ParameterMetaData {
    method public String getParameterClassName(int) throws java.sql.SQLException;
    method public int getParameterCount() throws java.sql.SQLException;
    method public int getParameterMode(int) throws java.sql.SQLException;
    method public int getParameterType(int) throws java.sql.SQLException;
    method public String getParameterTypeName(int) throws java.sql.SQLException;
    method public int getPrecision(int) throws java.sql.SQLException;
    method public int getScale(int) throws java.sql.SQLException;
    method public int isNullable(int) throws java.sql.SQLException;
    method public boolean isSigned(int) throws java.sql.SQLException;
    field public static final int parameterModeIn = 1; // 0x1
    field public static final int parameterModeInOut = 2; // 0x2
    field public static final int parameterModeOut = 4; // 0x4
    field public static final int parameterModeUnknown = 0; // 0x0
    field public static final int parameterNoNulls = 0; // 0x0
    field public static final int parameterNullable = 1; // 0x1
    field public static final int parameterNullableUnknown = 2; // 0x2
  }

  public interface PreparedStatement extends java.sql.Statement {
    method public void addBatch() throws java.sql.SQLException;
    method public void clearParameters() throws java.sql.SQLException;
    method public boolean execute() throws java.sql.SQLException;
    method public java.sql.ResultSet executeQuery() throws java.sql.SQLException;
    method public int executeUpdate() throws java.sql.SQLException;
    method public java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
    method public java.sql.ParameterMetaData getParameterMetaData() throws java.sql.SQLException;
    method public void setArray(int, java.sql.Array) throws java.sql.SQLException;
    method public void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
    method public void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
    method public void setBoolean(int, boolean) throws java.sql.SQLException;
    method public void setByte(int, byte) throws java.sql.SQLException;
    method public void setBytes(int, byte[]) throws java.sql.SQLException;
    method public void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
    method public void setClob(int, java.sql.Clob) throws java.sql.SQLException;
    method public void setDate(int, java.sql.Date) throws java.sql.SQLException;
    method public void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
    method public void setDouble(int, double) throws java.sql.SQLException;
    method public void setFloat(int, float) throws java.sql.SQLException;
    method public void setInt(int, int) throws java.sql.SQLException;
    method public void setLong(int, long) throws java.sql.SQLException;
    method public void setNull(int, int) throws java.sql.SQLException;
    method public void setNull(int, int, String) throws java.sql.SQLException;
    method public void setObject(int, Object) throws java.sql.SQLException;
    method public void setObject(int, Object, int) throws java.sql.SQLException;
    method public void setObject(int, Object, int, int) throws java.sql.SQLException;
    method public void setRef(int, java.sql.Ref) throws java.sql.SQLException;
    method public void setShort(int, short) throws java.sql.SQLException;
    method public void setString(int, String) throws java.sql.SQLException;
    method public void setTime(int, java.sql.Time) throws java.sql.SQLException;
    method public void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
    method public void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
    method public void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
    method public void setURL(int, java.net.URL) throws java.sql.SQLException;
    method public void setUnicodeStream(int, java.io.InputStream, int) throws java.sql.SQLException;
  }

  public interface Ref {
    method public String getBaseTypeName() throws java.sql.SQLException;
    method public Object getObject() throws java.sql.SQLException;
    method public Object getObject(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public void setObject(Object) throws java.sql.SQLException;
  }

  public interface ResultSet {
    method public boolean absolute(int) throws java.sql.SQLException;
    method public void afterLast() throws java.sql.SQLException;
    method public void beforeFirst() throws java.sql.SQLException;
    method public void cancelRowUpdates() throws java.sql.SQLException;
    method public void clearWarnings() throws java.sql.SQLException;
    method public void close() throws java.sql.SQLException;
    method public void deleteRow() throws java.sql.SQLException;
    method public int findColumn(String) throws java.sql.SQLException;
    method public boolean first() throws java.sql.SQLException;
    method public java.sql.Array getArray(int) throws java.sql.SQLException;
    method public java.sql.Array getArray(String) throws java.sql.SQLException;
    method public java.io.InputStream getAsciiStream(int) throws java.sql.SQLException;
    method public java.io.InputStream getAsciiStream(String) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(int) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(int, int) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(String) throws java.sql.SQLException;
    method public java.math.BigDecimal getBigDecimal(String, int) throws java.sql.SQLException;
    method public java.io.InputStream getBinaryStream(int) throws java.sql.SQLException;
    method public java.io.InputStream getBinaryStream(String) throws java.sql.SQLException;
    method public java.sql.Blob getBlob(int) throws java.sql.SQLException;
    method public java.sql.Blob getBlob(String) throws java.sql.SQLException;
    method public boolean getBoolean(int) throws java.sql.SQLException;
    method public boolean getBoolean(String) throws java.sql.SQLException;
    method public byte getByte(int) throws java.sql.SQLException;
    method public byte getByte(String) throws java.sql.SQLException;
    method public byte[] getBytes(int) throws java.sql.SQLException;
    method public byte[] getBytes(String) throws java.sql.SQLException;
    method public java.io.Reader getCharacterStream(int) throws java.sql.SQLException;
    method public java.io.Reader getCharacterStream(String) throws java.sql.SQLException;
    method public java.sql.Clob getClob(int) throws java.sql.SQLException;
    method public java.sql.Clob getClob(String) throws java.sql.SQLException;
    method public int getConcurrency() throws java.sql.SQLException;
    method public String getCursorName() throws java.sql.SQLException;
    method public java.sql.Date getDate(int) throws java.sql.SQLException;
    method public java.sql.Date getDate(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Date getDate(String) throws java.sql.SQLException;
    method public java.sql.Date getDate(String, java.util.Calendar) throws java.sql.SQLException;
    method public double getDouble(int) throws java.sql.SQLException;
    method public double getDouble(String) throws java.sql.SQLException;
    method public int getFetchDirection() throws java.sql.SQLException;
    method public int getFetchSize() throws java.sql.SQLException;
    method public float getFloat(int) throws java.sql.SQLException;
    method public float getFloat(String) throws java.sql.SQLException;
    method public int getInt(int) throws java.sql.SQLException;
    method public int getInt(String) throws java.sql.SQLException;
    method public long getLong(int) throws java.sql.SQLException;
    method public long getLong(String) throws java.sql.SQLException;
    method public java.sql.ResultSetMetaData getMetaData() throws java.sql.SQLException;
    method public Object getObject(int) throws java.sql.SQLException;
    method public Object getObject(int, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public Object getObject(String) throws java.sql.SQLException;
    method public Object getObject(String, java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public java.sql.Ref getRef(int) throws java.sql.SQLException;
    method public java.sql.Ref getRef(String) throws java.sql.SQLException;
    method public int getRow() throws java.sql.SQLException;
    method public short getShort(int) throws java.sql.SQLException;
    method public short getShort(String) throws java.sql.SQLException;
    method public java.sql.Statement getStatement() throws java.sql.SQLException;
    method public String getString(int) throws java.sql.SQLException;
    method public String getString(String) throws java.sql.SQLException;
    method public java.sql.Time getTime(int) throws java.sql.SQLException;
    method public java.sql.Time getTime(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Time getTime(String) throws java.sql.SQLException;
    method public java.sql.Time getTime(String, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(int) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(int, java.util.Calendar) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(String) throws java.sql.SQLException;
    method public java.sql.Timestamp getTimestamp(String, java.util.Calendar) throws java.sql.SQLException;
    method public int getType() throws java.sql.SQLException;
    method public java.net.URL getURL(int) throws java.sql.SQLException;
    method public java.net.URL getURL(String) throws java.sql.SQLException;
    method public java.io.InputStream getUnicodeStream(int) throws java.sql.SQLException;
    method public java.io.InputStream getUnicodeStream(String) throws java.sql.SQLException;
    method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
    method public void insertRow() throws java.sql.SQLException;
    method public boolean isAfterLast() throws java.sql.SQLException;
    method public boolean isBeforeFirst() throws java.sql.SQLException;
    method public boolean isFirst() throws java.sql.SQLException;
    method public boolean isLast() throws java.sql.SQLException;
    method public boolean last() throws java.sql.SQLException;
    method public void moveToCurrentRow() throws java.sql.SQLException;
    method public void moveToInsertRow() throws java.sql.SQLException;
    method public boolean next() throws java.sql.SQLException;
    method public boolean previous() throws java.sql.SQLException;
    method public void refreshRow() throws java.sql.SQLException;
    method public boolean relative(int) throws java.sql.SQLException;
    method public boolean rowDeleted() throws java.sql.SQLException;
    method public boolean rowInserted() throws java.sql.SQLException;
    method public boolean rowUpdated() throws java.sql.SQLException;
    method public void setFetchDirection(int) throws java.sql.SQLException;
    method public void setFetchSize(int) throws java.sql.SQLException;
    method public void updateArray(int, java.sql.Array) throws java.sql.SQLException;
    method public void updateArray(String, java.sql.Array) throws java.sql.SQLException;
    method public void updateAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void updateAsciiStream(String, java.io.InputStream, int) throws java.sql.SQLException;
    method public void updateBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
    method public void updateBigDecimal(String, java.math.BigDecimal) throws java.sql.SQLException;
    method public void updateBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void updateBinaryStream(String, java.io.InputStream, int) throws java.sql.SQLException;
    method public void updateBlob(int, java.sql.Blob) throws java.sql.SQLException;
    method public void updateBlob(String, java.sql.Blob) throws java.sql.SQLException;
    method public void updateBoolean(int, boolean) throws java.sql.SQLException;
    method public void updateBoolean(String, boolean) throws java.sql.SQLException;
    method public void updateByte(int, byte) throws java.sql.SQLException;
    method public void updateByte(String, byte) throws java.sql.SQLException;
    method public void updateBytes(int, byte[]) throws java.sql.SQLException;
    method public void updateBytes(String, byte[]) throws java.sql.SQLException;
    method public void updateCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
    method public void updateCharacterStream(String, java.io.Reader, int) throws java.sql.SQLException;
    method public void updateClob(int, java.sql.Clob) throws java.sql.SQLException;
    method public void updateClob(String, java.sql.Clob) throws java.sql.SQLException;
    method public void updateDate(int, java.sql.Date) throws java.sql.SQLException;
    method public void updateDate(String, java.sql.Date) throws java.sql.SQLException;
    method public void updateDouble(int, double) throws java.sql.SQLException;
    method public void updateDouble(String, double) throws java.sql.SQLException;
    method public void updateFloat(int, float) throws java.sql.SQLException;
    method public void updateFloat(String, float) throws java.sql.SQLException;
    method public void updateInt(int, int) throws java.sql.SQLException;
    method public void updateInt(String, int) throws java.sql.SQLException;
    method public void updateLong(int, long) throws java.sql.SQLException;
    method public void updateLong(String, long) throws java.sql.SQLException;
    method public void updateNull(int) throws java.sql.SQLException;
    method public void updateNull(String) throws java.sql.SQLException;
    method public void updateObject(int, Object) throws java.sql.SQLException;
    method public void updateObject(int, Object, int) throws java.sql.SQLException;
    method public void updateObject(String, Object) throws java.sql.SQLException;
    method public void updateObject(String, Object, int) throws java.sql.SQLException;
    method public void updateRef(int, java.sql.Ref) throws java.sql.SQLException;
    method public void updateRef(String, java.sql.Ref) throws java.sql.SQLException;
    method public void updateRow() throws java.sql.SQLException;
    method public void updateShort(int, short) throws java.sql.SQLException;
    method public void updateShort(String, short) throws java.sql.SQLException;
    method public void updateString(int, String) throws java.sql.SQLException;
    method public void updateString(String, String) throws java.sql.SQLException;
    method public void updateTime(int, java.sql.Time) throws java.sql.SQLException;
    method public void updateTime(String, java.sql.Time) throws java.sql.SQLException;
    method public void updateTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
    method public void updateTimestamp(String, java.sql.Timestamp) throws java.sql.SQLException;
    method public boolean wasNull() throws java.sql.SQLException;
    field public static final int CLOSE_CURSORS_AT_COMMIT = 2; // 0x2
    field public static final int CONCUR_READ_ONLY = 1007; // 0x3ef
    field public static final int CONCUR_UPDATABLE = 1008; // 0x3f0
    field public static final int FETCH_FORWARD = 1000; // 0x3e8
    field public static final int FETCH_REVERSE = 1001; // 0x3e9
    field public static final int FETCH_UNKNOWN = 1002; // 0x3ea
    field public static final int HOLD_CURSORS_OVER_COMMIT = 1; // 0x1
    field public static final int TYPE_FORWARD_ONLY = 1003; // 0x3eb
    field public static final int TYPE_SCROLL_INSENSITIVE = 1004; // 0x3ec
    field public static final int TYPE_SCROLL_SENSITIVE = 1005; // 0x3ed
  }

  public interface ResultSetMetaData {
    method public String getCatalogName(int) throws java.sql.SQLException;
    method public String getColumnClassName(int) throws java.sql.SQLException;
    method public int getColumnCount() throws java.sql.SQLException;
    method public int getColumnDisplaySize(int) throws java.sql.SQLException;
    method public String getColumnLabel(int) throws java.sql.SQLException;
    method public String getColumnName(int) throws java.sql.SQLException;
    method public int getColumnType(int) throws java.sql.SQLException;
    method public String getColumnTypeName(int) throws java.sql.SQLException;
    method public int getPrecision(int) throws java.sql.SQLException;
    method public int getScale(int) throws java.sql.SQLException;
    method public String getSchemaName(int) throws java.sql.SQLException;
    method public String getTableName(int) throws java.sql.SQLException;
    method public boolean isAutoIncrement(int) throws java.sql.SQLException;
    method public boolean isCaseSensitive(int) throws java.sql.SQLException;
    method public boolean isCurrency(int) throws java.sql.SQLException;
    method public boolean isDefinitelyWritable(int) throws java.sql.SQLException;
    method public int isNullable(int) throws java.sql.SQLException;
    method public boolean isReadOnly(int) throws java.sql.SQLException;
    method public boolean isSearchable(int) throws java.sql.SQLException;
    method public boolean isSigned(int) throws java.sql.SQLException;
    method public boolean isWritable(int) throws java.sql.SQLException;
    field public static final int columnNoNulls = 0; // 0x0
    field public static final int columnNullable = 1; // 0x1
    field public static final int columnNullableUnknown = 2; // 0x2
  }

  public interface SQLData {
    method public String getSQLTypeName() throws java.sql.SQLException;
    method public void readSQL(java.sql.SQLInput, String) throws java.sql.SQLException;
    method public void writeSQL(java.sql.SQLOutput) throws java.sql.SQLException;
  }

  public class SQLException extends java.lang.Exception implements java.io.Serializable {
    ctor public SQLException();
    ctor public SQLException(String);
    ctor public SQLException(String, String);
    ctor public SQLException(String, String, int);
    method public int getErrorCode();
    method public java.sql.SQLException getNextException();
    method public String getSQLState();
    method public void setNextException(java.sql.SQLException);
  }

  public interface SQLInput {
    method public java.sql.Array readArray() throws java.sql.SQLException;
    method public java.io.InputStream readAsciiStream() throws java.sql.SQLException;
    method public java.math.BigDecimal readBigDecimal() throws java.sql.SQLException;
    method public java.io.InputStream readBinaryStream() throws java.sql.SQLException;
    method public java.sql.Blob readBlob() throws java.sql.SQLException;
    method public boolean readBoolean() throws java.sql.SQLException;
    method public byte readByte() throws java.sql.SQLException;
    method public byte[] readBytes() throws java.sql.SQLException;
    method public java.io.Reader readCharacterStream() throws java.sql.SQLException;
    method public java.sql.Clob readClob() throws java.sql.SQLException;
    method public java.sql.Date readDate() throws java.sql.SQLException;
    method public double readDouble() throws java.sql.SQLException;
    method public float readFloat() throws java.sql.SQLException;
    method public int readInt() throws java.sql.SQLException;
    method public long readLong() throws java.sql.SQLException;
    method public Object readObject() throws java.sql.SQLException;
    method public java.sql.Ref readRef() throws java.sql.SQLException;
    method public short readShort() throws java.sql.SQLException;
    method public String readString() throws java.sql.SQLException;
    method public java.sql.Time readTime() throws java.sql.SQLException;
    method public java.sql.Timestamp readTimestamp() throws java.sql.SQLException;
    method public java.net.URL readURL() throws java.sql.SQLException;
    method public boolean wasNull() throws java.sql.SQLException;
  }

  public interface SQLOutput {
    method public void writeArray(java.sql.Array) throws java.sql.SQLException;
    method public void writeAsciiStream(java.io.InputStream) throws java.sql.SQLException;
    method public void writeBigDecimal(java.math.BigDecimal) throws java.sql.SQLException;
    method public void writeBinaryStream(java.io.InputStream) throws java.sql.SQLException;
    method public void writeBlob(java.sql.Blob) throws java.sql.SQLException;
    method public void writeBoolean(boolean) throws java.sql.SQLException;
    method public void writeByte(byte) throws java.sql.SQLException;
    method public void writeBytes(byte[]) throws java.sql.SQLException;
    method public void writeCharacterStream(java.io.Reader) throws java.sql.SQLException;
    method public void writeClob(java.sql.Clob) throws java.sql.SQLException;
    method public void writeDate(java.sql.Date) throws java.sql.SQLException;
    method public void writeDouble(double) throws java.sql.SQLException;
    method public void writeFloat(float) throws java.sql.SQLException;
    method public void writeInt(int) throws java.sql.SQLException;
    method public void writeLong(long) throws java.sql.SQLException;
    method public void writeObject(java.sql.SQLData) throws java.sql.SQLException;
    method public void writeRef(java.sql.Ref) throws java.sql.SQLException;
    method public void writeShort(short) throws java.sql.SQLException;
    method public void writeString(String) throws java.sql.SQLException;
    method public void writeStruct(java.sql.Struct) throws java.sql.SQLException;
    method public void writeTime(java.sql.Time) throws java.sql.SQLException;
    method public void writeTimestamp(java.sql.Timestamp) throws java.sql.SQLException;
    method public void writeURL(java.net.URL) throws java.sql.SQLException;
  }

  public final class SQLPermission extends java.security.BasicPermission implements java.security.Guard java.io.Serializable {
    ctor public SQLPermission(String);
    ctor public SQLPermission(String, String);
  }

  public class SQLWarning extends java.sql.SQLException implements java.io.Serializable {
    ctor public SQLWarning();
    ctor public SQLWarning(String);
    ctor public SQLWarning(String, String);
    ctor public SQLWarning(String, String, int);
    method public java.sql.SQLWarning getNextWarning();
    method public void setNextWarning(java.sql.SQLWarning);
  }

  public interface Savepoint {
    method public int getSavepointId() throws java.sql.SQLException;
    method public String getSavepointName() throws java.sql.SQLException;
  }

  public interface Statement {
    method public void addBatch(String) throws java.sql.SQLException;
    method public void cancel() throws java.sql.SQLException;
    method public void clearBatch() throws java.sql.SQLException;
    method public void clearWarnings() throws java.sql.SQLException;
    method public void close() throws java.sql.SQLException;
    method public boolean execute(String) throws java.sql.SQLException;
    method public boolean execute(String, int) throws java.sql.SQLException;
    method public boolean execute(String, int[]) throws java.sql.SQLException;
    method public boolean execute(String, String[]) throws java.sql.SQLException;
    method public int[] executeBatch() throws java.sql.SQLException;
    method public java.sql.ResultSet executeQuery(String) throws java.sql.SQLException;
    method public int executeUpdate(String) throws java.sql.SQLException;
    method public int executeUpdate(String, int) throws java.sql.SQLException;
    method public int executeUpdate(String, int[]) throws java.sql.SQLException;
    method public int executeUpdate(String, String[]) throws java.sql.SQLException;
    method public java.sql.Connection getConnection() throws java.sql.SQLException;
    method public int getFetchDirection() throws java.sql.SQLException;
    method public int getFetchSize() throws java.sql.SQLException;
    method public java.sql.ResultSet getGeneratedKeys() throws java.sql.SQLException;
    method public int getMaxFieldSize() throws java.sql.SQLException;
    method public int getMaxRows() throws java.sql.SQLException;
    method public boolean getMoreResults() throws java.sql.SQLException;
    method public boolean getMoreResults(int) throws java.sql.SQLException;
    method public int getQueryTimeout() throws java.sql.SQLException;
    method public java.sql.ResultSet getResultSet() throws java.sql.SQLException;
    method public int getResultSetConcurrency() throws java.sql.SQLException;
    method public int getResultSetHoldability() throws java.sql.SQLException;
    method public int getResultSetType() throws java.sql.SQLException;
    method public int getUpdateCount() throws java.sql.SQLException;
    method public java.sql.SQLWarning getWarnings() throws java.sql.SQLException;
    method public void setCursorName(String) throws java.sql.SQLException;
    method public void setEscapeProcessing(boolean) throws java.sql.SQLException;
    method public void setFetchDirection(int) throws java.sql.SQLException;
    method public void setFetchSize(int) throws java.sql.SQLException;
    method public void setMaxFieldSize(int) throws java.sql.SQLException;
    method public void setMaxRows(int) throws java.sql.SQLException;
    method public void setQueryTimeout(int) throws java.sql.SQLException;
    field public static final int CLOSE_ALL_RESULTS = 3; // 0x3
    field public static final int CLOSE_CURRENT_RESULT = 1; // 0x1
    field public static final int EXECUTE_FAILED = -3; // 0xfffffffd
    field public static final int KEEP_CURRENT_RESULT = 2; // 0x2
    field public static final int NO_GENERATED_KEYS = 2; // 0x2
    field public static final int RETURN_GENERATED_KEYS = 1; // 0x1
    field public static final int SUCCESS_NO_INFO = -2; // 0xfffffffe
  }

  public interface Struct {
    method public Object[] getAttributes() throws java.sql.SQLException;
    method public Object[] getAttributes(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public String getSQLTypeName() throws java.sql.SQLException;
  }

  public class Time extends java.util.Date {
    ctor public Time(int, int, int);
    ctor public Time(long);
    method public static java.sql.Time valueOf(String);
  }

  public class Timestamp extends java.util.Date {
    ctor public Timestamp(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException;
    ctor public Timestamp(long);
    method public boolean after(java.sql.Timestamp);
    method public boolean before(java.sql.Timestamp);
    method public int compareTo(java.util.Date) throws java.lang.ClassCastException;
    method public int compareTo(java.sql.Timestamp);
    method public boolean equals(java.sql.Timestamp);
    method public int getNanos();
    method public void setNanos(int) throws java.lang.IllegalArgumentException;
    method public static java.sql.Timestamp valueOf(String) throws java.lang.IllegalArgumentException;
  }

  public class Types {
    field public static final int ARRAY = 2003; // 0x7d3
    field public static final int BIGINT = -5; // 0xfffffffb
    field public static final int BINARY = -2; // 0xfffffffe
    field public static final int BIT = -7; // 0xfffffff9
    field public static final int BLOB = 2004; // 0x7d4
    field public static final int BOOLEAN = 16; // 0x10
    field public static final int CHAR = 1; // 0x1
    field public static final int CLOB = 2005; // 0x7d5
    field public static final int DATALINK = 70; // 0x46
    field public static final int DATE = 91; // 0x5b
    field public static final int DECIMAL = 3; // 0x3
    field public static final int DISTINCT = 2001; // 0x7d1
    field public static final int DOUBLE = 8; // 0x8
    field public static final int FLOAT = 6; // 0x6
    field public static final int INTEGER = 4; // 0x4
    field public static final int JAVA_OBJECT = 2000; // 0x7d0
    field public static final int LONGVARBINARY = -4; // 0xfffffffc
    field public static final int LONGVARCHAR = -1; // 0xffffffff
    field public static final int NULL = 0; // 0x0
    field public static final int NUMERIC = 2; // 0x2
    field public static final int OTHER = 1111; // 0x457
    field public static final int REAL = 7; // 0x7
    field public static final int REF = 2006; // 0x7d6
    field public static final int SMALLINT = 5; // 0x5
    field public static final int STRUCT = 2002; // 0x7d2
    field public static final int TIME = 92; // 0x5c
    field public static final int TIMESTAMP = 93; // 0x5d
    field public static final int TINYINT = -6; // 0xfffffffa
    field public static final int VARBINARY = -3; // 0xfffffffd
    field public static final int VARCHAR = 12; // 0xc
  }

}

package java.text {

  public class Annotation {
    ctor public Annotation(Object);
    method public Object getValue();
  }

  public interface AttributedCharacterIterator extends java.text.CharacterIterator {
    method public java.util.Set<java.text.AttributedCharacterIterator.Attribute> getAllAttributeKeys();
    method public Object getAttribute(java.text.AttributedCharacterIterator.Attribute);
    method public java.util.Map<java.text.AttributedCharacterIterator.Attribute,java.lang.Object> getAttributes();
    method public int getRunLimit();
    method public int getRunLimit(java.text.AttributedCharacterIterator.Attribute);
    method public int getRunLimit(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
    method public int getRunStart();
    method public int getRunStart(java.text.AttributedCharacterIterator.Attribute);
    method public int getRunStart(java.util.Set<? extends java.text.AttributedCharacterIterator.Attribute>);
  }

  public static class AttributedCharacterIterator.Attribute implements java.io.Serializable {
    ctor protected AttributedCharacterIterator.Attribute(String);
    method public final boolean equals(Object);
    method protected String getName();
    method public final int hashCode();
    method protected Object readResolve() throws java.io.InvalidObjectException;
    field public static final java.text.AttributedCharacterIterator.Attribute INPUT_METHOD_SEGMENT;
    field public static final java.text.AttributedCharacterIterator.Attribute LANGUAGE;
    field public static final java.text.AttributedCharacterIterator.Attribute READING;
  }

  public class AttributedString {
    ctor public AttributedString(java.text.AttributedCharacterIterator);
    ctor public AttributedString(java.text.AttributedCharacterIterator, int, int);
    ctor public AttributedString(java.text.AttributedCharacterIterator, int, int, java.text.AttributedCharacterIterator.Attribute[]);
    ctor public AttributedString(String);
    ctor public AttributedString(String, java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute,?>);
    method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, Object);
    method public void addAttribute(java.text.AttributedCharacterIterator.Attribute, Object, int, int);
    method public void addAttributes(java.util.Map<? extends java.text.AttributedCharacterIterator.Attribute,?>, int, int);
    method public java.text.AttributedCharacterIterator getIterator();
    method public java.text.AttributedCharacterIterator getIterator(java.text.AttributedCharacterIterator.Attribute[]);
    method public java.text.AttributedCharacterIterator getIterator(java.text.AttributedCharacterIterator.Attribute[], int, int);
  }

  public final class Bidi {
    ctor public Bidi(java.text.AttributedCharacterIterator);
    ctor public Bidi(char[], int, byte[], int, int, int);
    ctor public Bidi(String, int);
    method public boolean baseIsLeftToRight();
    method public java.text.Bidi createLineBidi(int, int);
    method public int getBaseLevel();
    method public int getLength();
    method public int getLevelAt(int);
    method public int getRunCount();
    method public int getRunLevel(int);
    method public int getRunLimit(int);
    method public int getRunStart(int);
    method public boolean isLeftToRight();
    method public boolean isMixed();
    method public boolean isRightToLeft();
    method public static void reorderVisually(byte[], int, Object[], int, int);
    method public static boolean requiresBidi(char[], int, int);
    field public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = -2; // 0xfffffffe
    field public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = -1; // 0xffffffff
    field public static final int DIRECTION_LEFT_TO_RIGHT = 0; // 0x0
    field public static final int DIRECTION_RIGHT_TO_LEFT = 1; // 0x1
  }

  public abstract class BreakIterator implements java.lang.Cloneable {
    ctor protected BreakIterator();
    method public Object clone();
    method public abstract int current();
    method public abstract int first();
    method public abstract int following(int);
    method public static java.util.Locale[] getAvailableLocales();
    method public static java.text.BreakIterator getCharacterInstance();
    method public static java.text.BreakIterator getCharacterInstance(java.util.Locale);
    method protected static int getInt(byte[], int);
    method public static java.text.BreakIterator getLineInstance();
    method public static java.text.BreakIterator getLineInstance(java.util.Locale);
    method protected static long getLong(byte[], int);
    method public static java.text.BreakIterator getSentenceInstance();
    method public static java.text.BreakIterator getSentenceInstance(java.util.Locale);
    method protected static short getShort(byte[], int);
    method public abstract java.text.CharacterIterator getText();
    method public static java.text.BreakIterator getWordInstance();
    method public static java.text.BreakIterator getWordInstance(java.util.Locale);
    method public boolean isBoundary(int);
    method public abstract int last();
    method public abstract int next();
    method public abstract int next(int);
    method public int preceding(int);
    method public abstract int previous();
    method public void setText(String);
    method public abstract void setText(java.text.CharacterIterator);
    field public static final int DONE = -1; // 0xffffffff
  }

  public interface CharacterIterator extends java.lang.Cloneable {
    method public Object clone();
    method public char current();
    method public char first();
    method public int getBeginIndex();
    method public int getEndIndex();
    method public int getIndex();
    method public char last();
    method public char next();
    method public char previous();
    method public char setIndex(int);
    field public static final char DONE = 65535; // 0xffff '\uffff'
  }

  public class ChoiceFormat extends java.text.NumberFormat {
    ctor public ChoiceFormat(double[], String[]);
    ctor public ChoiceFormat(String);
    method public void applyPattern(String);
    method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
    method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
    method public Object[] getFormats();
    method public double[] getLimits();
    method public static final double nextDouble(double);
    method public static double nextDouble(double, boolean);
    method public Number parse(String, java.text.ParsePosition);
    method public static final double previousDouble(double);
    method public void setChoices(double[], String[]);
    method public String toPattern();
  }

  public final class CollationElementIterator {
    method public int getMaxExpansion(int);
    method public int getOffset();
    method public int next();
    method public int previous();
    method public static int primaryOrder(int);
    method public void reset();
    method public static short secondaryOrder(int);
    method public void setOffset(int);
    method public void setText(java.text.CharacterIterator);
    method public void setText(String);
    method public static short tertiaryOrder(int);
    field public static final int NULLORDER = -1; // 0xffffffff
  }

  public final class CollationKey implements java.lang.Comparable<java.text.CollationKey> {
    method public int compareTo(java.text.CollationKey);
    method public String getSourceString();
    method public byte[] toByteArray();
  }

  public abstract class Collator implements java.lang.Cloneable java.util.Comparator<java.lang.Object> {
    ctor protected Collator();
    method public Object clone();
    method public int compare(Object, Object);
    method public abstract int compare(String, String);
    method public boolean equals(String, String);
    method public static java.util.Locale[] getAvailableLocales();
    method public abstract java.text.CollationKey getCollationKey(String);
    method public int getDecomposition();
    method public static java.text.Collator getInstance();
    method public static java.text.Collator getInstance(java.util.Locale);
    method public int getStrength();
    method public abstract int hashCode();
    method public void setDecomposition(int);
    method public void setStrength(int);
    field public static final int CANONICAL_DECOMPOSITION = 1; // 0x1
    field public static final int FULL_DECOMPOSITION = 2; // 0x2
    field public static final int IDENTICAL = 3; // 0x3
    field public static final int NO_DECOMPOSITION = 0; // 0x0
    field public static final int PRIMARY = 0; // 0x0
    field public static final int SECONDARY = 1; // 0x1
    field public static final int TERTIARY = 2; // 0x2
  }

  public abstract class DateFormat extends java.text.Format {
    ctor protected DateFormat();
    method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
    method public final String format(java.util.Date);
    method public abstract StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition);
    method public static java.util.Locale[] getAvailableLocales();
    method public java.util.Calendar getCalendar();
    method public static final java.text.DateFormat getDateInstance();
    method public static final java.text.DateFormat getDateInstance(int);
    method public static final java.text.DateFormat getDateInstance(int, java.util.Locale);
    method public static final java.text.DateFormat getDateTimeInstance();
    method public static final java.text.DateFormat getDateTimeInstance(int, int);
    method public static final java.text.DateFormat getDateTimeInstance(int, int, java.util.Locale);
    method public static final java.text.DateFormat getInstance();
    method public java.text.NumberFormat getNumberFormat();
    method public static final java.text.DateFormat getTimeInstance();
    method public static final java.text.DateFormat getTimeInstance(int);
    method public static final java.text.DateFormat getTimeInstance(int, java.util.Locale);
    method public java.util.TimeZone getTimeZone();
    method public boolean isLenient();
    method public java.util.Date parse(String) throws java.text.ParseException;
    method public abstract java.util.Date parse(String, java.text.ParsePosition);
    method public Object parseObject(String, java.text.ParsePosition);
    method public void setCalendar(java.util.Calendar);
    method public void setLenient(boolean);
    method public void setNumberFormat(java.text.NumberFormat);
    method public void setTimeZone(java.util.TimeZone);
    field public static final int AM_PM_FIELD = 14; // 0xe
    field public static final int DATE_FIELD = 3; // 0x3
    field public static final int DAY_OF_WEEK_FIELD = 9; // 0x9
    field public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11; // 0xb
    field public static final int DAY_OF_YEAR_FIELD = 10; // 0xa
    field public static final int DEFAULT = 2; // 0x2
    field public static final int ERA_FIELD = 0; // 0x0
    field public static final int FULL = 0; // 0x0
    field public static final int HOUR0_FIELD = 16; // 0x10
    field public static final int HOUR1_FIELD = 15; // 0xf
    field public static final int HOUR_OF_DAY0_FIELD = 5; // 0x5
    field public static final int HOUR_OF_DAY1_FIELD = 4; // 0x4
    field public static final int LONG = 1; // 0x1
    field public static final int MEDIUM = 2; // 0x2
    field public static final int MILLISECOND_FIELD = 8; // 0x8
    field public static final int MINUTE_FIELD = 6; // 0x6
    field public static final int MONTH_FIELD = 2; // 0x2
    field public static final int SECOND_FIELD = 7; // 0x7
    field public static final int SHORT = 3; // 0x3
    field public static final int TIMEZONE_FIELD = 17; // 0x11
    field public static final int WEEK_OF_MONTH_FIELD = 13; // 0xd
    field public static final int WEEK_OF_YEAR_FIELD = 12; // 0xc
    field public static final int YEAR_FIELD = 1; // 0x1
    field protected java.util.Calendar calendar;
    field protected java.text.NumberFormat numberFormat;
  }

  public static class DateFormat.Field extends java.text.Format.Field {
    ctor protected DateFormat.Field(String, int);
    method public int getCalendarField();
    method public static java.text.DateFormat.Field ofCalendarField(int);
    field public static final java.text.DateFormat.Field AM_PM;
    field public static final java.text.DateFormat.Field DAY_OF_MONTH;
    field public static final java.text.DateFormat.Field DAY_OF_WEEK;
    field public static final java.text.DateFormat.Field DAY_OF_WEEK_IN_MONTH;
    field public static final java.text.DateFormat.Field DAY_OF_YEAR;
    field public static final java.text.DateFormat.Field ERA;
    field public static final java.text.DateFormat.Field HOUR0;
    field public static final java.text.DateFormat.Field HOUR1;
    field public static final java.text.DateFormat.Field HOUR_OF_DAY0;
    field public static final java.text.DateFormat.Field HOUR_OF_DAY1;
    field public static final java.text.DateFormat.Field MILLISECOND;
    field public static final java.text.DateFormat.Field MINUTE;
    field public static final java.text.DateFormat.Field MONTH;
    field public static final java.text.DateFormat.Field SECOND;
    field public static final java.text.DateFormat.Field TIME_ZONE;
    field public static final java.text.DateFormat.Field WEEK_OF_MONTH;
    field public static final java.text.DateFormat.Field WEEK_OF_YEAR;
    field public static final java.text.DateFormat.Field YEAR;
  }

  public class DateFormatSymbols implements java.lang.Cloneable java.io.Serializable {
    ctor public DateFormatSymbols();
    ctor public DateFormatSymbols(java.util.Locale);
    method public Object clone();
    method public String[] getAmPmStrings();
    method public String[] getEras();
    method public String getLocalPatternChars();
    method public String[] getMonths();
    method public String[] getShortMonths();
    method public String[] getShortWeekdays();
    method public String[] getWeekdays();
    method public String[][] getZoneStrings();
    method public void setAmPmStrings(String[]);
    method public void setEras(String[]);
    method public void setLocalPatternChars(String);
    method public void setMonths(String[]);
    method public void setShortMonths(String[]);
    method public void setShortWeekdays(String[]);
    method public void setWeekdays(String[]);
    method public void setZoneStrings(String[][]);
  }

  public class DecimalFormat extends java.text.NumberFormat {
    ctor public DecimalFormat();
    ctor public DecimalFormat(String);
    ctor public DecimalFormat(String, java.text.DecimalFormatSymbols);
    method public void applyLocalizedPattern(String);
    method public void applyPattern(String);
    method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
    method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
    method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
    method public java.text.DecimalFormatSymbols getDecimalFormatSymbols();
    method public int getGroupingSize();
    method public int getMultiplier();
    method public String getNegativePrefix();
    method public String getNegativeSuffix();
    method public String getPositivePrefix();
    method public String getPositiveSuffix();
    method public boolean isDecimalSeparatorAlwaysShown();
    method public boolean isParseBigDecimal();
    method public Number parse(String, java.text.ParsePosition);
    method public void setDecimalFormatSymbols(java.text.DecimalFormatSymbols);
    method public void setDecimalSeparatorAlwaysShown(boolean);
    method public void setGroupingSize(int);
    method public void setMultiplier(int);
    method public void setNegativePrefix(String);
    method public void setNegativeSuffix(String);
    method public void setParseBigDecimal(boolean);
    method public void setPositivePrefix(String);
    method public void setPositiveSuffix(String);
    method public String toLocalizedPattern();
    method public String toPattern();
  }

  public final class DecimalFormatSymbols implements java.lang.Cloneable java.io.Serializable {
    ctor public DecimalFormatSymbols();
    ctor public DecimalFormatSymbols(java.util.Locale);
    method public Object clone();
    method public java.util.Currency getCurrency();
    method public String getCurrencySymbol();
    method public char getDecimalSeparator();
    method public char getDigit();
    method public char getGroupingSeparator();
    method public String getInfinity();
    method public String getInternationalCurrencySymbol();
    method public char getMinusSign();
    method public char getMonetaryDecimalSeparator();
    method public String getNaN();
    method public char getPatternSeparator();
    method public char getPerMill();
    method public char getPercent();
    method public char getZeroDigit();
    method public void setCurrency(java.util.Currency);
    method public void setCurrencySymbol(String);
    method public void setDecimalSeparator(char);
    method public void setDigit(char);
    method public void setGroupingSeparator(char);
    method public void setInfinity(String);
    method public void setInternationalCurrencySymbol(String);
    method public void setMinusSign(char);
    method public void setMonetaryDecimalSeparator(char);
    method public void setNaN(String);
    method public void setPatternSeparator(char);
    method public void setPerMill(char);
    method public void setPercent(char);
    method public void setZeroDigit(char);
  }

  public class FieldPosition {
    ctor public FieldPosition(int);
    ctor public FieldPosition(java.text.Format.Field);
    ctor public FieldPosition(java.text.Format.Field, int);
    method public int getBeginIndex();
    method public int getEndIndex();
    method public int getField();
    method public java.text.Format.Field getFieldAttribute();
    method public void setBeginIndex(int);
    method public void setEndIndex(int);
  }

  public abstract class Format implements java.lang.Cloneable java.io.Serializable {
    ctor public Format();
    method public Object clone();
    method public final String format(Object);
    method public abstract StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
    method public java.text.AttributedCharacterIterator formatToCharacterIterator(Object);
    method public Object parseObject(String) throws java.text.ParseException;
    method public abstract Object parseObject(String, java.text.ParsePosition);
  }

  public static class Format.Field extends java.text.AttributedCharacterIterator.Attribute {
    ctor protected Format.Field(String);
  }

  public class MessageFormat extends java.text.Format {
    ctor public MessageFormat(String, java.util.Locale);
    ctor public MessageFormat(String);
    method public void applyPattern(String);
    method public final StringBuffer format(Object[], StringBuffer, java.text.FieldPosition);
    method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
    method public static String format(String, java.lang.Object...);
    method public java.text.Format[] getFormats();
    method public java.text.Format[] getFormatsByArgumentIndex();
    method public java.util.Locale getLocale();
    method public Object[] parse(String) throws java.text.ParseException;
    method public Object[] parse(String, java.text.ParsePosition);
    method public Object parseObject(String, java.text.ParsePosition);
    method public void setFormat(int, java.text.Format);
    method public void setFormatByArgumentIndex(int, java.text.Format);
    method public void setFormats(java.text.Format[]);
    method public void setFormatsByArgumentIndex(java.text.Format[]);
    method public void setLocale(java.util.Locale);
    method public String toPattern();
  }

  public static class MessageFormat.Field extends java.text.Format.Field {
    ctor protected MessageFormat.Field(String);
    field public static final java.text.MessageFormat.Field ARGUMENT;
  }

  public abstract class NumberFormat extends java.text.Format {
    ctor public NumberFormat();
    method public final String format(double);
    method public abstract StringBuffer format(double, StringBuffer, java.text.FieldPosition);
    method public final String format(long);
    method public abstract StringBuffer format(long, StringBuffer, java.text.FieldPosition);
    method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
    method public static java.util.Locale[] getAvailableLocales();
    method public java.util.Currency getCurrency();
    method public static final java.text.NumberFormat getCurrencyInstance();
    method public static java.text.NumberFormat getCurrencyInstance(java.util.Locale);
    method public static final java.text.NumberFormat getInstance();
    method public static java.text.NumberFormat getInstance(java.util.Locale);
    method public static final java.text.NumberFormat getIntegerInstance();
    method public static java.text.NumberFormat getIntegerInstance(java.util.Locale);
    method public int getMaximumFractionDigits();
    method public int getMaximumIntegerDigits();
    method public int getMinimumFractionDigits();
    method public int getMinimumIntegerDigits();
    method public static final java.text.NumberFormat getNumberInstance();
    method public static java.text.NumberFormat getNumberInstance(java.util.Locale);
    method public static final java.text.NumberFormat getPercentInstance();
    method public static java.text.NumberFormat getPercentInstance(java.util.Locale);
    method public boolean isGroupingUsed();
    method public boolean isParseIntegerOnly();
    method public Number parse(String) throws java.text.ParseException;
    method public abstract Number parse(String, java.text.ParsePosition);
    method public final Object parseObject(String, java.text.ParsePosition);
    method public void setCurrency(java.util.Currency);
    method public void setGroupingUsed(boolean);
    method public void setMaximumFractionDigits(int);
    method public void setMaximumIntegerDigits(int);
    method public void setMinimumFractionDigits(int);
    method public void setMinimumIntegerDigits(int);
    method public void setParseIntegerOnly(boolean);
    field public static final int FRACTION_FIELD = 1; // 0x1
    field public static final int INTEGER_FIELD = 0; // 0x0
  }

  public static class NumberFormat.Field extends java.text.Format.Field {
    ctor protected NumberFormat.Field(String);
    field public static final java.text.NumberFormat.Field CURRENCY;
    field public static final java.text.NumberFormat.Field DECIMAL_SEPARATOR;
    field public static final java.text.NumberFormat.Field EXPONENT;
    field public static final java.text.NumberFormat.Field EXPONENT_SIGN;
    field public static final java.text.NumberFormat.Field EXPONENT_SYMBOL;
    field public static final java.text.NumberFormat.Field FRACTION;
    field public static final java.text.NumberFormat.Field GROUPING_SEPARATOR;
    field public static final java.text.NumberFormat.Field INTEGER;
    field public static final java.text.NumberFormat.Field PERCENT;
    field public static final java.text.NumberFormat.Field PERMILLE;
    field public static final java.text.NumberFormat.Field SIGN;
  }

  public class ParseException extends java.lang.Exception {
    ctor public ParseException(String, int);
    method public int getErrorOffset();
  }

  public class ParsePosition {
    ctor public ParsePosition(int);
    method public int getErrorIndex();
    method public int getIndex();
    method public void setErrorIndex(int);
    method public void setIndex(int);
  }

  public class RuleBasedCollator extends java.text.Collator {
    ctor public RuleBasedCollator(String) throws java.text.ParseException;
    method public int compare(String, String);
    method public java.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
    method public java.text.CollationElementIterator getCollationElementIterator(String);
    method public java.text.CollationKey getCollationKey(String);
    method public String getRules();
  }

  public class SimpleDateFormat extends java.text.DateFormat {
    ctor public SimpleDateFormat();
    ctor public SimpleDateFormat(String);
    ctor public SimpleDateFormat(String, java.text.DateFormatSymbols);
    ctor public SimpleDateFormat(String, java.util.Locale);
    method public void applyLocalizedPattern(String);
    method public void applyPattern(String);
    method public StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition);
    method public java.util.Date get2DigitYearStart();
    method public java.text.DateFormatSymbols getDateFormatSymbols();
    method public java.util.Date parse(String, java.text.ParsePosition);
    method public void set2DigitYearStart(java.util.Date);
    method public void setDateFormatSymbols(java.text.DateFormatSymbols);
    method public String toLocalizedPattern();
    method public String toPattern();
  }

  public final class StringCharacterIterator implements java.text.CharacterIterator {
    ctor public StringCharacterIterator(String);
    ctor public StringCharacterIterator(String, int);
    ctor public StringCharacterIterator(String, int, int, int);
    method public Object clone();
    method public char current();
    method public char first();
    method public int getBeginIndex();
    method public int getEndIndex();
    method public int getIndex();
    method public char last();
    method public char next();
    method public char previous();
    method public char setIndex(int);
    method public void setText(String);
  }

}

package java.util {

  public abstract class AbstractCollection<E> implements java.util.Collection<E> {
    ctor protected AbstractCollection();
    method public boolean add(E);
    method public boolean addAll(java.util.Collection<? extends E>);
    method public void clear();
    method public boolean contains(Object);
    method public boolean containsAll(java.util.Collection<?>);
    method public boolean isEmpty();
    method public boolean remove(Object);
    method public boolean removeAll(java.util.Collection<?>);
    method public boolean retainAll(java.util.Collection<?>);
    method public Object[] toArray();
    method public <T> T[] toArray(T[]);
  }

  public abstract class AbstractList<E> extends java.util.AbstractCollection<E> implements java.util.List<E> {
    ctor protected AbstractList();
    method public void add(int, E);
    method public boolean addAll(int, java.util.Collection<? extends E>);
    method public int indexOf(Object);
    method public java.util.Iterator<E> iterator();
    method public int lastIndexOf(Object);
    method public java.util.ListIterator<E> listIterator();
    method public java.util.ListIterator<E> listIterator(int);
    method public E remove(int);
    method protected void removeRange(int, int);
    method public E set(int, E);
    method public java.util.List<E> subList(int, int);
    field protected transient int modCount;
  }

  public abstract class AbstractMap<K, V> implements java.util.Map<K,V> {
    ctor protected AbstractMap();
    method public void clear();
    method public boolean containsKey(Object);
    method public boolean containsValue(Object);
    method public V get(Object);
    method public boolean isEmpty();
    method public java.util.Set<K> keySet();
    method public V put(K, V);
    method public void putAll(java.util.Map<? extends K,? extends V>);
    method public V remove(Object);
    method public int size();
    method public java.util.Collection<V> values();
  }

  public abstract class AbstractQueue<E> extends java.util.AbstractCollection<E> implements java.util.Queue<E> {
    ctor protected AbstractQueue();
    method public E element();
    method public E remove();
  }

  public abstract class AbstractSequentialList<E> extends java.util.AbstractList<E> {
    ctor protected AbstractSequentialList();
    method public E get(int);
  }

  public abstract class AbstractSet<E> extends java.util.AbstractCollection<E> implements java.util.Set<E> {
    ctor protected AbstractSet();
  }

  public class ArrayList<E> extends java.util.AbstractList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
    ctor public ArrayList();
    ctor public ArrayList(int);
    ctor public ArrayList(java.util.Collection<? extends E>);
    method public Object clone();
    method public void ensureCapacity(int);
    method public E get(int);
    method public int size();
    method public void trimToSize();
  }

  public class Arrays {
    method public static <T> java.util.List<T> asList(T...);
    method public static int binarySearch(byte[], byte);
    method public static int binarySearch(char[], char);
    method public static int binarySearch(double[], double);
    method public static int binarySearch(float[], float);
    method public static int binarySearch(int[], int);
    method public static int binarySearch(long[], long);
    method public static int binarySearch(Object[], Object);
    method public static <T> int binarySearch(T[], T, java.util.Comparator<? super T>);
    method public static int binarySearch(short[], short);
    method public static boolean deepEquals(Object[], Object[]);
    method public static int deepHashCode(Object[]);
    method public static String deepToString(Object[]);
    method public static boolean equals(byte[], byte[]);
    method public static boolean equals(short[], short[]);
    method public static boolean equals(char[], char[]);
    method public static boolean equals(int[], int[]);
    method public static boolean equals(long[], long[]);
    method public static boolean equals(float[], float[]);
    method public static boolean equals(double[], double[]);
    method public static boolean equals(boolean[], boolean[]);
    method public static boolean equals(Object[], Object[]);
    method public static void fill(byte[], byte);
    method public static void fill(byte[], int, int, byte);
    method public static void fill(short[], short);
    method public static void fill(short[], int, int, short);
    method public static void fill(char[], char);
    method public static void fill(char[], int, int, char);
    method public static void fill(int[], int);
    method public static void fill(int[], int, int, int);
    method public static void fill(long[], long);
    method public static void fill(long[], int, int, long);
    method public static void fill(float[], float);
    method public static void fill(float[], int, int, float);
    method public static void fill(double[], double);
    method public static void fill(double[], int, int, double);
    method public static void fill(boolean[], boolean);
    method public static void fill(boolean[], int, int, boolean);
    method public static void fill(Object[], Object);
    method public static void fill(Object[], int, int, Object);
    method public static int hashCode(boolean[]);
    method public static int hashCode(int[]);
    method public static int hashCode(short[]);
    method public static int hashCode(char[]);
    method public static int hashCode(byte[]);
    method public static int hashCode(long[]);
    method public static int hashCode(float[]);
    method public static int hashCode(double[]);
    method public static int hashCode(Object[]);
    method public static void sort(byte[]);
    method public static void sort(byte[], int, int);
    method public static void sort(char[]);
    method public static void sort(char[], int, int);
    method public static void sort(double[]);
    method public static void sort(double[], int, int);
    method public static void sort(float[]);
    method public static void sort(float[], int, int);
    method public static void sort(int[]);
    method public static void sort(int[], int, int);
    method public static void sort(long[]);
    method public static void sort(long[], int, int);
    method public static void sort(Object[]);
    method public static void sort(Object[], int, int);
    method public static <T> void sort(T[], int, int, java.util.Comparator<? super T>);
    method public static <T> void sort(T[], java.util.Comparator<? super T>);
    method public static void sort(short[]);
    method public static void sort(short[], int, int);
    method public static String toString(boolean[]);
    method public static String toString(byte[]);
    method public static String toString(char[]);
    method public static String toString(double[]);
    method public static String toString(float[]);
    method public static String toString(int[]);
    method public static String toString(long[]);
    method public static String toString(short[]);
    method public static String toString(Object[]);
  }

  public class BitSet implements java.lang.Cloneable java.io.Serializable {
    ctor public BitSet();
    ctor public BitSet(int);
    method public void and(java.util.BitSet);
    method public void andNot(java.util.BitSet);
    method public int cardinality();
    method public void clear();
    method public void clear(int);
    method public void clear(int, int);
    method public Object clone();
    method public void flip(int);
    method public void flip(int, int);
    method public boolean get(int);
    method public java.util.BitSet get(int, int);
    method public boolean intersects(java.util.BitSet);
    method public boolean isEmpty();
    method public int length();
    method public int nextClearBit(int);
    method public int nextSetBit(int);
    method public void or(java.util.BitSet);
    method public void set(int);
    method public void set(int, boolean);
    method public void set(int, int);
    method public void set(int, int, boolean);
    method public int size();
    method public void xor(java.util.BitSet);
  }

  public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable<java.util.Calendar> java.io.Serializable {
    ctor protected Calendar();
    ctor protected Calendar(java.util.TimeZone, java.util.Locale);
    method public abstract void add(int, int);
    method public boolean after(Object);
    method public boolean before(Object);
    method public final void clear();
    method public final void clear(int);
    method public Object clone();
    method public int compareTo(java.util.Calendar);
    method protected void complete();
    method protected abstract void computeFields();
    method protected abstract void computeTime();
    method public int get(int);
    method public int getActualMaximum(int);
    method public int getActualMinimum(int);
    method public static java.util.Locale[] getAvailableLocales();
    method public int getFirstDayOfWeek();
    method public abstract int getGreatestMinimum(int);
    method public static java.util.Calendar getInstance();
    method public static java.util.Calendar getInstance(java.util.Locale);
    method public static java.util.Calendar getInstance(java.util.TimeZone);
    method public static java.util.Calendar getInstance(java.util.TimeZone, java.util.Locale);
    method public abstract int getLeastMaximum(int);
    method public abstract int getMaximum(int);
    method public int getMinimalDaysInFirstWeek();
    method public abstract int getMinimum(int);
    method public final java.util.Date getTime();
    method public long getTimeInMillis();
    method public java.util.TimeZone getTimeZone();
    method protected final int internalGet(int);
    method public boolean isLenient();
    method public final boolean isSet(int);
    method public void roll(int, int);
    method public abstract void roll(int, boolean);
    method public void set(int, int);
    method public final void set(int, int, int);
    method public final void set(int, int, int, int, int);
    method public final void set(int, int, int, int, int, int);
    method public void setFirstDayOfWeek(int);
    method public void setLenient(boolean);
    method public void setMinimalDaysInFirstWeek(int);
    method public final void setTime(java.util.Date);
    method public void setTimeInMillis(long);
    method public void setTimeZone(java.util.TimeZone);
    field public static final int AM = 0; // 0x0
    field public static final int AM_PM = 9; // 0x9
    field public static final int APRIL = 3; // 0x3
    field public static final int AUGUST = 7; // 0x7
    field public static final int DATE = 5; // 0x5
    field public static final int DAY_OF_MONTH = 5; // 0x5
    field public static final int DAY_OF_WEEK = 7; // 0x7
    field public static final int DAY_OF_WEEK_IN_MONTH = 8; // 0x8
    field public static final int DAY_OF_YEAR = 6; // 0x6
    field public static final int DECEMBER = 11; // 0xb
    field public static final int DST_OFFSET = 16; // 0x10
    field public static final int ERA = 0; // 0x0
    field public static final int FEBRUARY = 1; // 0x1
    field public static final int FIELD_COUNT = 17; // 0x11
    field public static final int FRIDAY = 6; // 0x6
    field public static final int HOUR = 10; // 0xa
    field public static final int HOUR_OF_DAY = 11; // 0xb
    field public static final int JANUARY = 0; // 0x0
    field public static final int JULY = 6; // 0x6
    field public static final int JUNE = 5; // 0x5
    field public static final int MARCH = 2; // 0x2
    field public static final int MAY = 4; // 0x4
    field public static final int MILLISECOND = 14; // 0xe
    field public static final int MINUTE = 12; // 0xc
    field public static final int MONDAY = 2; // 0x2
    field public static final int MONTH = 2; // 0x2
    field public static final int NOVEMBER = 10; // 0xa
    field public static final int OCTOBER = 9; // 0x9
    field public static final int PM = 1; // 0x1
    field public static final int SATURDAY = 7; // 0x7
    field public static final int SECOND = 13; // 0xd
    field public static final int SEPTEMBER = 8; // 0x8
    field public static final int SUNDAY = 1; // 0x1
    field public static final int THURSDAY = 5; // 0x5
    field public static final int TUESDAY = 3; // 0x3
    field public static final int UNDECIMBER = 12; // 0xc
    field public static final int WEDNESDAY = 4; // 0x4
    field public static final int WEEK_OF_MONTH = 4; // 0x4
    field public static final int WEEK_OF_YEAR = 3; // 0x3
    field public static final int YEAR = 1; // 0x1
    field public static final int ZONE_OFFSET = 15; // 0xf
    field protected boolean areFieldsSet;
    field protected int[] fields;
    field protected boolean[] isSet;
    field protected boolean isTimeSet;
    field protected long time;
  }

  public interface Collection<E> extends java.lang.Iterable<E> {
    method public boolean add(E);
    method public boolean addAll(java.util.Collection<? extends E>);
    method public void clear();
    method public boolean contains(Object);
    method public boolean containsAll(java.util.Collection<?>);
    method public boolean equals(Object);
    method public int hashCode();
    method public boolean isEmpty();
    method public java.util.Iterator<E> iterator();
    method public boolean remove(Object);
    method public boolean removeAll(java.util.Collection<?>);
    method public boolean retainAll(java.util.Collection<?>);
    method public int size();
    method public Object[] toArray();
    method public <T> T[] toArray(T[]);
  }

  public class Collections {
    method public static <T> boolean addAll(java.util.Collection<? super T>, T...);
    method public static <T> int binarySearch(java.util.List<? extends java.lang.Comparable<? super T>>, T);
    method public static <T> int binarySearch(java.util.List<? extends T>, T, java.util.Comparator<? super T>);
    method public static <E> java.util.Collection<E> checkedCollection(java.util.Collection<E>, Class<E>);
    method public static <E> java.util.List<E> checkedList(java.util.List<E>, Class<E>);
    method public static <K, V> java.util.Map<K,V> checkedMap(java.util.Map<K,V>, Class<K>, Class<V>);
    method public static <E> java.util.Set<E> checkedSet(java.util.Set<E>, Class<E>);
    method public static <K, V> java.util.SortedMap<K,V> checkedSortedMap(java.util.SortedMap<K,V>, Class<K>, Class<V>);
    method public static <E> java.util.SortedSet<E> checkedSortedSet(java.util.SortedSet<E>, Class<E>);
    method public static <T> void copy(java.util.List<? super T>, java.util.List<? extends T>);
    method public static boolean disjoint(java.util.Collection<?>, java.util.Collection<?>);
    method public static final <T> java.util.List<T> emptyList();
    method public static final <K, V> java.util.Map<K,V> emptyMap();
    method public static final <T> java.util.Set<T> emptySet();
    method public static <T> java.util.Enumeration<T> enumeration(java.util.Collection<T>);
    method public static <T> void fill(java.util.List<? super T>, T);
    method public static int frequency(java.util.Collection<?>, Object);
    method public static int indexOfSubList(java.util.List<?>, java.util.List<?>);
    method public static int lastIndexOfSubList(java.util.List<?>, java.util.List<?>);
    method public static <T> java.util.ArrayList<T> list(java.util.Enumeration<T>);
    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T max(java.util.Collection<? extends T>);
    method public static <T> T max(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
    method public static <T extends java.lang.Object & java.lang.Comparable<? super T>> T min(java.util.Collection<? extends T>);
    method public static <T> T min(java.util.Collection<? extends T>, java.util.Comparator<? super T>);
    method public static <T> java.util.List<T> nCopies(int, T);
    method public static <T> boolean replaceAll(java.util.List<T>, T, T);
    method public static void reverse(java.util.List<?>);
    method public static <T> java.util.Comparator<T> reverseOrder();
    method public static <T> java.util.Comparator<T> reverseOrder(java.util.Comparator<T>);
    method public static void rotate(java.util.List<?>, int);
    method public static void shuffle(java.util.List<?>);
    method public static void shuffle(java.util.List<?>, java.util.Random);
    method public static <E> java.util.Set<E> singleton(E);
    method public static <E> java.util.List<E> singletonList(E);
    method public static <K, V> java.util.Map<K,V> singletonMap(K, V);
    method public static <T extends java.lang.Comparable<? super T>> void sort(java.util.List<T>);
    method public static <T> void sort(java.util.List<T>, java.util.Comparator<? super T>);
    method public static void swap(java.util.List<?>, int, int);
    method public static <T> java.util.Collection<T> synchronizedCollection(java.util.Collection<T>);
    method public static <T> java.util.List<T> synchronizedList(java.util.List<T>);
    method public static <K, V> java.util.Map<K,V> synchronizedMap(java.util.Map<K,V>);
    method public static <E> java.util.Set<E> synchronizedSet(java.util.Set<E>);
    method public static <K, V> java.util.SortedMap<K,V> synchronizedSortedMap(java.util.SortedMap<K,V>);
    method public static <E> java.util.SortedSet<E> synchronizedSortedSet(java.util.SortedSet<E>);
    method public static <E> java.util.Collection<E> unmodifiableCollection(java.util.Collection<? extends E>);
    method public static <E> java.util.List<E> unmodifiableList(java.util.List<? extends E>);
    method public static <K, V> java.util.Map<K,V> unmodifiableMap(java.util.Map<? extends K,? extends V>);
    method public static <E> java.util.Set<E> unmodifiableSet(java.util.Set<? extends E>);
    method public static <K, V> java.util.SortedMap<K,V> unmodifiableSortedMap(java.util.SortedMap<K,? extends V>);
    method public static <E> java.util.SortedSet<E> unmodifiableSortedSet(java.util.SortedSet<E>);
    field public static final java.util.List EMPTY_LIST;
    field public static final java.util.Map EMPTY_MAP;
    field public static final java.util.Set EMPTY_SET;
  }

  public interface Comparator<T> {
    method public int compare(T, T);
    method public boolean equals(Object);
  }

  public class ConcurrentModificationException extends java.lang.RuntimeException {
    ctor public ConcurrentModificationException();
    ctor public ConcurrentModificationException(String);
  }

  public final class Currency implements java.io.Serializable {
    method public String getCurrencyCode();
    method public int getDefaultFractionDigits();
    method public static java.util.Currency getInstance(String);
    method public static java.util.Currency getInstance(java.util.Locale);
    method public String getSymbol();
    method public String getSymbol(java.util.Locale);
  }

  public class Date implements java.lang.Cloneable java.lang.Comparable<java.util.Date> java.io.Serializable {
    ctor public Date();
    ctor public Date(int, int, int);
    ctor public Date(int, int, int, int, int);
    ctor public Date(int, int, int, int, int, int);
    ctor public Date(long);
    ctor public Date(String);
    method public static long UTC(int, int, int, int, int, int);
    method public boolean after(java.util.Date);
    method public boolean before(java.util.Date);
    method public Object clone();
    method public int compareTo(java.util.Date);
    method public int getDate();
    method public int getDay();
    method public int getHours();
    method public int getMinutes();
    method public int getMonth();
    method public int getSeconds();
    method public long getTime();
    method public int getTimezoneOffset();
    method public int getYear();
    method public static long parse(String);
    method public void setDate(int);
    method public void setHours(int);
    method public void setMinutes(int);
    method public void setMonth(int);
    method public void setSeconds(int);
    method public void setTime(long);
    method public void setYear(int);
    method public String toGMTString();
    method public String toLocaleString();
  }

  public abstract class Dictionary<K, V> {
    ctor public Dictionary();
    method public abstract java.util.Enumeration<V> elements();
    method public abstract V get(Object);
    method public abstract boolean isEmpty();
    method public abstract java.util.Enumeration<K> keys();
    method public abstract V put(K, V);
    method public abstract V remove(Object);
    method public abstract int size();
  }

  public class DuplicateFormatFlagsException extends java.util.IllegalFormatException {
    ctor public DuplicateFormatFlagsException(String);
    method public String getFlags();
  }

  public class EmptyStackException extends java.lang.RuntimeException {
    ctor public EmptyStackException();
  }

  public class EnumMap<K extends java.lang.Enum<K>, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
    ctor public EnumMap(Class<K>);
    ctor public EnumMap(java.util.EnumMap<K,? extends V>);
    ctor public EnumMap(java.util.Map<K,? extends V>);
    method public java.util.EnumMap<K,V> clone();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
  }

  public abstract class EnumSet<E extends java.lang.Enum<E>> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.io.Serializable {
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> allOf(Class<E>);
    method public java.util.EnumSet<E> clone();
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> complementOf(java.util.EnumSet<E>);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.EnumSet<E>);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> copyOf(java.util.Collection<E>);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> noneOf(Class<E>);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E, E, E, E);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> of(E, E...);
    method public static <E extends java.lang.Enum<E>> java.util.EnumSet<E> range(E, E);
  }

  public interface Enumeration<E> {
    method public boolean hasMoreElements();
    method public E nextElement();
  }

  public interface EventListener {
  }

  public abstract class EventListenerProxy implements java.util.EventListener {
    ctor public EventListenerProxy(java.util.EventListener);
    method public java.util.EventListener getListener();
  }

  public class EventObject implements java.io.Serializable {
    ctor public EventObject(Object);
    method public Object getSource();
    field protected transient Object source;
  }

  public class FormatFlagsConversionMismatchException extends java.util.IllegalFormatException implements java.io.Serializable {
    ctor public FormatFlagsConversionMismatchException(String, char);
    method public char getConversion();
    method public String getFlags();
  }

  public interface Formattable {
    method public void formatTo(java.util.Formatter, int, int, int) throws java.util.IllegalFormatException;
  }

  public class FormattableFlags {
    field public static final int ALTERNATE = 4; // 0x4
    field public static final int LEFT_JUSTIFY = 1; // 0x1
    field public static final int UPPERCASE = 2; // 0x2
  }

  public final class Formatter implements java.io.Closeable java.io.Flushable {
    ctor public Formatter();
    ctor public Formatter(Appendable);
    ctor public Formatter(java.util.Locale);
    ctor public Formatter(Appendable, java.util.Locale);
    ctor public Formatter(String) throws java.io.FileNotFoundException;
    ctor public Formatter(String, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public Formatter(String, String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public Formatter(java.io.File) throws java.io.FileNotFoundException;
    ctor public Formatter(java.io.File, String) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public Formatter(java.io.File, String, java.util.Locale) throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException;
    ctor public Formatter(java.io.OutputStream);
    ctor public Formatter(java.io.OutputStream, String) throws java.io.UnsupportedEncodingException;
    ctor public Formatter(java.io.OutputStream, String, java.util.Locale) throws java.io.UnsupportedEncodingException;
    ctor public Formatter(java.io.PrintStream);
    method public void close();
    method public void flush();
    method public java.util.Formatter format(String, java.lang.Object...);
    method public java.util.Formatter format(java.util.Locale, String, java.lang.Object...);
    method public java.io.IOException ioException();
    method public java.util.Locale locale();
    method public Appendable out();
  }

  public enum Formatter.BigDecimalLayoutForm {
    enum_constant public static final java.util.Formatter.BigDecimalLayoutForm DECIMAL_FLOAT;
    enum_constant public static final java.util.Formatter.BigDecimalLayoutForm SCIENTIFIC;
  }

  public class FormatterClosedException extends java.lang.IllegalStateException implements java.io.Serializable {
    ctor public FormatterClosedException();
  }

  public class GregorianCalendar extends java.util.Calendar {
    ctor public GregorianCalendar();
    ctor public GregorianCalendar(int, int, int);
    ctor public GregorianCalendar(int, int, int, int, int);
    ctor public GregorianCalendar(int, int, int, int, int, int);
    ctor public GregorianCalendar(java.util.Locale);
    ctor public GregorianCalendar(java.util.TimeZone);
    ctor public GregorianCalendar(java.util.TimeZone, java.util.Locale);
    method public void add(int, int);
    method protected void computeFields();
    method protected void computeTime();
    method public int getGreatestMinimum(int);
    method public final java.util.Date getGregorianChange();
    method public int getLeastMaximum(int);
    method public int getMaximum(int);
    method public int getMinimum(int);
    method public boolean isLeapYear(int);
    method public void roll(int, boolean);
    method public void setGregorianChange(java.util.Date);
    field public static final int AD = 1; // 0x1
    field public static final int BC = 0; // 0x0
  }

  public class HashMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
    ctor public HashMap();
    ctor public HashMap(int);
    ctor public HashMap(int, float);
    ctor public HashMap(java.util.Map<? extends K,? extends V>);
    method public Object clone();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
  }

  public class HashSet<E> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.io.Serializable java.util.Set<E> {
    ctor public HashSet();
    ctor public HashSet(int);
    ctor public HashSet(int, float);
    ctor public HashSet(java.util.Collection<? extends E>);
    method public Object clone();
    method public java.util.Iterator<E> iterator();
    method public int size();
  }

  public class Hashtable<K, V> extends java.util.Dictionary<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
    ctor public Hashtable();
    ctor public Hashtable(int);
    ctor public Hashtable(int, float);
    ctor public Hashtable(java.util.Map<? extends K,? extends V>);
    method public void clear();
    method public Object clone();
    method public boolean contains(Object);
    method public boolean containsKey(Object);
    method public boolean containsValue(Object);
    method public java.util.Enumeration<V> elements();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
    method public V get(Object);
    method public boolean isEmpty();
    method public java.util.Set<K> keySet();
    method public java.util.Enumeration<K> keys();
    method public V put(K, V);
    method public void putAll(java.util.Map<? extends K,? extends V>);
    method protected void rehash();
    method public V remove(Object);
    method public int size();
    method public java.util.Collection<V> values();
  }

  public class IdentityHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.util.Map<K,V> java.io.Serializable {
    ctor public IdentityHashMap();
    ctor public IdentityHashMap(int);
    ctor public IdentityHashMap(java.util.Map<? extends K,? extends V>);
    method public Object clone();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
  }

  public class IllegalFormatCodePointException extends java.util.IllegalFormatException implements java.io.Serializable {
    ctor public IllegalFormatCodePointException(int);
    method public int getCodePoint();
  }

  public class IllegalFormatConversionException extends java.util.IllegalFormatException implements java.io.Serializable {
    ctor public IllegalFormatConversionException(char, Class<?>);
    method public Class<?> getArgumentClass();
    method public char getConversion();
  }

  public class IllegalFormatException extends java.lang.IllegalArgumentException implements java.io.Serializable {
  }

  public class IllegalFormatFlagsException extends java.util.IllegalFormatException implements java.io.Serializable {
    ctor public IllegalFormatFlagsException(String);
    method public String getFlags();
  }

  public class IllegalFormatPrecisionException extends java.util.IllegalFormatException {
    ctor public IllegalFormatPrecisionException(int);
    method public int getPrecision();
  }

  public class IllegalFormatWidthException extends java.util.IllegalFormatException {
    ctor public IllegalFormatWidthException(int);
    method public int getWidth();
  }

  public class InputMismatchException extends java.util.NoSuchElementException implements java.io.Serializable {
    ctor public InputMismatchException();
    ctor public InputMismatchException(String);
  }

  public class InvalidPropertiesFormatException extends java.io.IOException {
    ctor public InvalidPropertiesFormatException(String);
    ctor public InvalidPropertiesFormatException(Throwable);
  }

  public interface Iterator<E> {
    method public boolean hasNext();
    method public E next();
    method public void remove();
  }

  public class LinkedHashMap<K, V> extends java.util.HashMap<K,V> {
    ctor public LinkedHashMap();
    ctor public LinkedHashMap(int);
    ctor public LinkedHashMap(int, float);
    ctor public LinkedHashMap(int, float, boolean);
    ctor public LinkedHashMap(java.util.Map<? extends K,? extends V>);
    method protected boolean removeEldestEntry(java.util.Map.Entry<K,V>);
  }

  public class LinkedHashSet<E> extends java.util.HashSet<E> implements java.lang.Cloneable java.io.Serializable java.util.Set<E> {
    ctor public LinkedHashSet();
    ctor public LinkedHashSet(int);
    ctor public LinkedHashSet(int, float);
    ctor public LinkedHashSet(java.util.Collection<? extends E>);
  }

  public class LinkedList<E> extends java.util.AbstractSequentialList<E> implements java.lang.Cloneable java.util.List<E> java.util.Queue<E> java.io.Serializable {
    ctor public LinkedList();
    ctor public LinkedList(java.util.Collection<? extends E>);
    method public void addFirst(E);
    method public void addLast(E);
    method public Object clone();
    method public E element();
    method public E getFirst();
    method public E getLast();
    method public boolean offer(E);
    method public E peek();
    method public E poll();
    method public E remove();
    method public E removeFirst();
    method public E removeLast();
    method public int size();
  }

  public interface List<E> extends java.util.Collection<E> {
    method public void add(int, E);
    method public boolean addAll(int, java.util.Collection<? extends E>);
    method public E get(int);
    method public int indexOf(Object);
    method public int lastIndexOf(Object);
    method public java.util.ListIterator<E> listIterator();
    method public java.util.ListIterator<E> listIterator(int);
    method public E remove(int);
    method public E set(int, E);
    method public java.util.List<E> subList(int, int);
  }

  public interface ListIterator<E> extends java.util.Iterator<E> {
    method public void add(E);
    method public boolean hasPrevious();
    method public int nextIndex();
    method public E previous();
    method public int previousIndex();
    method public void set(E);
  }

  public abstract class ListResourceBundle extends java.util.ResourceBundle {
    ctor public ListResourceBundle();
    method protected abstract Object[][] getContents();
    method public java.util.Enumeration<java.lang.String> getKeys();
    method public final Object handleGetObject(String);
  }

  public final class Locale implements java.lang.Cloneable java.io.Serializable {
    ctor public Locale(String);
    ctor public Locale(String, String);
    ctor public Locale(String, String, String);
    method public Object clone();
    method public static java.util.Locale[] getAvailableLocales();
    method public String getCountry();
    method public static java.util.Locale getDefault();
    method public String getDisplayCountry();
    method public String getDisplayCountry(java.util.Locale);
    method public String getDisplayLanguage();
    method public String getDisplayLanguage(java.util.Locale);
    method public String getDisplayName();
    method public String getDisplayName(java.util.Locale);
    method public String getDisplayVariant();
    method public String getDisplayVariant(java.util.Locale);
    method public String getISO3Country() throws java.util.MissingResourceException;
    method public String getISO3Language() throws java.util.MissingResourceException;
    method public static String[] getISOCountries();
    method public static String[] getISOLanguages();
    method public String getLanguage();
    method public String getVariant();
    method public static void setDefault(java.util.Locale);
    field public static final java.util.Locale CANADA;
    field public static final java.util.Locale CANADA_FRENCH;
    field public static final java.util.Locale CHINA;
    field public static final java.util.Locale CHINESE;
    field public static final java.util.Locale ENGLISH;
    field public static final java.util.Locale FRANCE;
    field public static final java.util.Locale FRENCH;
    field public static final java.util.Locale GERMAN;
    field public static final java.util.Locale GERMANY;
    field public static final java.util.Locale ITALIAN;
    field public static final java.util.Locale ITALY;
    field public static final java.util.Locale JAPAN;
    field public static final java.util.Locale JAPANESE;
    field public static final java.util.Locale KOREA;
    field public static final java.util.Locale KOREAN;
    field public static final java.util.Locale PRC;
    field public static final java.util.Locale SIMPLIFIED_CHINESE;
    field public static final java.util.Locale TAIWAN;
    field public static final java.util.Locale TRADITIONAL_CHINESE;
    field public static final java.util.Locale UK;
    field public static final java.util.Locale US;
  }

  public interface Map<K, V> {
    method public void clear();
    method public boolean containsKey(Object);
    method public boolean containsValue(Object);
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
    method public boolean equals(Object);
    method public V get(Object);
    method public int hashCode();
    method public boolean isEmpty();
    method public java.util.Set<K> keySet();
    method public V put(K, V);
    method public void putAll(java.util.Map<? extends K,? extends V>);
    method public V remove(Object);
    method public int size();
    method public java.util.Collection<V> values();
  }

  public static interface Map.Entry<K, V> {
    method public boolean equals(Object);
    method public K getKey();
    method public V getValue();
    method public int hashCode();
    method public V setValue(V);
  }

  public class MissingFormatArgumentException extends java.util.IllegalFormatException {
    ctor public MissingFormatArgumentException(String);
    method public String getFormatSpecifier();
  }

  public class MissingFormatWidthException extends java.util.IllegalFormatException {
    ctor public MissingFormatWidthException(String);
    method public String getFormatSpecifier();
  }

  public class MissingResourceException extends java.lang.RuntimeException {
    ctor public MissingResourceException(String, String, String);
    method public String getClassName();
    method public String getKey();
  }

  public class NoSuchElementException extends java.lang.RuntimeException {
    ctor public NoSuchElementException();
    ctor public NoSuchElementException(String);
  }

  public class Observable {
    ctor public Observable();
    method public void addObserver(java.util.Observer);
    method protected void clearChanged();
    method public int countObservers();
    method public void deleteObserver(java.util.Observer);
    method public void deleteObservers();
    method public boolean hasChanged();
    method public void notifyObservers();
    method public void notifyObservers(Object);
    method protected void setChanged();
  }

  public interface Observer {
    method public void update(java.util.Observable, Object);
  }

  public class PriorityQueue<E> extends java.util.AbstractQueue<E> implements java.io.Serializable {
    ctor public PriorityQueue();
    ctor public PriorityQueue(int);
    ctor public PriorityQueue(int, java.util.Comparator<? super E>);
    ctor public PriorityQueue(java.util.Collection<? extends E>);
    ctor public PriorityQueue(java.util.PriorityQueue<? extends E>);
    ctor public PriorityQueue(java.util.SortedSet<? extends E>);
    method public java.util.Comparator<? super E> comparator();
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E);
    method public E peek();
    method public E poll();
    method public int size();
  }

  public class Properties extends java.util.Hashtable<java.lang.Object,java.lang.Object> {
    ctor public Properties();
    ctor public Properties(java.util.Properties);
    method public String getProperty(String);
    method public String getProperty(String, String);
    method public void list(java.io.PrintStream);
    method public void list(java.io.PrintWriter);
    method public void load(java.io.InputStream) throws java.io.IOException;
    method public void loadFromXML(java.io.InputStream) throws java.io.IOException, java.util.InvalidPropertiesFormatException;
    method public java.util.Enumeration<?> propertyNames();
    method public void save(java.io.OutputStream, String);
    method public Object setProperty(String, String);
    method public void store(java.io.OutputStream, String) throws java.io.IOException;
    method public void storeToXML(java.io.OutputStream, String) throws java.io.IOException;
    method public void storeToXML(java.io.OutputStream, String, String) throws java.io.IOException;
    field protected java.util.Properties defaults;
  }

  public final class PropertyPermission extends java.security.BasicPermission {
    ctor public PropertyPermission(String, String);
  }

  public class PropertyResourceBundle extends java.util.ResourceBundle {
    ctor public PropertyResourceBundle(java.io.InputStream) throws java.io.IOException;
    method public java.util.Enumeration<java.lang.String> getKeys();
    method public Object handleGetObject(String);
  }

  public interface Queue<E> extends java.util.Collection<E> {
    method public E element();
    method public boolean offer(E);
    method public E peek();
    method public E poll();
    method public E remove();
  }

  public class Random implements java.io.Serializable {
    ctor public Random();
    ctor public Random(long);
    method protected int next(int);
    method public boolean nextBoolean();
    method public void nextBytes(byte[]);
    method public double nextDouble();
    method public float nextFloat();
    method public double nextGaussian();
    method public int nextInt();
    method public int nextInt(int);
    method public long nextLong();
    method public void setSeed(long);
  }

  public interface RandomAccess {
  }

  public abstract class ResourceBundle {
    ctor public ResourceBundle();
    method public static final java.util.ResourceBundle getBundle(String) throws java.util.MissingResourceException;
    method public static final java.util.ResourceBundle getBundle(String, java.util.Locale);
    method public static java.util.ResourceBundle getBundle(String, java.util.Locale, ClassLoader) throws java.util.MissingResourceException;
    method public abstract java.util.Enumeration<java.lang.String> getKeys();
    method public java.util.Locale getLocale();
    method public final Object getObject(String);
    method public final String getString(String);
    method public final String[] getStringArray(String);
    method protected abstract Object handleGetObject(String);
    method protected void setParent(java.util.ResourceBundle);
    field protected java.util.ResourceBundle parent;
  }

  public final class Scanner implements java.util.Iterator<java.lang.String> {
    ctor public Scanner(java.io.File) throws java.io.FileNotFoundException;
    ctor public Scanner(java.io.File, String) throws java.io.FileNotFoundException;
    ctor public Scanner(String);
    ctor public Scanner(java.io.InputStream);
    ctor public Scanner(java.io.InputStream, String);
    ctor public Scanner(Readable);
    ctor public Scanner(java.nio.channels.ReadableByteChannel);
    ctor public Scanner(java.nio.channels.ReadableByteChannel, String);
    method public void close();
    method public java.util.regex.Pattern delimiter();
    method public String findInLine(java.util.regex.Pattern);
    method public String findInLine(String);
    method public String findWithinHorizon(java.util.regex.Pattern, int);
    method public String findWithinHorizon(String, int);
    method public boolean hasNext();
    method public boolean hasNext(java.util.regex.Pattern);
    method public boolean hasNext(String);
    method public boolean hasNextBigDecimal();
    method public boolean hasNextBigInteger();
    method public boolean hasNextBigInteger(int);
    method public boolean hasNextBoolean();
    method public boolean hasNextByte();
    method public boolean hasNextByte(int);
    method public boolean hasNextDouble();
    method public boolean hasNextFloat();
    method public boolean hasNextInt();
    method public boolean hasNextInt(int);
    method public boolean hasNextLine();
    method public boolean hasNextLong();
    method public boolean hasNextLong(int);
    method public boolean hasNextShort();
    method public boolean hasNextShort(int);
    method public java.io.IOException ioException();
    method public java.util.Locale locale();
    method public java.util.regex.MatchResult match();
    method public String next();
    method public String next(java.util.regex.Pattern);
    method public String next(String);
    method public java.math.BigDecimal nextBigDecimal();
    method public java.math.BigInteger nextBigInteger();
    method public java.math.BigInteger nextBigInteger(int);
    method public boolean nextBoolean();
    method public byte nextByte();
    method public byte nextByte(int);
    method public double nextDouble();
    method public float nextFloat();
    method public int nextInt();
    method public int nextInt(int);
    method public String nextLine();
    method public long nextLong();
    method public long nextLong(int);
    method public short nextShort();
    method public short nextShort(int);
    method public int radix();
    method public void remove();
    method public java.util.Scanner skip(java.util.regex.Pattern);
    method public java.util.Scanner skip(String);
    method public java.util.Scanner useDelimiter(java.util.regex.Pattern);
    method public java.util.Scanner useDelimiter(String);
    method public java.util.Scanner useLocale(java.util.Locale);
    method public java.util.Scanner useRadix(int);
  }

  public interface Set<E> extends java.util.Collection<E> {
  }

  public class SimpleTimeZone extends java.util.TimeZone {
    ctor public SimpleTimeZone(int, String);
    ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int);
    ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int, int);
    ctor public SimpleTimeZone(int, String, int, int, int, int, int, int, int, int, int, int, int);
    method public int getOffset(int, int, int, int, int, int);
    method public int getRawOffset();
    method public boolean inDaylightTime(java.util.Date);
    method public void setDSTSavings(int);
    method public void setEndRule(int, int, int);
    method public void setEndRule(int, int, int, int);
    method public void setEndRule(int, int, int, int, boolean);
    method public void setRawOffset(int);
    method public void setStartRule(int, int, int);
    method public void setStartRule(int, int, int, int);
    method public void setStartRule(int, int, int, int, boolean);
    method public void setStartYear(int);
    method public boolean useDaylightTime();
    field public static final int STANDARD_TIME = 1; // 0x1
    field public static final int UTC_TIME = 2; // 0x2
    field public static final int WALL_TIME = 0; // 0x0
  }

  public interface SortedMap<K, V> extends java.util.Map<K,V> {
    method public java.util.Comparator<? super K> comparator();
    method public K firstKey();
    method public java.util.SortedMap<K,V> headMap(K);
    method public K lastKey();
    method public java.util.SortedMap<K,V> subMap(K, K);
    method public java.util.SortedMap<K,V> tailMap(K);
  }

  public interface SortedSet<E> extends java.util.Set<E> {
    method public java.util.Comparator<? super E> comparator();
    method public E first();
    method public java.util.SortedSet<E> headSet(E);
    method public E last();
    method public java.util.SortedSet<E> subSet(E, E);
    method public java.util.SortedSet<E> tailSet(E);
  }

  public class Stack<E> extends java.util.Vector<E> {
    ctor public Stack();
    method public boolean empty();
    method public E peek();
    method public E pop();
    method public E push(E);
    method public int search(Object);
  }

  public class StringTokenizer implements java.util.Enumeration<java.lang.Object> {
    ctor public StringTokenizer(String);
    ctor public StringTokenizer(String, String);
    ctor public StringTokenizer(String, String, boolean);
    method public int countTokens();
    method public boolean hasMoreElements();
    method public boolean hasMoreTokens();
    method public Object nextElement();
    method public String nextToken();
    method public String nextToken(String);
  }

  public abstract class TimeZone implements java.lang.Cloneable java.io.Serializable {
    ctor public TimeZone();
    method public Object clone();
    method public static String[] getAvailableIDs();
    method public static String[] getAvailableIDs(int);
    method public int getDSTSavings();
    method public static java.util.TimeZone getDefault();
    method public final String getDisplayName();
    method public final String getDisplayName(java.util.Locale);
    method public final String getDisplayName(boolean, int);
    method public String getDisplayName(boolean, int, java.util.Locale);
    method public String getID();
    method public int getOffset(long);
    method public abstract int getOffset(int, int, int, int, int, int);
    method public abstract int getRawOffset();
    method public static java.util.TimeZone getTimeZone(String);
    method public boolean hasSameRules(java.util.TimeZone);
    method public abstract boolean inDaylightTime(java.util.Date);
    method public static void setDefault(java.util.TimeZone);
    method public void setID(String);
    method public abstract void setRawOffset(int);
    method public abstract boolean useDaylightTime();
    field public static final int LONG = 1; // 0x1
    field public static final int SHORT = 0; // 0x0
  }

  public class Timer {
    ctor public Timer(boolean);
    ctor public Timer();
    ctor public Timer(String, boolean);
    ctor public Timer(String);
    method public void cancel();
    method public int purge();
    method public void schedule(java.util.TimerTask, java.util.Date);
    method public void schedule(java.util.TimerTask, long);
    method public void schedule(java.util.TimerTask, long, long);
    method public void schedule(java.util.TimerTask, java.util.Date, long);
    method public void scheduleAtFixedRate(java.util.TimerTask, long, long);
    method public void scheduleAtFixedRate(java.util.TimerTask, java.util.Date, long);
  }

  public abstract class TimerTask implements java.lang.Runnable {
    ctor protected TimerTask();
    method public boolean cancel();
    method public long scheduledExecutionTime();
  }

  public class TooManyListenersException extends java.lang.Exception {
    ctor public TooManyListenersException();
    ctor public TooManyListenersException(String);
  }

  public class TreeMap<K, V> extends java.util.AbstractMap<K,V> implements java.lang.Cloneable java.io.Serializable java.util.SortedMap<K,V> {
    ctor public TreeMap();
    ctor public TreeMap(java.util.Comparator<? super K>);
    ctor public TreeMap(java.util.Map<? extends K,? extends V>);
    ctor public TreeMap(java.util.SortedMap<K,? extends V>);
    method public Object clone();
    method public java.util.Comparator<? super K> comparator();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
    method public K firstKey();
    method public java.util.SortedMap<K,V> headMap(K);
    method public K lastKey();
    method public java.util.SortedMap<K,V> subMap(K, K);
    method public java.util.SortedMap<K,V> tailMap(K);
  }

  public class TreeSet<E> extends java.util.AbstractSet<E> implements java.lang.Cloneable java.io.Serializable java.util.SortedSet<E> {
    ctor public TreeSet();
    ctor public TreeSet(java.util.Collection<? extends E>);
    ctor public TreeSet(java.util.Comparator<? super E>);
    ctor public TreeSet(java.util.SortedSet<E>);
    method public Object clone();
    method public java.util.Comparator<? super E> comparator();
    method public E first();
    method public java.util.SortedSet<E> headSet(E);
    method public java.util.Iterator<E> iterator();
    method public E last();
    method public int size();
    method public java.util.SortedSet<E> subSet(E, E);
    method public java.util.SortedSet<E> tailSet(E);
  }

  public final class UUID implements java.lang.Comparable<java.util.UUID> java.io.Serializable {
    ctor public UUID(long, long);
    method public int clockSequence();
    method public int compareTo(java.util.UUID);
    method public static java.util.UUID fromString(String);
    method public long getLeastSignificantBits();
    method public long getMostSignificantBits();
    method public static java.util.UUID nameUUIDFromBytes(byte[]);
    method public long node();
    method public static java.util.UUID randomUUID();
    method public long timestamp();
    method public int variant();
    method public int version();
  }

  public class UnknownFormatConversionException extends java.util.IllegalFormatException {
    ctor public UnknownFormatConversionException(String);
    method public String getConversion();
  }

  public class UnknownFormatFlagsException extends java.util.IllegalFormatException {
    ctor public UnknownFormatFlagsException(String);
    method public String getFlags();
  }

  public class Vector<E> extends java.util.AbstractList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
    ctor public Vector();
    ctor public Vector(int);
    ctor public Vector(int, int);
    ctor public Vector(java.util.Collection<? extends E>);
    method public void addElement(E);
    method public int capacity();
    method public Object clone();
    method public void copyInto(Object[]);
    method public E elementAt(int);
    method public java.util.Enumeration<E> elements();
    method public void ensureCapacity(int);
    method public E firstElement();
    method public E get(int);
    method public int indexOf(Object, int);
    method public void insertElementAt(E, int);
    method public E lastElement();
    method public int lastIndexOf(Object, int);
    method public void removeAllElements();
    method public boolean removeElement(Object);
    method public void removeElementAt(int);
    method public void setElementAt(E, int);
    method public void setSize(int);
    method public int size();
    method public void trimToSize();
    field protected int capacityIncrement;
    field protected int elementCount;
    field protected Object[] elementData;
  }

  public class WeakHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.Map<K,V> {
    ctor public WeakHashMap();
    ctor public WeakHashMap(int);
    ctor public WeakHashMap(int, float);
    ctor public WeakHashMap(java.util.Map<? extends K,? extends V>);
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
  }

}

package java.util.concurrent {

  public abstract class AbstractExecutorService implements java.util.concurrent.ExecutorService {
    ctor public AbstractExecutorService();
    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public <T> T invokeAny(java.util.Collection<java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
    method public <T> T invokeAny(java.util.Collection<java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public java.util.concurrent.Future<?> submit(Runnable);
    method public <T> java.util.concurrent.Future<T> submit(Runnable, T);
    method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
  }

  public class ArrayBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
    ctor public ArrayBlockingQueue(int);
    ctor public ArrayBlockingQueue(int, boolean);
    ctor public ArrayBlockingQueue(int, boolean, java.util.Collection<? extends E>);
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E);
    method public boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public E peek();
    method public E poll();
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void put(E) throws java.lang.InterruptedException;
    method public int remainingCapacity();
    method public int size();
    method public E take() throws java.lang.InterruptedException;
  }

  public interface BlockingQueue<E> extends java.util.Queue<E> {
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void put(E) throws java.lang.InterruptedException;
    method public int remainingCapacity();
    method public E take() throws java.lang.InterruptedException;
  }

  public class BrokenBarrierException extends java.lang.Exception {
    ctor public BrokenBarrierException();
    ctor public BrokenBarrierException(String);
  }

  public interface Callable<V> {
    method public V call() throws java.lang.Exception;
  }

  public class CancellationException extends java.lang.IllegalStateException {
    ctor public CancellationException();
    ctor public CancellationException(String);
  }

  public interface CompletionService<V> {
    method public java.util.concurrent.Future<V> poll();
    method public java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
    method public java.util.concurrent.Future<V> submit(Runnable, V);
    method public java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
  }

  public class ConcurrentHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.concurrent.ConcurrentMap<K,V> java.io.Serializable {
    ctor public ConcurrentHashMap(int, float, int);
    ctor public ConcurrentHashMap(int);
    ctor public ConcurrentHashMap();
    ctor public ConcurrentHashMap(java.util.Map<? extends K,? extends V>);
    method public boolean contains(Object);
    method public java.util.Enumeration<V> elements();
    method public java.util.Set<java.util.Map.Entry<K,V>> entrySet();
    method public java.util.Enumeration<K> keys();
    method public V putIfAbsent(K, V);
    method public boolean remove(Object, Object);
    method public boolean replace(K, V, V);
    method public V replace(K, V);
  }

  public class ConcurrentLinkedQueue<E> extends java.util.AbstractQueue<E> implements java.util.Queue<E> java.io.Serializable {
    ctor public ConcurrentLinkedQueue();
    ctor public ConcurrentLinkedQueue(java.util.Collection<? extends E>);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E);
    method public E peek();
    method public E poll();
    method public int size();
  }

  public interface ConcurrentMap<K, V> extends java.util.Map<K,V> {
    method public V putIfAbsent(K, V);
    method public boolean remove(Object, Object);
    method public boolean replace(K, V, V);
    method public V replace(K, V);
  }

  public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable {
    ctor public CopyOnWriteArrayList();
    ctor public CopyOnWriteArrayList(java.util.Collection<? extends E>);
    ctor public CopyOnWriteArrayList(E[]);
    method public boolean add(E);
    method public void add(int, E);
    method public boolean addAll(java.util.Collection<? extends E>);
    method public boolean addAll(int, java.util.Collection<? extends E>);
    method public int addAllAbsent(java.util.Collection<? extends E>);
    method public boolean addIfAbsent(E);
    method public void clear();
    method public Object clone();
    method public boolean contains(Object);
    method public boolean containsAll(java.util.Collection<?>);
    method public E get(int);
    method public int indexOf(E, int);
    method public int indexOf(Object);
    method public boolean isEmpty();
    method public java.util.Iterator<E> iterator();
    method public int lastIndexOf(E, int);
    method public int lastIndexOf(Object);
    method public java.util.ListIterator<E> listIterator();
    method public java.util.ListIterator<E> listIterator(int);
    method public E remove(int);
    method public boolean remove(Object);
    method public boolean removeAll(java.util.Collection<?>);
    method public boolean retainAll(java.util.Collection<?>);
    method public E set(int, E);
    method public int size();
    method public java.util.List<E> subList(int, int);
    method public Object[] toArray();
    method public <T> T[] toArray(T[]);
  }

  public class CopyOnWriteArraySet<E> extends java.util.AbstractSet<E> implements java.io.Serializable {
    ctor public CopyOnWriteArraySet();
    ctor public CopyOnWriteArraySet(java.util.Collection<? extends E>);
    method public java.util.Iterator<E> iterator();
    method public int size();
  }

  public class CountDownLatch {
    ctor public CountDownLatch(int);
    method public void await() throws java.lang.InterruptedException;
    method public boolean await(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void countDown();
    method public long getCount();
  }

  public class CyclicBarrier {
    ctor public CyclicBarrier(int, Runnable);
    ctor public CyclicBarrier(int);
    method public int await() throws java.util.concurrent.BrokenBarrierException, java.lang.InterruptedException;
    method public int await(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.BrokenBarrierException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public int getNumberWaiting();
    method public int getParties();
    method public boolean isBroken();
    method public void reset();
  }

  public class DelayQueue<E extends java.util.concurrent.Delayed> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> {
    ctor public DelayQueue();
    ctor public DelayQueue(java.util.Collection<? extends E>);
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E);
    method public boolean offer(E, long, java.util.concurrent.TimeUnit);
    method public E peek();
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public E poll();
    method public void put(E);
    method public int remainingCapacity();
    method public int size();
    method public E take() throws java.lang.InterruptedException;
  }

  public interface Delayed extends java.lang.Comparable<java.util.concurrent.Delayed> {
    method public long getDelay(java.util.concurrent.TimeUnit);
  }

  public class Exchanger<V> {
    ctor public Exchanger();
    method public V exchange(V) throws java.lang.InterruptedException;
    method public V exchange(V, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException;
  }

  public class ExecutionException extends java.lang.Exception {
    ctor protected ExecutionException();
    ctor protected ExecutionException(String);
    ctor public ExecutionException(String, Throwable);
    ctor public ExecutionException(Throwable);
  }

  public interface Executor {
    method public void execute(Runnable);
  }

  public class ExecutorCompletionService<V> implements java.util.concurrent.CompletionService<V> {
    ctor public ExecutorCompletionService(java.util.concurrent.Executor);
    ctor public ExecutorCompletionService(java.util.concurrent.Executor, java.util.concurrent.BlockingQueue<java.util.concurrent.Future<V>>);
    method public java.util.concurrent.Future<V> poll();
    method public java.util.concurrent.Future<V> poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public java.util.concurrent.Future<V> submit(java.util.concurrent.Callable<V>);
    method public java.util.concurrent.Future<V> submit(Runnable, V);
    method public java.util.concurrent.Future<V> take() throws java.lang.InterruptedException;
  }

  public interface ExecutorService extends java.util.concurrent.Executor {
    method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<java.util.concurrent.Callable<T>>) throws java.lang.InterruptedException;
    method public <T> java.util.List<java.util.concurrent.Future<T>> invokeAll(java.util.Collection<java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public <T> T invokeAny(java.util.Collection<java.util.concurrent.Callable<T>>) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
    method public <T> T invokeAny(java.util.Collection<java.util.concurrent.Callable<T>>, long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public boolean isShutdown();
    method public boolean isTerminated();
    method public void shutdown();
    method public java.util.List<java.lang.Runnable> shutdownNow();
    method public <T> java.util.concurrent.Future<T> submit(java.util.concurrent.Callable<T>);
    method public <T> java.util.concurrent.Future<T> submit(Runnable, T);
    method public java.util.concurrent.Future<?> submit(Runnable);
  }

  public class Executors {
    method public static <T> java.util.concurrent.Callable<T> callable(Runnable, T);
    method public static java.util.concurrent.Callable<java.lang.Object> callable(Runnable);
    method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedAction);
    method public static java.util.concurrent.Callable<java.lang.Object> callable(java.security.PrivilegedExceptionAction);
    method public static java.util.concurrent.ThreadFactory defaultThreadFactory();
    method public static java.util.concurrent.ExecutorService newCachedThreadPool();
    method public static java.util.concurrent.ExecutorService newCachedThreadPool(java.util.concurrent.ThreadFactory);
    method public static java.util.concurrent.ExecutorService newFixedThreadPool(int);
    method public static java.util.concurrent.ExecutorService newFixedThreadPool(int, java.util.concurrent.ThreadFactory);
    method public static java.util.concurrent.ScheduledExecutorService newScheduledThreadPool(int);
    method public static java.util.concurrent.ScheduledExecutorService newScheduledThreadPool(int, java.util.concurrent.ThreadFactory);
    method public static java.util.concurrent.ExecutorService newSingleThreadExecutor();
    method public static java.util.concurrent.ExecutorService newSingleThreadExecutor(java.util.concurrent.ThreadFactory);
    method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor();
    method public static java.util.concurrent.ScheduledExecutorService newSingleThreadScheduledExecutor(java.util.concurrent.ThreadFactory);
    method public static <T> java.util.concurrent.Callable<T> privilegedCallable(java.util.concurrent.Callable<T>);
    method public static <T> java.util.concurrent.Callable<T> privilegedCallableUsingCurrentClassLoader(java.util.concurrent.Callable<T>);
    method public static java.util.concurrent.ThreadFactory privilegedThreadFactory();
    method public static java.util.concurrent.ExecutorService unconfigurableExecutorService(java.util.concurrent.ExecutorService);
    method public static java.util.concurrent.ScheduledExecutorService unconfigurableScheduledExecutorService(java.util.concurrent.ScheduledExecutorService);
  }

  public interface Future<V> {
    method public boolean cancel(boolean);
    method public V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
    method public V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public boolean isCancelled();
    method public boolean isDone();
  }

  public class FutureTask<V> implements java.util.concurrent.Future<V> java.lang.Runnable {
    ctor public FutureTask(java.util.concurrent.Callable<V>);
    ctor public FutureTask(Runnable, V);
    method public boolean cancel(boolean);
    method protected void done();
    method public V get() throws java.util.concurrent.ExecutionException, java.lang.InterruptedException;
    method public V get(long, java.util.concurrent.TimeUnit) throws java.util.concurrent.ExecutionException, java.lang.InterruptedException, java.util.concurrent.TimeoutException;
    method public boolean isCancelled();
    method public boolean isDone();
    method public void run();
    method protected boolean runAndReset();
    method protected void set(V);
    method protected void setException(Throwable);
  }

  public class LinkedBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
    ctor public LinkedBlockingQueue();
    ctor public LinkedBlockingQueue(int);
    ctor public LinkedBlockingQueue(java.util.Collection<? extends E>);
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public boolean offer(E);
    method public E peek();
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public E poll();
    method public void put(E) throws java.lang.InterruptedException;
    method public int remainingCapacity();
    method public int size();
    method public E take() throws java.lang.InterruptedException;
  }

  public class PriorityBlockingQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
    ctor public PriorityBlockingQueue();
    ctor public PriorityBlockingQueue(int);
    ctor public PriorityBlockingQueue(int, java.util.Comparator<? super E>);
    ctor public PriorityBlockingQueue(java.util.Collection<? extends E>);
    method public java.util.Comparator<? super E> comparator();
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E);
    method public boolean offer(E, long, java.util.concurrent.TimeUnit);
    method public E peek();
    method public E poll();
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void put(E);
    method public int remainingCapacity();
    method public int size();
    method public E take() throws java.lang.InterruptedException;
  }

  public class RejectedExecutionException extends java.lang.RuntimeException {
    ctor public RejectedExecutionException();
    ctor public RejectedExecutionException(String);
    ctor public RejectedExecutionException(String, Throwable);
    ctor public RejectedExecutionException(Throwable);
  }

  public interface RejectedExecutionHandler {
    method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
  }

  public interface ScheduledExecutorService extends java.util.concurrent.ExecutorService {
    method public java.util.concurrent.ScheduledFuture<?> schedule(Runnable, long, java.util.concurrent.TimeUnit);
    method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
    method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(Runnable, long, long, java.util.concurrent.TimeUnit);
    method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(Runnable, long, long, java.util.concurrent.TimeUnit);
  }

  public interface ScheduledFuture<V> extends java.util.concurrent.Delayed java.util.concurrent.Future<V> {
  }

  public class ScheduledThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor implements java.util.concurrent.ScheduledExecutorService {
    ctor public ScheduledThreadPoolExecutor(int);
    ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory);
    ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.RejectedExecutionHandler);
    ctor public ScheduledThreadPoolExecutor(int, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
    method public boolean getContinueExistingPeriodicTasksAfterShutdownPolicy();
    method public boolean getExecuteExistingDelayedTasksAfterShutdownPolicy();
    method public java.util.concurrent.ScheduledFuture<?> schedule(Runnable, long, java.util.concurrent.TimeUnit);
    method public <V> java.util.concurrent.ScheduledFuture<V> schedule(java.util.concurrent.Callable<V>, long, java.util.concurrent.TimeUnit);
    method public java.util.concurrent.ScheduledFuture<?> scheduleAtFixedRate(Runnable, long, long, java.util.concurrent.TimeUnit);
    method public java.util.concurrent.ScheduledFuture<?> scheduleWithFixedDelay(Runnable, long, long, java.util.concurrent.TimeUnit);
    method public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean);
    method public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean);
  }

  public class Semaphore implements java.io.Serializable {
    ctor public Semaphore(int);
    ctor public Semaphore(int, boolean);
    method public void acquire() throws java.lang.InterruptedException;
    method public void acquire(int) throws java.lang.InterruptedException;
    method public void acquireUninterruptibly();
    method public void acquireUninterruptibly(int);
    method public int availablePermits();
    method public int drainPermits();
    method public final int getQueueLength();
    method protected java.util.Collection<java.lang.Thread> getQueuedThreads();
    method public final boolean hasQueuedThreads();
    method public boolean isFair();
    method protected void reducePermits(int);
    method public void release();
    method public void release(int);
    method public boolean tryAcquire();
    method public boolean tryAcquire(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public boolean tryAcquire(int);
    method public boolean tryAcquire(int, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
  }

  public class SynchronousQueue<E> extends java.util.AbstractQueue<E> implements java.util.concurrent.BlockingQueue<E> java.io.Serializable {
    ctor public SynchronousQueue();
    ctor public SynchronousQueue(boolean);
    method public int drainTo(java.util.Collection<? super E>);
    method public int drainTo(java.util.Collection<? super E>, int);
    method public java.util.Iterator<E> iterator();
    method public boolean offer(E, long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public boolean offer(E);
    method public E peek();
    method public E poll(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public E poll();
    method public void put(E) throws java.lang.InterruptedException;
    method public int remainingCapacity();
    method public int size();
    method public E take() throws java.lang.InterruptedException;
  }

  public interface ThreadFactory {
    method public Thread newThread(Runnable);
  }

  public class ThreadPoolExecutor extends java.util.concurrent.AbstractExecutorService {
    ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>);
    ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory);
    ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.RejectedExecutionHandler);
    ctor public ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler);
    method protected void afterExecute(Runnable, Throwable);
    method public boolean awaitTermination(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method protected void beforeExecute(Thread, Runnable);
    method public void execute(Runnable);
    method protected void finalize();
    method public int getActiveCount();
    method public long getCompletedTaskCount();
    method public int getCorePoolSize();
    method public long getKeepAliveTime(java.util.concurrent.TimeUnit);
    method public int getLargestPoolSize();
    method public int getMaximumPoolSize();
    method public int getPoolSize();
    method public java.util.concurrent.BlockingQueue<java.lang.Runnable> getQueue();
    method public java.util.concurrent.RejectedExecutionHandler getRejectedExecutionHandler();
    method public long getTaskCount();
    method public java.util.concurrent.ThreadFactory getThreadFactory();
    method public boolean isShutdown();
    method public boolean isTerminated();
    method public boolean isTerminating();
    method public int prestartAllCoreThreads();
    method public boolean prestartCoreThread();
    method public void purge();
    method public boolean remove(Runnable);
    method public void setCorePoolSize(int);
    method public void setKeepAliveTime(long, java.util.concurrent.TimeUnit);
    method public void setMaximumPoolSize(int);
    method public void setRejectedExecutionHandler(java.util.concurrent.RejectedExecutionHandler);
    method public void setThreadFactory(java.util.concurrent.ThreadFactory);
    method public void shutdown();
    method public java.util.List<java.lang.Runnable> shutdownNow();
    method protected void terminated();
  }

  public static class ThreadPoolExecutor.AbortPolicy implements java.util.concurrent.RejectedExecutionHandler {
    ctor public ThreadPoolExecutor.AbortPolicy();
    method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
  }

  public static class ThreadPoolExecutor.CallerRunsPolicy implements java.util.concurrent.RejectedExecutionHandler {
    ctor public ThreadPoolExecutor.CallerRunsPolicy();
    method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
  }

  public static class ThreadPoolExecutor.DiscardOldestPolicy implements java.util.concurrent.RejectedExecutionHandler {
    ctor public ThreadPoolExecutor.DiscardOldestPolicy();
    method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
  }

  public static class ThreadPoolExecutor.DiscardPolicy implements java.util.concurrent.RejectedExecutionHandler {
    ctor public ThreadPoolExecutor.DiscardPolicy();
    method public void rejectedExecution(Runnable, java.util.concurrent.ThreadPoolExecutor);
  }

  public enum TimeUnit {
    method public long convert(long, java.util.concurrent.TimeUnit);
    method public void sleep(long) throws java.lang.InterruptedException;
    method public void timedJoin(Thread, long) throws java.lang.InterruptedException;
    method public void timedWait(Object, long) throws java.lang.InterruptedException;
    method public long toMicros(long);
    method public long toMillis(long);
    method public long toNanos(long);
    method public long toSeconds(long);
    enum_constant public static final java.util.concurrent.TimeUnit MICROSECONDS;
    enum_constant public static final java.util.concurrent.TimeUnit MILLISECONDS;
    enum_constant public static final java.util.concurrent.TimeUnit NANOSECONDS;
    enum_constant public static final java.util.concurrent.TimeUnit SECONDS;
  }

  public class TimeoutException extends java.lang.Exception {
    ctor public TimeoutException();
    ctor public TimeoutException(String);
  }

}

package java.util.concurrent.atomic {

  public class AtomicBoolean implements java.io.Serializable {
    ctor public AtomicBoolean(boolean);
    ctor public AtomicBoolean();
    method public final boolean compareAndSet(boolean, boolean);
    method public final boolean get();
    method public final boolean getAndSet(boolean);
    method public final void set(boolean);
    method public boolean weakCompareAndSet(boolean, boolean);
  }

  public class AtomicInteger extends java.lang.Number implements java.io.Serializable {
    ctor public AtomicInteger(int);
    ctor public AtomicInteger();
    method public final int addAndGet(int);
    method public final boolean compareAndSet(int, int);
    method public final int decrementAndGet();
    method public double doubleValue();
    method public float floatValue();
    method public final int get();
    method public final int getAndAdd(int);
    method public final int getAndDecrement();
    method public final int getAndIncrement();
    method public final int getAndSet(int);
    method public final int incrementAndGet();
    method public int intValue();
    method public long longValue();
    method public final void set(int);
    method public final boolean weakCompareAndSet(int, int);
  }

  public class AtomicIntegerArray implements java.io.Serializable {
    ctor public AtomicIntegerArray(int);
    ctor public AtomicIntegerArray(int[]);
    method public final int addAndGet(int, int);
    method public final boolean compareAndSet(int, int, int);
    method public final int decrementAndGet(int);
    method public final int get(int);
    method public final int getAndAdd(int, int);
    method public final int getAndDecrement(int);
    method public final int getAndIncrement(int);
    method public final int getAndSet(int, int);
    method public final int incrementAndGet(int);
    method public final int length();
    method public final void set(int, int);
    method public final boolean weakCompareAndSet(int, int, int);
  }

  public abstract class AtomicIntegerFieldUpdater<T> {
    ctor protected AtomicIntegerFieldUpdater();
    method public int addAndGet(T, int);
    method public abstract boolean compareAndSet(T, int, int);
    method public int decrementAndGet(T);
    method public abstract int get(T);
    method public int getAndAdd(T, int);
    method public int getAndDecrement(T);
    method public int getAndIncrement(T);
    method public int getAndSet(T, int);
    method public int incrementAndGet(T);
    method public static <U> java.util.concurrent.atomic.AtomicIntegerFieldUpdater<U> newUpdater(Class<U>, String);
    method public abstract void set(T, int);
    method public abstract boolean weakCompareAndSet(T, int, int);
  }

  public class AtomicLong extends java.lang.Number implements java.io.Serializable {
    ctor public AtomicLong(long);
    ctor public AtomicLong();
    method public final long addAndGet(long);
    method public final boolean compareAndSet(long, long);
    method public final long decrementAndGet();
    method public double doubleValue();
    method public float floatValue();
    method public final long get();
    method public final long getAndAdd(long);
    method public final long getAndDecrement();
    method public final long getAndIncrement();
    method public final long getAndSet(long);
    method public final long incrementAndGet();
    method public int intValue();
    method public long longValue();
    method public final void set(long);
    method public final boolean weakCompareAndSet(long, long);
  }

  public class AtomicLongArray implements java.io.Serializable {
    ctor public AtomicLongArray(int);
    ctor public AtomicLongArray(long[]);
    method public long addAndGet(int, long);
    method public final boolean compareAndSet(int, long, long);
    method public final long decrementAndGet(int);
    method public final long get(int);
    method public final long getAndAdd(int, long);
    method public final long getAndDecrement(int);
    method public final long getAndIncrement(int);
    method public final long getAndSet(int, long);
    method public final long incrementAndGet(int);
    method public final int length();
    method public final void set(int, long);
    method public final boolean weakCompareAndSet(int, long, long);
  }

  public abstract class AtomicLongFieldUpdater<T> {
    ctor protected AtomicLongFieldUpdater();
    method public long addAndGet(T, long);
    method public abstract boolean compareAndSet(T, long, long);
    method public long decrementAndGet(T);
    method public abstract long get(T);
    method public long getAndAdd(T, long);
    method public long getAndDecrement(T);
    method public long getAndIncrement(T);
    method public long getAndSet(T, long);
    method public long incrementAndGet(T);
    method public static <U> java.util.concurrent.atomic.AtomicLongFieldUpdater<U> newUpdater(Class<U>, String);
    method public abstract void set(T, long);
    method public abstract boolean weakCompareAndSet(T, long, long);
  }

  public class AtomicMarkableReference<V> {
    ctor public AtomicMarkableReference(V, boolean);
    method public boolean attemptMark(V, boolean);
    method public boolean compareAndSet(V, V, boolean, boolean);
    method public V get(boolean[]);
    method public V getReference();
    method public boolean isMarked();
    method public void set(V, boolean);
    method public boolean weakCompareAndSet(V, V, boolean, boolean);
  }

  public class AtomicReference<V> implements java.io.Serializable {
    ctor public AtomicReference(V);
    ctor public AtomicReference();
    method public final boolean compareAndSet(V, V);
    method public final V get();
    method public final V getAndSet(V);
    method public final void set(V);
    method public final boolean weakCompareAndSet(V, V);
  }

  public class AtomicReferenceArray<E> implements java.io.Serializable {
    ctor public AtomicReferenceArray(int);
    ctor public AtomicReferenceArray(E[]);
    method public final boolean compareAndSet(int, E, E);
    method public final E get(int);
    method public final E getAndSet(int, E);
    method public final int length();
    method public final void set(int, E);
    method public final boolean weakCompareAndSet(int, E, E);
  }

  public abstract class AtomicReferenceFieldUpdater<T, V> {
    ctor protected AtomicReferenceFieldUpdater();
    method public abstract boolean compareAndSet(T, V, V);
    method public abstract V get(T);
    method public V getAndSet(T, V);
    method public static <U, W> java.util.concurrent.atomic.AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U>, Class<W>, String);
    method public abstract void set(T, V);
    method public abstract boolean weakCompareAndSet(T, V, V);
  }

  public class AtomicStampedReference<V> {
    ctor public AtomicStampedReference(V, int);
    method public boolean attemptStamp(V, int);
    method public boolean compareAndSet(V, V, int, int);
    method public V get(int[]);
    method public V getReference();
    method public int getStamp();
    method public void set(V, int);
    method public boolean weakCompareAndSet(V, V, int, int);
  }

}

package java.util.concurrent.locks {

  public abstract class AbstractQueuedSynchronizer implements java.io.Serializable {
    ctor protected AbstractQueuedSynchronizer();
    method public final void acquire(int);
    method public final void acquireInterruptibly(int) throws java.lang.InterruptedException;
    method public final void acquireShared(int);
    method public final void acquireSharedInterruptibly(int) throws java.lang.InterruptedException;
    method protected final boolean compareAndSetState(int, int);
    method public final java.util.Collection<java.lang.Thread> getExclusiveQueuedThreads();
    method public final Thread getFirstQueuedThread();
    method public final int getQueueLength();
    method public final java.util.Collection<java.lang.Thread> getQueuedThreads();
    method public final java.util.Collection<java.lang.Thread> getSharedQueuedThreads();
    method protected final int getState();
    method public final int getWaitQueueLength(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
    method public final java.util.Collection<java.lang.Thread> getWaitingThreads(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
    method public final boolean hasContended();
    method public final boolean hasQueuedThreads();
    method public final boolean hasWaiters(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
    method protected boolean isHeldExclusively();
    method public final boolean isQueued(Thread);
    method public final boolean owns(java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject);
    method public final boolean release(int);
    method public final boolean releaseShared(int);
    method protected final void setState(int);
    method protected boolean tryAcquire(int);
    method public final boolean tryAcquireNanos(int, long) throws java.lang.InterruptedException;
    method protected int tryAcquireShared(int);
    method public final boolean tryAcquireSharedNanos(int, long) throws java.lang.InterruptedException;
    method protected boolean tryRelease(int);
    method protected boolean tryReleaseShared(int);
  }

  public class AbstractQueuedSynchronizer.ConditionObject implements java.util.concurrent.locks.Condition java.io.Serializable {
    ctor public AbstractQueuedSynchronizer.ConditionObject();
    method public final void await() throws java.lang.InterruptedException;
    method public final boolean await(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public final long awaitNanos(long) throws java.lang.InterruptedException;
    method public final void awaitUninterruptibly();
    method public final boolean awaitUntil(java.util.Date) throws java.lang.InterruptedException;
    method protected final int getWaitQueueLength();
    method protected final java.util.Collection<java.lang.Thread> getWaitingThreads();
    method protected final boolean hasWaiters();
    method public final void signal();
    method public final void signalAll();
  }

  public interface Condition {
    method public void await() throws java.lang.InterruptedException;
    method public boolean await(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public long awaitNanos(long) throws java.lang.InterruptedException;
    method public void awaitUninterruptibly();
    method public boolean awaitUntil(java.util.Date) throws java.lang.InterruptedException;
    method public void signal();
    method public void signalAll();
  }

  public interface Lock {
    method public void lock();
    method public void lockInterruptibly() throws java.lang.InterruptedException;
    method public java.util.concurrent.locks.Condition newCondition();
    method public boolean tryLock();
    method public boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void unlock();
  }

  public class LockSupport {
    method public static void park();
    method public static void parkNanos(long);
    method public static void parkUntil(long);
    method public static void unpark(Thread);
  }

  public interface ReadWriteLock {
    method public java.util.concurrent.locks.Lock readLock();
    method public java.util.concurrent.locks.Lock writeLock();
  }

  public class ReentrantLock implements java.util.concurrent.locks.Lock java.io.Serializable {
    ctor public ReentrantLock();
    ctor public ReentrantLock(boolean);
    method public int getHoldCount();
    method protected Thread getOwner();
    method public final int getQueueLength();
    method protected java.util.Collection<java.lang.Thread> getQueuedThreads();
    method public int getWaitQueueLength(java.util.concurrent.locks.Condition);
    method protected java.util.Collection<java.lang.Thread> getWaitingThreads(java.util.concurrent.locks.Condition);
    method public final boolean hasQueuedThread(Thread);
    method public final boolean hasQueuedThreads();
    method public boolean hasWaiters(java.util.concurrent.locks.Condition);
    method public final boolean isFair();
    method public boolean isHeldByCurrentThread();
    method public boolean isLocked();
    method public void lock();
    method public void lockInterruptibly() throws java.lang.InterruptedException;
    method public java.util.concurrent.locks.Condition newCondition();
    method public boolean tryLock();
    method public boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void unlock();
  }

  public class ReentrantReadWriteLock implements java.util.concurrent.locks.ReadWriteLock java.io.Serializable {
    ctor public ReentrantReadWriteLock();
    ctor public ReentrantReadWriteLock(boolean);
    method protected Thread getOwner();
    method public final int getQueueLength();
    method protected java.util.Collection<java.lang.Thread> getQueuedReaderThreads();
    method protected java.util.Collection<java.lang.Thread> getQueuedThreads();
    method protected java.util.Collection<java.lang.Thread> getQueuedWriterThreads();
    method public int getReadLockCount();
    method public int getWaitQueueLength(java.util.concurrent.locks.Condition);
    method protected java.util.Collection<java.lang.Thread> getWaitingThreads(java.util.concurrent.locks.Condition);
    method public int getWriteHoldCount();
    method public final boolean hasQueuedThread(Thread);
    method public final boolean hasQueuedThreads();
    method public boolean hasWaiters(java.util.concurrent.locks.Condition);
    method public final boolean isFair();
    method public boolean isWriteLocked();
    method public boolean isWriteLockedByCurrentThread();
    method public java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock readLock();
    method public java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock writeLock();
  }

  public static class ReentrantReadWriteLock.ReadLock implements java.util.concurrent.locks.Lock java.io.Serializable {
    ctor protected ReentrantReadWriteLock.ReadLock(java.util.concurrent.locks.ReentrantReadWriteLock);
    method public void lock();
    method public void lockInterruptibly() throws java.lang.InterruptedException;
    method public java.util.concurrent.locks.Condition newCondition();
    method public boolean tryLock();
    method public boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void unlock();
  }

  public static class ReentrantReadWriteLock.WriteLock implements java.util.concurrent.locks.Lock java.io.Serializable {
    ctor protected ReentrantReadWriteLock.WriteLock(java.util.concurrent.locks.ReentrantReadWriteLock);
    method public void lock();
    method public void lockInterruptibly() throws java.lang.InterruptedException;
    method public java.util.concurrent.locks.Condition newCondition();
    method public boolean tryLock();
    method public boolean tryLock(long, java.util.concurrent.TimeUnit) throws java.lang.InterruptedException;
    method public void unlock();
  }

}

package java.util.jar {

  public class Attributes implements java.lang.Cloneable java.util.Map<java.lang.Object,java.lang.Object> {
    ctor public Attributes();
    ctor public Attributes(java.util.jar.Attributes);
    ctor public Attributes(int);
    method public void clear();
    method public Object clone();
    method public boolean containsKey(Object);
    method public boolean containsValue(Object);
    method public java.util.Set<java.util.Map.Entry<java.lang.Object,java.lang.Object>> entrySet();
    method public Object get(Object);
    method public String getValue(java.util.jar.Attributes.Name);
    method public String getValue(String);
    method public boolean isEmpty();
    method public java.util.Set<java.lang.Object> keySet();
    method public Object put(Object, Object);
    method public void putAll(java.util.Map<?,?>);
    method public String putValue(String, String);
    method public Object remove(Object);
    method public int size();
    method public java.util.Collection<java.lang.Object> values();
    field protected java.util.Map<java.lang.Object,java.lang.Object> map;
  }

  public static class Attributes.Name {
    ctor public Attributes.Name(String);
    field public static final java.util.jar.Attributes.Name CLASS_PATH;
    field public static final java.util.jar.Attributes.Name CONTENT_TYPE;
    field public static final java.util.jar.Attributes.Name EXTENSION_INSTALLATION;
    field public static final java.util.jar.Attributes.Name EXTENSION_LIST;
    field public static final java.util.jar.Attributes.Name EXTENSION_NAME;
    field public static final java.util.jar.Attributes.Name IMPLEMENTATION_TITLE;
    field public static final java.util.jar.Attributes.Name IMPLEMENTATION_URL;
    field public static final java.util.jar.Attributes.Name IMPLEMENTATION_VENDOR;
    field public static final java.util.jar.Attributes.Name IMPLEMENTATION_VENDOR_ID;
    field public static final java.util.jar.Attributes.Name IMPLEMENTATION_VERSION;
    field public static final java.util.jar.Attributes.Name MAIN_CLASS;
    field public static final java.util.jar.Attributes.Name MANIFEST_VERSION;
    field public static final java.util.jar.Attributes.Name SEALED;
    field public static final java.util.jar.Attributes.Name SIGNATURE_VERSION;
    field public static final java.util.jar.Attributes.Name SPECIFICATION_TITLE;
    field public static final java.util.jar.Attributes.Name SPECIFICATION_VENDOR;
    field public static final java.util.jar.Attributes.Name SPECIFICATION_VERSION;
  }

  public class JarEntry extends java.util.zip.ZipEntry {
    ctor public JarEntry(String);
    ctor public JarEntry(java.util.zip.ZipEntry);
    ctor public JarEntry(java.util.jar.JarEntry);
    method public java.util.jar.Attributes getAttributes() throws java.io.IOException;
    method public java.security.cert.Certificate[] getCertificates();
    method public java.security.CodeSigner[] getCodeSigners();
  }

  public class JarException extends java.util.zip.ZipException {
    ctor public JarException();
    ctor public JarException(String);
  }

  public class JarFile extends java.util.zip.ZipFile {
    ctor public JarFile(java.io.File) throws java.io.IOException;
    ctor public JarFile(java.io.File, boolean) throws java.io.IOException;
    ctor public JarFile(java.io.File, boolean, int) throws java.io.IOException;
    ctor public JarFile(String) throws java.io.IOException;
    ctor public JarFile(String, boolean) throws java.io.IOException;
    method public java.util.Enumeration<java.util.jar.JarEntry> entries();
    method public java.util.jar.JarEntry getJarEntry(String);
    method public java.util.jar.Manifest getManifest() throws java.io.IOException;
    field public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF";
  }

  public class JarInputStream extends java.util.zip.ZipInputStream {
    ctor public JarInputStream(java.io.InputStream, boolean) throws java.io.IOException;
    ctor public JarInputStream(java.io.InputStream) throws java.io.IOException;
    method public java.util.jar.Manifest getManifest();
    method public java.util.jar.JarEntry getNextJarEntry() throws java.io.IOException;
  }

  public class JarOutputStream extends java.util.zip.ZipOutputStream {
    ctor public JarOutputStream(java.io.OutputStream, java.util.jar.Manifest) throws java.io.IOException;
    ctor public JarOutputStream(java.io.OutputStream) throws java.io.IOException;
  }

  public class Manifest implements java.lang.Cloneable {
    ctor public Manifest();
    ctor public Manifest(java.io.InputStream) throws java.io.IOException;
    ctor public Manifest(java.util.jar.Manifest);
    method public void clear();
    method public Object clone();
    method public java.util.jar.Attributes getAttributes(String);
    method public java.util.Map<java.lang.String,java.util.jar.Attributes> getEntries();
    method public java.util.jar.Attributes getMainAttributes();
    method public void read(java.io.InputStream) throws java.io.IOException;
    method public void write(java.io.OutputStream) throws java.io.IOException;
  }

  public abstract class Pack200 {
    method public static java.util.jar.Pack200.Packer newPacker();
    method public static java.util.jar.Pack200.Unpacker newUnpacker();
  }

  public static interface Pack200.Packer {
    method public void addPropertyChangeListener(java.beans.PropertyChangeListener);
    method public void pack(java.util.jar.JarFile, java.io.OutputStream) throws java.io.IOException;
    method public void pack(java.util.jar.JarInputStream, java.io.OutputStream) throws java.io.IOException;
    method public java.util.SortedMap<java.lang.String,java.lang.String> properties();
    method public void removePropertyChangeListener(java.beans.PropertyChangeListener);
    field public static final String CLASS_ATTRIBUTE_PFX = "pack.class.attribute.";
    field public static final String CODE_ATTRIBUTE_PFX = "pack.code.attribute.";
    field public static final String DEFLATE_HINT = "pack.deflate.hint";
    field public static final String EFFORT = "pack.effort";
    field public static final String ERROR = "error";
    field public static final String FALSE = "false";
    field public static final String FIELD_ATTRIBUTE_PFX = "pack.field.attribute.";
    field public static final String KEEP = "keep";
    field public static final String KEEP_FILE_ORDER = "pack.keep.file.order";
    field public static final String LATEST = "latest";
    field public static final String METHOD_ATTRIBUTE_PFX = "pack.method.attribute.";
    field public static final String MODIFICATION_TIME = "pack.modification.time";
    field public static final String PASS = "pass";
    field public static final String PASS_FILE_PFX = "pack.pass.file.";
    field public static final String PROGRESS = "pack.progress";
    field public static final String SEGMENT_LIMIT = "pack.segment.limit";
    field public static final String STRIP = "strip";
    field public static final String TRUE = "true";
    field public static final String UNKNOWN_ATTRIBUTE = "pack.unknown.attribute";
  }

  public static interface Pack200.Unpacker {
    method public void addPropertyChangeListener(java.beans.PropertyChangeListener);
    method public java.util.SortedMap<java.lang.String,java.lang.String> properties();
    method public void removePropertyChangeListener(java.beans.PropertyChangeListener);
    method public void unpack(java.io.InputStream, java.util.jar.JarOutputStream) throws java.io.IOException;
    method public void unpack(java.io.File, java.util.jar.JarOutputStream) throws java.io.IOException;
    field public static final String DEFLATE_HINT = "unpack.deflate.hint";
    field public static final String FALSE = "false";
    field public static final String KEEP = "keep";
    field public static final String PROGRESS = "unpack.progress";
    field public static final String TRUE = "true";
  }

}

package java.util.logging {

  public class ConsoleHandler extends java.util.logging.StreamHandler {
    ctor public ConsoleHandler();
  }

  public class ErrorManager {
    ctor public ErrorManager();
    method public void error(String, Exception, int);
    field public static final int CLOSE_FAILURE = 3; // 0x3
    field public static final int FLUSH_FAILURE = 2; // 0x2
    field public static final int FORMAT_FAILURE = 5; // 0x5
    field public static final int GENERIC_FAILURE = 0; // 0x0
    field public static final int OPEN_FAILURE = 4; // 0x4
    field public static final int WRITE_FAILURE = 1; // 0x1
  }

  public class FileHandler extends java.util.logging.StreamHandler {
    ctor public FileHandler() throws java.io.IOException;
    ctor public FileHandler(String) throws java.io.IOException;
    ctor public FileHandler(String, boolean) throws java.io.IOException;
    ctor public FileHandler(String, int, int) throws java.io.IOException;
    ctor public FileHandler(String, int, int, boolean) throws java.io.IOException;
  }

  public interface Filter {
    method public boolean isLoggable(java.util.logging.LogRecord);
  }

  public abstract class Formatter {
    ctor protected Formatter();
    method public abstract String format(java.util.logging.LogRecord);
    method public String formatMessage(java.util.logging.LogRecord);
    method public String getHead(java.util.logging.Handler);
    method public String getTail(java.util.logging.Handler);
  }

  public abstract class Handler {
    ctor protected Handler();
    method public abstract void close();
    method public abstract void flush();
    method public String getEncoding();
    method public java.util.logging.ErrorManager getErrorManager();
    method public java.util.logging.Filter getFilter();
    method public java.util.logging.Formatter getFormatter();
    method public java.util.logging.Level getLevel();
    method public boolean isLoggable(java.util.logging.LogRecord);
    method public abstract void publish(java.util.logging.LogRecord);
    method protected void reportError(String, Exception, int);
    method public void setEncoding(String) throws java.lang.SecurityException, java.io.UnsupportedEncodingException;
    method public void setErrorManager(java.util.logging.ErrorManager);
    method public void setFilter(java.util.logging.Filter);
    method public void setFormatter(java.util.logging.Formatter);
    method public void setLevel(java.util.logging.Level);
  }

  public class Level implements java.io.Serializable {
    ctor protected Level(String, int);
    ctor protected Level(String, int, String);
    method public String getLocalizedName();
    method public String getName();
    method public String getResourceBundleName();
    method public final int intValue();
    method public static java.util.logging.Level parse(String) throws java.lang.IllegalArgumentException;
    method public final String toString();
    field public static final java.util.logging.Level ALL;
    field public static final java.util.logging.Level CONFIG;
    field public static final java.util.logging.Level FINE;
    field public static final java.util.logging.Level FINER;
    field public static final java.util.logging.Level FINEST;
    field public static final java.util.logging.Level INFO;
    field public static final java.util.logging.Level OFF;
    field public static final java.util.logging.Level SEVERE;
    field public static final java.util.logging.Level WARNING;
  }

  public class LogManager {
    ctor protected LogManager();
    method public boolean addLogger(java.util.logging.Logger);
    method public void addPropertyChangeListener(java.beans.PropertyChangeListener);
    method public void checkAccess();
    method public static java.util.logging.LogManager getLogManager();
    method public java.util.logging.Logger getLogger(String);
    method public java.util.Enumeration<java.lang.String> getLoggerNames();
    method public static java.util.logging.LoggingMXBean getLoggingMXBean();
    method public String getProperty(String);
    method public void readConfiguration() throws java.io.IOException;
    method public void readConfiguration(java.io.InputStream) throws java.io.IOException;
    method public void removePropertyChangeListener(java.beans.PropertyChangeListener);
    method public void reset();
    field public static final String LOGGING_MXBEAN_NAME = "java.util.logging:type=Logging";
  }

  public class LogRecord implements java.io.Serializable {
    ctor public LogRecord(java.util.logging.Level, String);
    method public java.util.logging.Level getLevel();
    method public String getLoggerName();
    method public String getMessage();
    method public long getMillis();
    method public Object[] getParameters();
    method public java.util.ResourceBundle getResourceBundle();
    method public String getResourceBundleName();
    method public long getSequenceNumber();
    method public String getSourceClassName();
    method public String getSourceMethodName();
    method public int getThreadID();
    method public Throwable getThrown();
    method public void setLevel(java.util.logging.Level);
    method public void setLoggerName(String);
    method public void setMessage(String);
    method public void setMillis(long);
    method public void setParameters(Object[]);
    method public void setResourceBundle(java.util.ResourceBundle);
    method public void setResourceBundleName(String);
    method public void setSequenceNumber(long);
    method public void setSourceClassName(String);
    method public void setSourceMethodName(String);
    method public void setThreadID(int);
    method public void setThrown(Throwable);
  }

  public class Logger {
    ctor protected Logger(String, String);
    method public void addHandler(java.util.logging.Handler);
    method public void config(String);
    method public void entering(String, String);
    method public void entering(String, String, Object);
    method public void entering(String, String, Object[]);
    method public void exiting(String, String);
    method public void exiting(String, String, Object);
    method public void fine(String);
    method public void finer(String);
    method public void finest(String);
    method public static java.util.logging.Logger getAnonymousLogger();
    method public static java.util.logging.Logger getAnonymousLogger(String);
    method public java.util.logging.Filter getFilter();
    method public java.util.logging.Handler[] getHandlers();
    method public java.util.logging.Level getLevel();
    method public static java.util.logging.Logger getLogger(String);
    method public static java.util.logging.Logger getLogger(String, String);
    method public String getName();
    method public java.util.logging.Logger getParent();
    method public java.util.ResourceBundle getResourceBundle();
    method public String getResourceBundleName();
    method public boolean getUseParentHandlers();
    method public void info(String);
    method public boolean isLoggable(java.util.logging.Level);
    method public void log(java.util.logging.Level, String);
    method public void log(java.util.logging.Level, String, Object);
    method public void log(java.util.logging.Level, String, Object[]);
    method public void log(java.util.logging.Level, String, Throwable);
    method public void log(java.util.logging.LogRecord);
    method public void logp(java.util.logging.Level, String, String, String);
    method public void logp(java.util.logging.Level, String, String, String, Object);
    method public void logp(java.util.logging.Level, String, String, String, Object[]);
    method public void logp(java.util.logging.Level, String, String, String, Throwable);
    method public void logrb(java.util.logging.Level, String, String, String, String);
    method public void logrb(java.util.logging.Level, String, String, String, String, Object);
    method public void logrb(java.util.logging.Level, String, String, String, String, Object[]);
    method public void logrb(java.util.logging.Level, String, String, String, String, Throwable);
    method public void removeHandler(java.util.logging.Handler);
    method public void setFilter(java.util.logging.Filter);
    method public void setLevel(java.util.logging.Level);
    method public void setParent(java.util.logging.Logger);
    method public void setUseParentHandlers(boolean);
    method public void severe(String);
    method public void throwing(String, String, Throwable);
    method public void warning(String);
    field public static final java.util.logging.Logger global;
  }

  public interface LoggingMXBean {
    method public String getLoggerLevel(String);
    method public java.util.List<java.lang.String> getLoggerNames();
    method public String getParentLoggerName(String);
    method public void setLoggerLevel(String, String);
  }

  public final class LoggingPermission extends java.security.BasicPermission implements java.security.Guard java.io.Serializable {
    ctor public LoggingPermission(String, String);
  }

  public class MemoryHandler extends java.util.logging.Handler {
    ctor public MemoryHandler();
    ctor public MemoryHandler(java.util.logging.Handler, int, java.util.logging.Level);
    method public void close();
    method public void flush();
    method public java.util.logging.Level getPushLevel();
    method public void publish(java.util.logging.LogRecord);
    method public void push();
    method public void setPushLevel(java.util.logging.Level);
  }

  public class SimpleFormatter extends java.util.logging.Formatter {
    ctor public SimpleFormatter();
    method public String format(java.util.logging.LogRecord);
  }

  public class SocketHandler extends java.util.logging.StreamHandler {
    ctor public SocketHandler() throws java.io.IOException;
    ctor public SocketHandler(String, int) throws java.io.IOException;
  }

  public class StreamHandler extends java.util.logging.Handler {
    ctor public StreamHandler();
    ctor public StreamHandler(java.io.OutputStream, java.util.logging.Formatter);
    method public void close();
    method public void flush();
    method public void publish(java.util.logging.LogRecord);
    method protected void setOutputStream(java.io.OutputStream);
  }

  public class XMLFormatter extends java.util.logging.Formatter {
    ctor public XMLFormatter();
    method public String format(java.util.logging.LogRecord);
  }

}

package java.util.prefs {

  public abstract class AbstractPreferences extends java.util.prefs.Preferences {
    ctor protected AbstractPreferences(java.util.prefs.AbstractPreferences, String);
    method public String absolutePath();
    method public void addNodeChangeListener(java.util.prefs.NodeChangeListener);
    method public void addPreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
    method protected final java.util.prefs.AbstractPreferences[] cachedChildren();
    method protected abstract java.util.prefs.AbstractPreferences childSpi(String);
    method public String[] childrenNames() throws java.util.prefs.BackingStoreException;
    method protected abstract String[] childrenNamesSpi() throws java.util.prefs.BackingStoreException;
    method public void clear() throws java.util.prefs.BackingStoreException;
    method public void exportNode(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
    method public void exportSubtree(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
    method public void flush() throws java.util.prefs.BackingStoreException;
    method protected abstract void flushSpi() throws java.util.prefs.BackingStoreException;
    method public String get(String, String);
    method public boolean getBoolean(String, boolean);
    method public byte[] getByteArray(String, byte[]);
    method protected java.util.prefs.AbstractPreferences getChild(String) throws java.util.prefs.BackingStoreException;
    method public double getDouble(String, double);
    method public float getFloat(String, float);
    method public int getInt(String, int);
    method public long getLong(String, long);
    method protected abstract String getSpi(String);
    method protected boolean isRemoved();
    method public boolean isUserNode();
    method public String[] keys() throws java.util.prefs.BackingStoreException;
    method protected abstract String[] keysSpi() throws java.util.prefs.BackingStoreException;
    method public String name();
    method public java.util.prefs.Preferences node(String);
    method public boolean nodeExists(String) throws java.util.prefs.BackingStoreException;
    method public java.util.prefs.Preferences parent();
    method public void put(String, String);
    method public void putBoolean(String, boolean);
    method public void putByteArray(String, byte[]);
    method public void putDouble(String, double);
    method public void putFloat(String, float);
    method public void putInt(String, int);
    method public void putLong(String, long);
    method protected abstract void putSpi(String, String);
    method public void remove(String);
    method public void removeNode() throws java.util.prefs.BackingStoreException;
    method public void removeNodeChangeListener(java.util.prefs.NodeChangeListener);
    method protected abstract void removeNodeSpi() throws java.util.prefs.BackingStoreException;
    method public void removePreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
    method protected abstract void removeSpi(String);
    method public void sync() throws java.util.prefs.BackingStoreException;
    method protected abstract void syncSpi() throws java.util.prefs.BackingStoreException;
    field protected final Object lock;
    field protected boolean newNode;
  }

  public class BackingStoreException extends java.lang.Exception {
    ctor public BackingStoreException(String);
    ctor public BackingStoreException(Throwable);
  }

  public class InvalidPreferencesFormatException extends java.lang.Exception {
    ctor public InvalidPreferencesFormatException(String);
    ctor public InvalidPreferencesFormatException(String, Throwable);
    ctor public InvalidPreferencesFormatException(Throwable);
  }

  public class NodeChangeEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public NodeChangeEvent(java.util.prefs.Preferences, java.util.prefs.Preferences);
    method public java.util.prefs.Preferences getChild();
    method public java.util.prefs.Preferences getParent();
  }

  public interface NodeChangeListener extends java.util.EventListener {
    method public void childAdded(java.util.prefs.NodeChangeEvent);
    method public void childRemoved(java.util.prefs.NodeChangeEvent);
  }

  public class PreferenceChangeEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public PreferenceChangeEvent(java.util.prefs.Preferences, String, String);
    method public String getKey();
    method public String getNewValue();
    method public java.util.prefs.Preferences getNode();
  }

  public interface PreferenceChangeListener extends java.util.EventListener {
    method public void preferenceChange(java.util.prefs.PreferenceChangeEvent);
  }

  public abstract class Preferences {
    ctor protected Preferences();
    method public abstract String absolutePath();
    method public abstract void addNodeChangeListener(java.util.prefs.NodeChangeListener);
    method public abstract void addPreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
    method public abstract String[] childrenNames() throws java.util.prefs.BackingStoreException;
    method public abstract void clear() throws java.util.prefs.BackingStoreException;
    method public abstract void exportNode(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
    method public abstract void exportSubtree(java.io.OutputStream) throws java.util.prefs.BackingStoreException, java.io.IOException;
    method public abstract void flush() throws java.util.prefs.BackingStoreException;
    method public abstract String get(String, String);
    method public abstract boolean getBoolean(String, boolean);
    method public abstract byte[] getByteArray(String, byte[]);
    method public abstract double getDouble(String, double);
    method public abstract float getFloat(String, float);
    method public abstract int getInt(String, int);
    method public abstract long getLong(String, long);
    method public static void importPreferences(java.io.InputStream) throws java.io.IOException, java.util.prefs.InvalidPreferencesFormatException;
    method public abstract boolean isUserNode();
    method public abstract String[] keys() throws java.util.prefs.BackingStoreException;
    method public abstract String name();
    method public abstract java.util.prefs.Preferences node(String);
    method public abstract boolean nodeExists(String) throws java.util.prefs.BackingStoreException;
    method public abstract java.util.prefs.Preferences parent();
    method public abstract void put(String, String);
    method public abstract void putBoolean(String, boolean);
    method public abstract void putByteArray(String, byte[]);
    method public abstract void putDouble(String, double);
    method public abstract void putFloat(String, float);
    method public abstract void putInt(String, int);
    method public abstract void putLong(String, long);
    method public abstract void remove(String);
    method public abstract void removeNode() throws java.util.prefs.BackingStoreException;
    method public abstract void removeNodeChangeListener(java.util.prefs.NodeChangeListener);
    method public abstract void removePreferenceChangeListener(java.util.prefs.PreferenceChangeListener);
    method public abstract void sync() throws java.util.prefs.BackingStoreException;
    method public static java.util.prefs.Preferences systemNodeForPackage(Class<?>);
    method public static java.util.prefs.Preferences systemRoot();
    method public abstract String toString();
    method public static java.util.prefs.Preferences userNodeForPackage(Class<?>);
    method public static java.util.prefs.Preferences userRoot();
    field public static final int MAX_KEY_LENGTH = 80; // 0x50
    field public static final int MAX_NAME_LENGTH = 80; // 0x50
    field public static final int MAX_VALUE_LENGTH = 8192; // 0x2000
  }

  public interface PreferencesFactory {
    method public java.util.prefs.Preferences systemRoot();
    method public java.util.prefs.Preferences userRoot();
  }

}

package java.util.regex {

  public interface MatchResult {
    method public int end();
    method public int end(int);
    method public String group();
    method public String group(int);
    method public int groupCount();
    method public int start();
    method public int start(int);
  }

  public final class Matcher implements java.util.regex.MatchResult {
    method public java.util.regex.Matcher appendReplacement(StringBuffer, String) throws java.lang.IllegalStateException;
    method public StringBuffer appendTail(StringBuffer);
    method public int end();
    method public int end(int);
    method public boolean find();
    method public boolean find(int);
    method public String group();
    method public String group(int);
    method public int groupCount();
    method public boolean hasAnchoringBounds();
    method public boolean hasTransparentBounds();
    method public boolean hitEnd();
    method public boolean lookingAt();
    method public boolean matches();
    method public java.util.regex.Pattern pattern();
    method public static String quoteReplacement(String);
    method public java.util.regex.Matcher region(int, int);
    method public int regionEnd();
    method public int regionStart();
    method public String replaceAll(String);
    method public String replaceFirst(String);
    method public boolean requireEnd();
    method public java.util.regex.Matcher reset();
    method public java.util.regex.Matcher reset(CharSequence);
    method public int start() throws java.lang.IllegalStateException;
    method public int start(int) throws java.lang.IllegalStateException;
    method public java.util.regex.MatchResult toMatchResult();
    method public java.util.regex.Matcher useAnchoringBounds(boolean);
    method public java.util.regex.Matcher usePattern(java.util.regex.Pattern);
    method public java.util.regex.Matcher useTransparentBounds(boolean);
  }

  public final class Pattern implements java.io.Serializable {
    method public static java.util.regex.Pattern compile(String) throws java.util.regex.PatternSyntaxException;
    method public static java.util.regex.Pattern compile(String, int) throws java.util.regex.PatternSyntaxException;
    method public int flags();
    method public java.util.regex.Matcher matcher(CharSequence);
    method public static boolean matches(String, CharSequence);
    method public String pattern();
    method public static String quote(String);
    method public String[] split(CharSequence);
    method public String[] split(CharSequence, int);
    field public static final int CANON_EQ = 128; // 0x80
    field public static final int CASE_INSENSITIVE = 2; // 0x2
    field public static final int COMMENTS = 4; // 0x4
    field public static final int DOTALL = 32; // 0x20
    field public static final int LITERAL = 16; // 0x10
    field public static final int MULTILINE = 8; // 0x8
    field public static final int UNICODE_CASE = 64; // 0x40
    field public static final int UNIX_LINES = 1; // 0x1
  }

  public class PatternSyntaxException extends java.lang.IllegalArgumentException {
    ctor public PatternSyntaxException(String, String, int);
    method public String getDescription();
    method public int getIndex();
    method public String getPattern();
  }

}

package java.util.zip {

  public class Adler32 implements java.util.zip.Checksum {
    ctor public Adler32();
    method public long getValue();
    method public void reset();
    method public void update(int);
    method public void update(byte[]);
    method public void update(byte[], int, int);
  }

  public class CRC32 implements java.util.zip.Checksum {
    ctor public CRC32();
    method public long getValue();
    method public void reset();
    method public void update(int);
    method public void update(byte[]);
    method public void update(byte[], int, int);
  }

  public class CheckedInputStream extends java.io.FilterInputStream {
    ctor public CheckedInputStream(java.io.InputStream, java.util.zip.Checksum);
    method public java.util.zip.Checksum getChecksum();
  }

  public class CheckedOutputStream extends java.io.FilterOutputStream {
    ctor public CheckedOutputStream(java.io.OutputStream, java.util.zip.Checksum);
    method public java.util.zip.Checksum getChecksum();
  }

  public interface Checksum {
    method public long getValue();
    method public void reset();
    method public void update(int);
    method public void update(byte[], int, int);
  }

  public class DataFormatException extends java.lang.Exception {
    ctor public DataFormatException();
    ctor public DataFormatException(String);
  }

  public class Deflater {
    ctor public Deflater();
    ctor public Deflater(int);
    ctor public Deflater(int, boolean);
    method public int deflate(byte[]);
    method public int deflate(byte[], int, int);
    method public void end();
    method protected void finalize();
    method public void finish();
    method public boolean finished();
    method public int getAdler();
    method public long getBytesRead();
    method public long getBytesWritten();
    method public int getTotalIn();
    method public int getTotalOut();
    method public boolean needsInput();
    method public void reset();
    method public void setDictionary(byte[]);
    method public void setDictionary(byte[], int, int);
    method public void setInput(byte[]);
    method public void setInput(byte[], int, int);
    method public void setLevel(int);
    method public void setStrategy(int);
    field public static final int BEST_COMPRESSION = 9; // 0x9
    field public static final int BEST_SPEED = 1; // 0x1
    field public static final int DEFAULT_COMPRESSION = -1; // 0xffffffff
    field public static final int DEFAULT_STRATEGY = 0; // 0x0
    field public static final int DEFLATED = 8; // 0x8
    field public static final int FILTERED = 1; // 0x1
    field public static final int HUFFMAN_ONLY = 2; // 0x2
    field public static final int NO_COMPRESSION = 0; // 0x0
  }

  public class DeflaterOutputStream extends java.io.FilterOutputStream {
    ctor public DeflaterOutputStream(java.io.OutputStream, java.util.zip.Deflater);
    ctor public DeflaterOutputStream(java.io.OutputStream);
    ctor public DeflaterOutputStream(java.io.OutputStream, java.util.zip.Deflater, int);
    method protected void deflate() throws java.io.IOException;
    method public void finish() throws java.io.IOException;
    field protected byte[] buf;
    field protected java.util.zip.Deflater def;
  }

  public class GZIPInputStream extends java.util.zip.InflaterInputStream {
    ctor public GZIPInputStream(java.io.InputStream) throws java.io.IOException;
    ctor public GZIPInputStream(java.io.InputStream, int) throws java.io.IOException;
    field public static final int GZIP_MAGIC = 35615; // 0x8b1f
    field protected java.util.zip.CRC32 crc;
    field protected boolean eos;
  }

  public class GZIPOutputStream extends java.util.zip.DeflaterOutputStream {
    ctor public GZIPOutputStream(java.io.OutputStream) throws java.io.IOException;
    ctor public GZIPOutputStream(java.io.OutputStream, int) throws java.io.IOException;
    field protected java.util.zip.CRC32 crc;
  }

  public class Inflater {
    ctor public Inflater();
    ctor public Inflater(boolean);
    method public void end();
    method protected void finalize();
    method public boolean finished();
    method public int getAdler();
    method public long getBytesRead();
    method public long getBytesWritten();
    method public int getRemaining();
    method public int getTotalIn();
    method public int getTotalOut();
    method public int inflate(byte[]) throws java.util.zip.DataFormatException;
    method public int inflate(byte[], int, int) throws java.util.zip.DataFormatException;
    method public boolean needsDictionary();
    method public boolean needsInput();
    method public void reset();
    method public void setDictionary(byte[]);
    method public void setDictionary(byte[], int, int);
    method public void setInput(byte[]);
    method public void setInput(byte[], int, int);
  }

  public class InflaterInputStream extends java.io.FilterInputStream {
    ctor public InflaterInputStream(java.io.InputStream);
    ctor public InflaterInputStream(java.io.InputStream, java.util.zip.Inflater);
    ctor public InflaterInputStream(java.io.InputStream, java.util.zip.Inflater, int);
    method protected void fill() throws java.io.IOException;
    field protected byte[] buf;
    field protected java.util.zip.Inflater inf;
    field protected int len;
  }

  public class ZipEntry implements java.lang.Cloneable {
    ctor public ZipEntry(String);
    ctor public ZipEntry(java.util.zip.ZipEntry);
    method public Object clone();
    method public String getComment();
    method public long getCompressedSize();
    method public long getCrc();
    method public byte[] getExtra();
    method public int getMethod();
    method public String getName();
    method public long getSize();
    method public long getTime();
    method public boolean isDirectory();
    method public void setComment(String);
    method public void setCompressedSize(long);
    method public void setCrc(long);
    method public void setExtra(byte[]);
    method public void setMethod(int);
    method public void setSize(long);
    method public void setTime(long);
    field public static final int DEFLATED = 8; // 0x8
    field public static final int STORED = 0; // 0x0
  }

  public class ZipException extends java.io.IOException {
    ctor public ZipException();
    ctor public ZipException(String);
  }

  public class ZipFile {
    ctor public ZipFile(java.io.File) throws java.io.IOException, java.util.zip.ZipException;
    ctor public ZipFile(java.io.File, int) throws java.io.IOException;
    ctor public ZipFile(String) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method public java.util.Enumeration<? extends java.util.zip.ZipEntry> entries();
    method protected void finalize() throws java.io.IOException;
    method public java.util.zip.ZipEntry getEntry(String);
    method public java.io.InputStream getInputStream(java.util.zip.ZipEntry) throws java.io.IOException;
    method public String getName();
    method public int size();
    field public static final int OPEN_DELETE = 4; // 0x4
    field public static final int OPEN_READ = 1; // 0x1
  }

  public class ZipInputStream extends java.util.zip.InflaterInputStream {
    ctor public ZipInputStream(java.io.InputStream);
    method public void closeEntry() throws java.io.IOException;
    method protected java.util.zip.ZipEntry createZipEntry(String);
    method public java.util.zip.ZipEntry getNextEntry() throws java.io.IOException;
  }

  public class ZipOutputStream extends java.util.zip.DeflaterOutputStream {
    ctor public ZipOutputStream(java.io.OutputStream);
    method public void closeEntry() throws java.io.IOException;
    method public void putNextEntry(java.util.zip.ZipEntry) throws java.io.IOException;
    method public void setComment(String);
    method public void setLevel(int);
    method public void setMethod(int);
    field public static final int DEFLATED = 8; // 0x8
    field public static final int STORED = 0; // 0x0
  }

}

package javax.crypto {

  public class BadPaddingException extends java.security.GeneralSecurityException {
    ctor public BadPaddingException(String);
    ctor public BadPaddingException();
  }

  public class Cipher {
    ctor protected Cipher(javax.crypto.CipherSpi, java.security.Provider, String);
    method public final byte[] doFinal() throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
    method public final int doFinal(byte[], int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method public final byte[] doFinal(byte[]) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
    method public final byte[] doFinal(byte[], int, int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
    method public final int doFinal(byte[], int, int, byte[]) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method public final int doFinal(byte[], int, int, byte[], int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method public final int doFinal(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method public final String getAlgorithm();
    method public final int getBlockSize();
    method public final javax.crypto.ExemptionMechanism getExemptionMechanism();
    method public final byte[] getIV();
    method public static final javax.crypto.Cipher getInstance(String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
    method public static final javax.crypto.Cipher getInstance(String, String) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException, java.security.NoSuchProviderException;
    method public static final javax.crypto.Cipher getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException, javax.crypto.NoSuchPaddingException;
    method public static final int getMaxAllowedKeyLength(String) throws java.security.NoSuchAlgorithmException;
    method public static final java.security.spec.AlgorithmParameterSpec getMaxAllowedParameterSpec(String) throws java.security.NoSuchAlgorithmException;
    method public final int getOutputSize(int);
    method public final java.security.AlgorithmParameters getParameters();
    method public final java.security.Provider getProvider();
    method public final void init(int, java.security.Key) throws java.security.InvalidKeyException;
    method public final void init(int, java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method public final void init(int, java.security.Key, java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(int, java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(int, java.security.Key, java.security.AlgorithmParameters) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(int, java.security.Key, java.security.AlgorithmParameters, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(int, java.security.cert.Certificate) throws java.security.InvalidKeyException;
    method public final void init(int, java.security.cert.Certificate, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method public final java.security.Key unwrap(byte[], String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method public final byte[] update(byte[]);
    method public final byte[] update(byte[], int, int);
    method public final int update(byte[], int, int, byte[]) throws javax.crypto.ShortBufferException;
    method public final int update(byte[], int, int, byte[], int) throws javax.crypto.ShortBufferException;
    method public final int update(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.ShortBufferException;
    method public final byte[] wrap(java.security.Key) throws javax.crypto.IllegalBlockSizeException, java.security.InvalidKeyException;
    field public static final int DECRYPT_MODE = 2; // 0x2
    field public static final int ENCRYPT_MODE = 1; // 0x1
    field public static final int PRIVATE_KEY = 2; // 0x2
    field public static final int PUBLIC_KEY = 1; // 0x1
    field public static final int SECRET_KEY = 3; // 0x3
    field public static final int UNWRAP_MODE = 4; // 0x4
    field public static final int WRAP_MODE = 3; // 0x3
  }

  public class CipherInputStream extends java.io.FilterInputStream {
    ctor public CipherInputStream(java.io.InputStream, javax.crypto.Cipher);
    ctor protected CipherInputStream(java.io.InputStream);
  }

  public class CipherOutputStream extends java.io.FilterOutputStream {
    ctor public CipherOutputStream(java.io.OutputStream, javax.crypto.Cipher);
    ctor protected CipherOutputStream(java.io.OutputStream);
  }

  public abstract class CipherSpi {
    ctor public CipherSpi();
    method protected abstract byte[] engineDoFinal(byte[], int, int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException;
    method protected abstract int engineDoFinal(byte[], int, int, byte[], int) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method protected int engineDoFinal(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.BadPaddingException, javax.crypto.IllegalBlockSizeException, javax.crypto.ShortBufferException;
    method protected abstract int engineGetBlockSize();
    method protected abstract byte[] engineGetIV();
    method protected int engineGetKeySize(java.security.Key) throws java.security.InvalidKeyException;
    method protected abstract int engineGetOutputSize(int);
    method protected abstract java.security.AlgorithmParameters engineGetParameters();
    method protected abstract void engineInit(int, java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method protected abstract void engineInit(int, java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method protected abstract void engineInit(int, java.security.Key, java.security.AlgorithmParameters, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method protected abstract void engineSetMode(String) throws java.security.NoSuchAlgorithmException;
    method protected abstract void engineSetPadding(String) throws javax.crypto.NoSuchPaddingException;
    method protected java.security.Key engineUnwrap(byte[], String, int) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method protected abstract byte[] engineUpdate(byte[], int, int);
    method protected abstract int engineUpdate(byte[], int, int, byte[], int) throws javax.crypto.ShortBufferException;
    method protected int engineUpdate(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.crypto.ShortBufferException;
    method protected byte[] engineWrap(java.security.Key) throws javax.crypto.IllegalBlockSizeException, java.security.InvalidKeyException;
  }

  public class EncryptedPrivateKeyInfo {
    ctor public EncryptedPrivateKeyInfo(byte[]) throws java.io.IOException;
    ctor public EncryptedPrivateKeyInfo(String, byte[]) throws java.security.NoSuchAlgorithmException;
    ctor public EncryptedPrivateKeyInfo(java.security.AlgorithmParameters, byte[]) throws java.security.NoSuchAlgorithmException;
    method public String getAlgName();
    method public java.security.AlgorithmParameters getAlgParameters();
    method public byte[] getEncoded() throws java.io.IOException;
    method public byte[] getEncryptedData();
    method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(javax.crypto.Cipher) throws java.security.spec.InvalidKeySpecException;
    method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key, String) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public java.security.spec.PKCS8EncodedKeySpec getKeySpec(java.security.Key, java.security.Provider) throws java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
  }

  public class ExemptionMechanism {
    ctor protected ExemptionMechanism(javax.crypto.ExemptionMechanismSpi, java.security.Provider, String);
    method protected void finalize();
    method public final byte[] genExemptionBlob() throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException;
    method public final int genExemptionBlob(byte[]) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
    method public final int genExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, java.lang.IllegalStateException, javax.crypto.ShortBufferException;
    method public static final javax.crypto.ExemptionMechanism getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.crypto.ExemptionMechanism getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.crypto.ExemptionMechanism getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final String getName();
    method public final int getOutputSize(int) throws java.lang.IllegalStateException;
    method public final java.security.Provider getProvider();
    method public final void init(java.security.Key) throws javax.crypto.ExemptionMechanismException, java.security.InvalidKeyException;
    method public final void init(java.security.Key, java.security.AlgorithmParameters) throws javax.crypto.ExemptionMechanismException, java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws javax.crypto.ExemptionMechanismException, java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final boolean isCryptoAllowed(java.security.Key) throws javax.crypto.ExemptionMechanismException;
  }

  public class ExemptionMechanismException extends java.security.GeneralSecurityException {
    ctor public ExemptionMechanismException(String);
    ctor public ExemptionMechanismException();
  }

  public abstract class ExemptionMechanismSpi {
    ctor public ExemptionMechanismSpi();
    method protected abstract byte[] engineGenExemptionBlob() throws javax.crypto.ExemptionMechanismException;
    method protected abstract int engineGenExemptionBlob(byte[], int) throws javax.crypto.ExemptionMechanismException, javax.crypto.ShortBufferException;
    method protected abstract int engineGetOutputSize(int);
    method protected abstract void engineInit(java.security.Key) throws javax.crypto.ExemptionMechanismException, java.security.InvalidKeyException;
    method protected abstract void engineInit(java.security.Key, java.security.AlgorithmParameters) throws javax.crypto.ExemptionMechanismException, java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method protected abstract void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws javax.crypto.ExemptionMechanismException, java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
  }

  public class IllegalBlockSizeException extends java.security.GeneralSecurityException {
    ctor public IllegalBlockSizeException(String);
    ctor public IllegalBlockSizeException();
  }

  public class KeyAgreement {
    ctor protected KeyAgreement(javax.crypto.KeyAgreementSpi, java.security.Provider, String);
    method public final java.security.Key doPhase(java.security.Key, boolean) throws java.lang.IllegalStateException, java.security.InvalidKeyException;
    method public final byte[] generateSecret() throws java.lang.IllegalStateException;
    method public final int generateSecret(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
    method public final javax.crypto.SecretKey generateSecret(String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method public final String getAlgorithm();
    method public static final javax.crypto.KeyAgreement getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.crypto.KeyAgreement getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.crypto.KeyAgreement getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final void init(java.security.Key) throws java.security.InvalidKeyException;
    method public final void init(java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method public final void init(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
  }

  public abstract class KeyAgreementSpi {
    ctor public KeyAgreementSpi();
    method protected abstract java.security.Key engineDoPhase(java.security.Key, boolean) throws java.lang.IllegalStateException, java.security.InvalidKeyException;
    method protected abstract byte[] engineGenerateSecret() throws java.lang.IllegalStateException;
    method protected abstract int engineGenerateSecret(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
    method protected abstract javax.crypto.SecretKey engineGenerateSecret(String) throws java.lang.IllegalStateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method protected abstract void engineInit(java.security.Key, java.security.SecureRandom) throws java.security.InvalidKeyException;
    method protected abstract void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
  }

  public class KeyGenerator {
    ctor protected KeyGenerator(javax.crypto.KeyGeneratorSpi, java.security.Provider, String);
    method public final javax.crypto.SecretKey generateKey();
    method public final String getAlgorithm();
    method public static final javax.crypto.KeyGenerator getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.crypto.KeyGenerator getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.crypto.KeyGenerator getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final void init(java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException;
    method public final void init(java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException;
    method public final void init(int);
    method public final void init(int, java.security.SecureRandom);
    method public final void init(java.security.SecureRandom);
  }

  public abstract class KeyGeneratorSpi {
    ctor public KeyGeneratorSpi();
    method protected abstract javax.crypto.SecretKey engineGenerateKey();
    method protected abstract void engineInit(java.security.spec.AlgorithmParameterSpec, java.security.SecureRandom) throws java.security.InvalidAlgorithmParameterException;
    method protected abstract void engineInit(int, java.security.SecureRandom);
    method protected abstract void engineInit(java.security.SecureRandom);
  }

  public class Mac implements java.lang.Cloneable {
    ctor protected Mac(javax.crypto.MacSpi, java.security.Provider, String);
    method public final Object clone() throws java.lang.CloneNotSupportedException;
    method public final byte[] doFinal() throws java.lang.IllegalStateException;
    method public final void doFinal(byte[], int) throws java.lang.IllegalStateException, javax.crypto.ShortBufferException;
    method public final byte[] doFinal(byte[]) throws java.lang.IllegalStateException;
    method public final String getAlgorithm();
    method public static final javax.crypto.Mac getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.crypto.Mac getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.crypto.Mac getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final int getMacLength();
    method public final java.security.Provider getProvider();
    method public final void init(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method public final void init(java.security.Key) throws java.security.InvalidKeyException;
    method public final void reset();
    method public final void update(byte) throws java.lang.IllegalStateException;
    method public final void update(byte[], int, int) throws java.lang.IllegalStateException;
    method public final void update(byte[]) throws java.lang.IllegalStateException;
    method public final void update(java.nio.ByteBuffer);
  }

  public abstract class MacSpi {
    ctor public MacSpi();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method protected abstract byte[] engineDoFinal();
    method protected abstract int engineGetMacLength();
    method protected abstract void engineInit(java.security.Key, java.security.spec.AlgorithmParameterSpec) throws java.security.InvalidAlgorithmParameterException, java.security.InvalidKeyException;
    method protected abstract void engineReset();
    method protected abstract void engineUpdate(byte);
    method protected abstract void engineUpdate(byte[], int, int);
    method protected void engineUpdate(java.nio.ByteBuffer);
  }

  public class NoSuchPaddingException extends java.security.GeneralSecurityException {
    ctor public NoSuchPaddingException(String);
    ctor public NoSuchPaddingException();
  }

  public class NullCipher extends javax.crypto.Cipher {
    ctor public NullCipher();
  }

  public class SealedObject implements java.io.Serializable {
    ctor public SealedObject(java.io.Serializable, javax.crypto.Cipher) throws java.io.IOException, javax.crypto.IllegalBlockSizeException;
    ctor protected SealedObject(javax.crypto.SealedObject);
    method public final String getAlgorithm();
    method public final Object getObject(java.security.Key) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException;
    method public final Object getObject(javax.crypto.Cipher) throws javax.crypto.BadPaddingException, java.lang.ClassNotFoundException, java.io.IOException, javax.crypto.IllegalBlockSizeException;
    method public final Object getObject(java.security.Key, String) throws java.lang.ClassNotFoundException, java.io.IOException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    field protected byte[] encodedParams;
  }

  public interface SecretKey extends java.security.Key {
    field public static final long serialVersionUID = -4795878709595146952L; // 0xbd719db928b8f538L
  }

  public class SecretKeyFactory {
    ctor protected SecretKeyFactory(javax.crypto.SecretKeyFactorySpi, java.security.Provider, String);
    method public final javax.crypto.SecretKey generateSecret(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method public final String getAlgorithm();
    method public static final javax.crypto.SecretKeyFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.crypto.SecretKeyFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.crypto.SecretKeyFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.spec.KeySpec getKeySpec(javax.crypto.SecretKey, Class) throws java.security.spec.InvalidKeySpecException;
    method public final java.security.Provider getProvider();
    method public final javax.crypto.SecretKey translateKey(javax.crypto.SecretKey) throws java.security.InvalidKeyException;
  }

  public abstract class SecretKeyFactorySpi {
    ctor public SecretKeyFactorySpi();
    method protected abstract javax.crypto.SecretKey engineGenerateSecret(java.security.spec.KeySpec) throws java.security.spec.InvalidKeySpecException;
    method protected abstract java.security.spec.KeySpec engineGetKeySpec(javax.crypto.SecretKey, Class) throws java.security.spec.InvalidKeySpecException;
    method protected abstract javax.crypto.SecretKey engineTranslateKey(javax.crypto.SecretKey) throws java.security.InvalidKeyException;
  }

  public class ShortBufferException extends java.security.GeneralSecurityException {
    ctor public ShortBufferException(String);
    ctor public ShortBufferException();
  }

}

package javax.crypto.interfaces {

  public interface DHKey {
    method public javax.crypto.spec.DHParameterSpec getParams();
  }

  public interface DHPrivateKey extends javax.crypto.interfaces.DHKey java.security.PrivateKey {
    method public java.math.BigInteger getX();
    field public static final long serialVersionUID = 2211791113380396553L; // 0x1eb1dc4c8e677e09L
  }

  public interface DHPublicKey extends javax.crypto.interfaces.DHKey java.security.PublicKey {
    method public java.math.BigInteger getY();
    field public static final long serialVersionUID = -6628103563352519193L; // 0xa4043eed23df4de7L
  }

  public interface PBEKey extends javax.crypto.SecretKey {
    method public int getIterationCount();
    method public char[] getPassword();
    method public byte[] getSalt();
    field public static final long serialVersionUID = -1430015993304333921L; // 0xec279007d7f7c19fL
  }

}

package javax.crypto.spec {

  public class DESKeySpec implements java.security.spec.KeySpec {
    ctor public DESKeySpec(byte[]) throws java.security.InvalidKeyException;
    ctor public DESKeySpec(byte[], int) throws java.security.InvalidKeyException;
    method public byte[] getKey();
    method public static boolean isParityAdjusted(byte[], int) throws java.security.InvalidKeyException;
    method public static boolean isWeak(byte[], int) throws java.security.InvalidKeyException;
    field public static final int DES_KEY_LEN = 8; // 0x8
  }

  public class DESedeKeySpec implements java.security.spec.KeySpec {
    ctor public DESedeKeySpec(byte[]) throws java.security.InvalidKeyException;
    ctor public DESedeKeySpec(byte[], int) throws java.security.InvalidKeyException;
    method public byte[] getKey();
    method public static boolean isParityAdjusted(byte[], int) throws java.security.InvalidKeyException;
    field public static final int DES_EDE_KEY_LEN = 24; // 0x18
  }

  public class DHGenParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public DHGenParameterSpec(int, int);
    method public int getExponentSize();
    method public int getPrimeSize();
  }

  public class DHParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public DHParameterSpec(java.math.BigInteger, java.math.BigInteger);
    ctor public DHParameterSpec(java.math.BigInteger, java.math.BigInteger, int);
    method public java.math.BigInteger getG();
    method public int getL();
    method public java.math.BigInteger getP();
  }

  public class DHPrivateKeySpec implements java.security.spec.KeySpec {
    ctor public DHPrivateKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getX();
  }

  public class DHPublicKeySpec implements java.security.spec.KeySpec {
    ctor public DHPublicKeySpec(java.math.BigInteger, java.math.BigInteger, java.math.BigInteger);
    method public java.math.BigInteger getG();
    method public java.math.BigInteger getP();
    method public java.math.BigInteger getY();
  }

  public class IvParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public IvParameterSpec(byte[]);
    ctor public IvParameterSpec(byte[], int, int);
    method public byte[] getIV();
  }

  public class OAEPParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public OAEPParameterSpec(String, String, java.security.spec.AlgorithmParameterSpec, javax.crypto.spec.PSource);
    method public String getDigestAlgorithm();
    method public String getMGFAlgorithm();
    method public java.security.spec.AlgorithmParameterSpec getMGFParameters();
    method public javax.crypto.spec.PSource getPSource();
    field public static final javax.crypto.spec.OAEPParameterSpec DEFAULT;
  }

  public class PBEKeySpec implements java.security.spec.KeySpec {
    ctor public PBEKeySpec(char[]);
    ctor public PBEKeySpec(char[], byte[], int, int);
    ctor public PBEKeySpec(char[], byte[], int);
    method public final void clearPassword();
    method public final int getIterationCount();
    method public final int getKeyLength();
    method public final char[] getPassword();
    method public final byte[] getSalt();
  }

  public class PBEParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public PBEParameterSpec(byte[], int);
    method public int getIterationCount();
    method public byte[] getSalt();
  }

  public class PSource {
    ctor protected PSource(String);
    method public String getAlgorithm();
  }

  public static final class PSource.PSpecified extends javax.crypto.spec.PSource {
    ctor public PSource.PSpecified(byte[]);
    method public byte[] getValue();
    field public static final javax.crypto.spec.PSource.PSpecified DEFAULT;
  }

  public class RC2ParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public RC2ParameterSpec(int);
    ctor public RC2ParameterSpec(int, byte[]);
    ctor public RC2ParameterSpec(int, byte[], int);
    method public int getEffectiveKeyBits();
    method public byte[] getIV();
  }

  public class RC5ParameterSpec implements java.security.spec.AlgorithmParameterSpec {
    ctor public RC5ParameterSpec(int, int, int);
    ctor public RC5ParameterSpec(int, int, int, byte[]);
    ctor public RC5ParameterSpec(int, int, int, byte[], int);
    method public byte[] getIV();
    method public int getRounds();
    method public int getVersion();
    method public int getWordSize();
  }

  public class SecretKeySpec implements java.security.spec.KeySpec javax.crypto.SecretKey java.io.Serializable {
    ctor public SecretKeySpec(byte[], String);
    ctor public SecretKeySpec(byte[], int, int, String);
    method public String getAlgorithm();
    method public byte[] getEncoded();
    method public String getFormat();
  }

}

package javax.microedition.khronos.egl {

  public interface EGL {
  }

  public interface EGL10 extends javax.microedition.khronos.egl.EGL {
    method public boolean eglChooseConfig(javax.microedition.khronos.egl.EGLDisplay, int[], javax.microedition.khronos.egl.EGLConfig[], int, int[]);
    method public boolean eglCopyBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, Object);
    method public javax.microedition.khronos.egl.EGLContext eglCreateContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, javax.microedition.khronos.egl.EGLContext, int[]);
    method public javax.microedition.khronos.egl.EGLSurface eglCreatePbufferSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int[]);
    method public javax.microedition.khronos.egl.EGLSurface eglCreatePixmapSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]);
    method public javax.microedition.khronos.egl.EGLSurface eglCreateWindowSurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, Object, int[]);
    method public boolean eglDestroyContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext);
    method public boolean eglDestroySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
    method public boolean eglGetConfigAttrib(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig, int, int[]);
    method public boolean eglGetConfigs(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLConfig[], int, int[]);
    method public javax.microedition.khronos.egl.EGLContext eglGetCurrentContext();
    method public javax.microedition.khronos.egl.EGLDisplay eglGetCurrentDisplay();
    method public javax.microedition.khronos.egl.EGLSurface eglGetCurrentSurface(int);
    method public javax.microedition.khronos.egl.EGLDisplay eglGetDisplay(Object);
    method public int eglGetError();
    method public boolean eglInitialize(javax.microedition.khronos.egl.EGLDisplay, int[]);
    method public boolean eglMakeCurrent(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLSurface, javax.microedition.khronos.egl.EGLContext);
    method public boolean eglQueryContext(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLContext, int, int[]);
    method public String eglQueryString(javax.microedition.khronos.egl.EGLDisplay, int);
    method public boolean eglQuerySurface(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface, int, int[]);
    method public boolean eglSwapBuffers(javax.microedition.khronos.egl.EGLDisplay, javax.microedition.khronos.egl.EGLSurface);
    method public boolean eglTerminate(javax.microedition.khronos.egl.EGLDisplay);
    method public boolean eglWaitGL();
    method public boolean eglWaitNative(int, Object);
    field public static final int EGL_ALPHA_FORMAT = 12424; // 0x3088
    field public static final int EGL_ALPHA_MASK_SIZE = 12350; // 0x303e
    field public static final int EGL_ALPHA_SIZE = 12321; // 0x3021
    field public static final int EGL_BAD_ACCESS = 12290; // 0x3002
    field public static final int EGL_BAD_ALLOC = 12291; // 0x3003
    field public static final int EGL_BAD_ATTRIBUTE = 12292; // 0x3004
    field public static final int EGL_BAD_CONFIG = 12293; // 0x3005
    field public static final int EGL_BAD_CONTEXT = 12294; // 0x3006
    field public static final int EGL_BAD_CURRENT_SURFACE = 12295; // 0x3007
    field public static final int EGL_BAD_DISPLAY = 12296; // 0x3008
    field public static final int EGL_BAD_MATCH = 12297; // 0x3009
    field public static final int EGL_BAD_NATIVE_PIXMAP = 12298; // 0x300a
    field public static final int EGL_BAD_NATIVE_WINDOW = 12299; // 0x300b
    field public static final int EGL_BAD_PARAMETER = 12300; // 0x300c
    field public static final int EGL_BAD_SURFACE = 12301; // 0x300d
    field public static final int EGL_BLUE_SIZE = 12322; // 0x3022
    field public static final int EGL_BUFFER_SIZE = 12320; // 0x3020
    field public static final int EGL_COLORSPACE = 12423; // 0x3087
    field public static final int EGL_COLOR_BUFFER_TYPE = 12351; // 0x303f
    field public static final int EGL_CONFIG_CAVEAT = 12327; // 0x3027
    field public static final int EGL_CONFIG_ID = 12328; // 0x3028
    field public static final int EGL_CORE_NATIVE_ENGINE = 12379; // 0x305b
    field public static final Object EGL_DEFAULT_DISPLAY;
    field public static final int EGL_DEPTH_SIZE = 12325; // 0x3025
    field public static final int EGL_DONT_CARE = -1; // 0xffffffff
    field public static final int EGL_DRAW = 12377; // 0x3059
    field public static final int EGL_EXTENSIONS = 12373; // 0x3055
    field public static final int EGL_GREEN_SIZE = 12323; // 0x3023
    field public static final int EGL_HEIGHT = 12374; // 0x3056
    field public static final int EGL_HORIZONTAL_RESOLUTION = 12432; // 0x3090
    field public static final int EGL_LARGEST_PBUFFER = 12376; // 0x3058
    field public static final int EGL_LEVEL = 12329; // 0x3029
    field public static final int EGL_LUMINANCE_BUFFER = 12431; // 0x308f
    field public static final int EGL_LUMINANCE_SIZE = 12349; // 0x303d
    field public static final int EGL_MAX_PBUFFER_HEIGHT = 12330; // 0x302a
    field public static final int EGL_MAX_PBUFFER_PIXELS = 12331; // 0x302b
    field public static final int EGL_MAX_PBUFFER_WIDTH = 12332; // 0x302c
    field public static final int EGL_NATIVE_RENDERABLE = 12333; // 0x302d
    field public static final int EGL_NATIVE_VISUAL_ID = 12334; // 0x302e
    field public static final int EGL_NATIVE_VISUAL_TYPE = 12335; // 0x302f
    field public static final int EGL_NONE = 12344; // 0x3038
    field public static final int EGL_NON_CONFORMANT_CONFIG = 12369; // 0x3051
    field public static final int EGL_NOT_INITIALIZED = 12289; // 0x3001
    field public static final javax.microedition.khronos.egl.EGLContext EGL_NO_CONTEXT;
    field public static final javax.microedition.khronos.egl.EGLDisplay EGL_NO_DISPLAY;
    field public static final javax.microedition.khronos.egl.EGLSurface EGL_NO_SURFACE;
    field public static final int EGL_PBUFFER_BIT = 1; // 0x1
    field public static final int EGL_PIXEL_ASPECT_RATIO = 12434; // 0x3092
    field public static final int EGL_PIXMAP_BIT = 2; // 0x2
    field public static final int EGL_READ = 12378; // 0x305a
    field public static final int EGL_RED_SIZE = 12324; // 0x3024
    field public static final int EGL_RENDERABLE_TYPE = 12352; // 0x3040
    field public static final int EGL_RENDER_BUFFER = 12422; // 0x3086
    field public static final int EGL_RGB_BUFFER = 12430; // 0x308e
    field public static final int EGL_SAMPLES = 12337; // 0x3031
    field public static final int EGL_SAMPLE_BUFFERS = 12338; // 0x3032
    field public static final int EGL_SINGLE_BUFFER = 12421; // 0x3085
    field public static final int EGL_SLOW_CONFIG = 12368; // 0x3050
    field public static final int EGL_STENCIL_SIZE = 12326; // 0x3026
    field public static final int EGL_SUCCESS = 12288; // 0x3000
    field public static final int EGL_SURFACE_TYPE = 12339; // 0x3033
    field public static final int EGL_TRANSPARENT_BLUE_VALUE = 12341; // 0x3035
    field public static final int EGL_TRANSPARENT_GREEN_VALUE = 12342; // 0x3036
    field public static final int EGL_TRANSPARENT_RED_VALUE = 12343; // 0x3037
    field public static final int EGL_TRANSPARENT_RGB = 12370; // 0x3052
    field public static final int EGL_TRANSPARENT_TYPE = 12340; // 0x3034
    field public static final int EGL_VENDOR = 12371; // 0x3053
    field public static final int EGL_VERSION = 12372; // 0x3054
    field public static final int EGL_VERTICAL_RESOLUTION = 12433; // 0x3091
    field public static final int EGL_WIDTH = 12375; // 0x3057
    field public static final int EGL_WINDOW_BIT = 4; // 0x4
  }

  public interface EGL11 extends javax.microedition.khronos.egl.EGL10 {
    field public static final int EGL_CONTEXT_LOST = 12302; // 0x300e
  }

  public abstract class EGLConfig {
    ctor public EGLConfig();
  }

  public abstract class EGLContext {
    ctor public EGLContext();
    method public static javax.microedition.khronos.egl.EGL getEGL();
    method public abstract javax.microedition.khronos.opengles.GL getGL();
  }

  public abstract class EGLDisplay {
    ctor public EGLDisplay();
  }

  public abstract class EGLSurface {
    ctor public EGLSurface();
  }

}

package javax.microedition.khronos.opengles {

  public interface GL {
  }

  public interface GL10 extends javax.microedition.khronos.opengles.GL {
    method public void glActiveTexture(int);
    method public void glAlphaFunc(int, float);
    method public void glAlphaFuncx(int, int);
    method public void glBindTexture(int, int);
    method public void glBlendFunc(int, int);
    method public void glClear(int);
    method public void glClearColor(float, float, float, float);
    method public void glClearColorx(int, int, int, int);
    method public void glClearDepthf(float);
    method public void glClearDepthx(int);
    method public void glClearStencil(int);
    method public void glClientActiveTexture(int);
    method public void glColor4f(float, float, float, float);
    method public void glColor4x(int, int, int, int);
    method public void glColorMask(boolean, boolean, boolean, boolean);
    method public void glColorPointer(int, int, int, java.nio.Buffer);
    method public void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
    method public void glCompressedTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
    method public void glCopyTexImage2D(int, int, int, int, int, int, int, int);
    method public void glCopyTexSubImage2D(int, int, int, int, int, int, int, int);
    method public void glCullFace(int);
    method public void glDeleteTextures(int, int[], int);
    method public void glDeleteTextures(int, java.nio.IntBuffer);
    method public void glDepthFunc(int);
    method public void glDepthMask(boolean);
    method public void glDepthRangef(float, float);
    method public void glDepthRangex(int, int);
    method public void glDisable(int);
    method public void glDisableClientState(int);
    method public void glDrawArrays(int, int, int);
    method public void glDrawElements(int, int, int, java.nio.Buffer);
    method public void glEnable(int);
    method public void glEnableClientState(int);
    method public void glFinish();
    method public void glFlush();
    method public void glFogf(int, float);
    method public void glFogfv(int, float[], int);
    method public void glFogfv(int, java.nio.FloatBuffer);
    method public void glFogx(int, int);
    method public void glFogxv(int, int[], int);
    method public void glFogxv(int, java.nio.IntBuffer);
    method public void glFrontFace(int);
    method public void glFrustumf(float, float, float, float, float, float);
    method public void glFrustumx(int, int, int, int, int, int);
    method public void glGenTextures(int, int[], int);
    method public void glGenTextures(int, java.nio.IntBuffer);
    method public int glGetError();
    method public void glGetIntegerv(int, int[], int);
    method public void glGetIntegerv(int, java.nio.IntBuffer);
    method public String glGetString(int);
    method public void glHint(int, int);
    method public void glLightModelf(int, float);
    method public void glLightModelfv(int, float[], int);
    method public void glLightModelfv(int, java.nio.FloatBuffer);
    method public void glLightModelx(int, int);
    method public void glLightModelxv(int, int[], int);
    method public void glLightModelxv(int, java.nio.IntBuffer);
    method public void glLightf(int, int, float);
    method public void glLightfv(int, int, float[], int);
    method public void glLightfv(int, int, java.nio.FloatBuffer);
    method public void glLightx(int, int, int);
    method public void glLightxv(int, int, int[], int);
    method public void glLightxv(int, int, java.nio.IntBuffer);
    method public void glLineWidth(float);
    method public void glLineWidthx(int);
    method public void glLoadIdentity();
    method public void glLoadMatrixf(float[], int);
    method public void glLoadMatrixf(java.nio.FloatBuffer);
    method public void glLoadMatrixx(int[], int);
    method public void glLoadMatrixx(java.nio.IntBuffer);
    method public void glLogicOp(int);
    method public void glMaterialf(int, int, float);
    method public void glMaterialfv(int, int, float[], int);
    method public void glMaterialfv(int, int, java.nio.FloatBuffer);
    method public void glMaterialx(int, int, int);
    method public void glMaterialxv(int, int, int[], int);
    method public void glMaterialxv(int, int, java.nio.IntBuffer);
    method public void glMatrixMode(int);
    method public void glMultMatrixf(float[], int);
    method public void glMultMatrixf(java.nio.FloatBuffer);
    method public void glMultMatrixx(int[], int);
    method public void glMultMatrixx(java.nio.IntBuffer);
    method public void glMultiTexCoord4f(int, float, float, float, float);
    method public void glMultiTexCoord4x(int, int, int, int, int);
    method public void glNormal3f(float, float, float);
    method public void glNormal3x(int, int, int);
    method public void glNormalPointer(int, int, java.nio.Buffer);
    method public void glOrthof(float, float, float, float, float, float);
    method public void glOrthox(int, int, int, int, int, int);
    method public void glPixelStorei(int, int);
    method public void glPointSize(float);
    method public void glPointSizex(int);
    method public void glPolygonOffset(float, float);
    method public void glPolygonOffsetx(int, int);
    method public void glPopMatrix();
    method public void glPushMatrix();
    method public void glReadPixels(int, int, int, int, int, int, java.nio.Buffer);
    method public void glRotatef(float, float, float, float);
    method public void glRotatex(int, int, int, int);
    method public void glSampleCoverage(float, boolean);
    method public void glSampleCoveragex(int, boolean);
    method public void glScalef(float, float, float);
    method public void glScalex(int, int, int);
    method public void glScissor(int, int, int, int);
    method public void glShadeModel(int);
    method public void glStencilFunc(int, int, int);
    method public void glStencilMask(int);
    method public void glStencilOp(int, int, int);
    method public void glTexCoordPointer(int, int, int, java.nio.Buffer);
    method public void glTexEnvf(int, int, float);
    method public void glTexEnvfv(int, int, float[], int);
    method public void glTexEnvfv(int, int, java.nio.FloatBuffer);
    method public void glTexEnvx(int, int, int);
    method public void glTexEnvxv(int, int, int[], int);
    method public void glTexEnvxv(int, int, java.nio.IntBuffer);
    method public void glTexImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
    method public void glTexParameterf(int, int, float);
    method public void glTexParameterx(int, int, int);
    method public void glTexSubImage2D(int, int, int, int, int, int, int, int, java.nio.Buffer);
    method public void glTranslatef(float, float, float);
    method public void glTranslatex(int, int, int);
    method public void glVertexPointer(int, int, int, java.nio.Buffer);
    method public void glViewport(int, int, int, int);
    field public static final int GL_ADD = 260; // 0x104
    field public static final int GL_ALIASED_LINE_WIDTH_RANGE = 33902; // 0x846e
    field public static final int GL_ALIASED_POINT_SIZE_RANGE = 33901; // 0x846d
    field public static final int GL_ALPHA = 6406; // 0x1906
    field public static final int GL_ALPHA_BITS = 3413; // 0xd55
    field public static final int GL_ALPHA_TEST = 3008; // 0xbc0
    field public static final int GL_ALWAYS = 519; // 0x207
    field public static final int GL_AMBIENT = 4608; // 0x1200
    field public static final int GL_AMBIENT_AND_DIFFUSE = 5634; // 0x1602
    field public static final int GL_AND = 5377; // 0x1501
    field public static final int GL_AND_INVERTED = 5380; // 0x1504
    field public static final int GL_AND_REVERSE = 5378; // 0x1502
    field public static final int GL_BACK = 1029; // 0x405
    field public static final int GL_BLEND = 3042; // 0xbe2
    field public static final int GL_BLUE_BITS = 3412; // 0xd54
    field public static final int GL_BYTE = 5120; // 0x1400
    field public static final int GL_CCW = 2305; // 0x901
    field public static final int GL_CLAMP_TO_EDGE = 33071; // 0x812f
    field public static final int GL_CLEAR = 5376; // 0x1500
    field public static final int GL_COLOR_ARRAY = 32886; // 0x8076
    field public static final int GL_COLOR_BUFFER_BIT = 16384; // 0x4000
    field public static final int GL_COLOR_LOGIC_OP = 3058; // 0xbf2
    field public static final int GL_COLOR_MATERIAL = 2903; // 0xb57
    field public static final int GL_COMPRESSED_TEXTURE_FORMATS = 34467; // 0x86a3
    field public static final int GL_CONSTANT_ATTENUATION = 4615; // 0x1207
    field public static final int GL_COPY = 5379; // 0x1503
    field public static final int GL_COPY_INVERTED = 5388; // 0x150c
    field public static final int GL_CULL_FACE = 2884; // 0xb44
    field public static final int GL_CW = 2304; // 0x900
    field public static final int GL_DECAL = 8449; // 0x2101
    field public static final int GL_DECR = 7683; // 0x1e03
    field public static final int GL_DEPTH_BITS = 3414; // 0xd56
    field public static final int GL_DEPTH_BUFFER_BIT = 256; // 0x100
    field public static final int GL_DEPTH_TEST = 2929; // 0xb71
    field public static final int GL_DIFFUSE = 4609; // 0x1201
    field public static final int GL_DITHER = 3024; // 0xbd0
    field public static final int GL_DONT_CARE = 4352; // 0x1100
    field public static final int GL_DST_ALPHA = 772; // 0x304
    field public static final int GL_DST_COLOR = 774; // 0x306
    field public static final int GL_EMISSION = 5632; // 0x1600
    field public static final int GL_EQUAL = 514; // 0x202
    field public static final int GL_EQUIV = 5385; // 0x1509
    field public static final int GL_EXP = 2048; // 0x800
    field public static final int GL_EXP2 = 2049; // 0x801
    field public static final int GL_EXTENSIONS = 7939; // 0x1f03
    field public static final int GL_FALSE = 0; // 0x0
    field public static final int GL_FASTEST = 4353; // 0x1101
    field public static final int GL_FIXED = 5132; // 0x140c
    field public static final int GL_FLAT = 7424; // 0x1d00
    field public static final int GL_FLOAT = 5126; // 0x1406
    field public static final int GL_FOG = 2912; // 0xb60
    field public static final int GL_FOG_COLOR = 2918; // 0xb66
    field public static final int GL_FOG_DENSITY = 2914; // 0xb62
    field public static final int GL_FOG_END = 2916; // 0xb64
    field public static final int GL_FOG_HINT = 3156; // 0xc54
    field public static final int GL_FOG_MODE = 2917; // 0xb65
    field public static final int GL_FOG_START = 2915; // 0xb63
    field public static final int GL_FRONT = 1028; // 0x404
    field public static final int GL_FRONT_AND_BACK = 1032; // 0x408
    field public static final int GL_GEQUAL = 518; // 0x206
    field public static final int GL_GREATER = 516; // 0x204
    field public static final int GL_GREEN_BITS = 3411; // 0xd53
    field public static final int GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES = 35739; // 0x8b9b
    field public static final int GL_IMPLEMENTATION_COLOR_READ_TYPE_OES = 35738; // 0x8b9a
    field public static final int GL_INCR = 7682; // 0x1e02
    field public static final int GL_INVALID_ENUM = 1280; // 0x500
    field public static final int GL_INVALID_OPERATION = 1282; // 0x502
    field public static final int GL_INVALID_VALUE = 1281; // 0x501
    field public static final int GL_INVERT = 5386; // 0x150a
    field public static final int GL_KEEP = 7680; // 0x1e00
    field public static final int GL_LEQUAL = 515; // 0x203
    field public static final int GL_LESS = 513; // 0x201
    field public static final int GL_LIGHT0 = 16384; // 0x4000
    field public static final int GL_LIGHT1 = 16385; // 0x4001
    field public static final int GL_LIGHT2 = 16386; // 0x4002
    field public static final int GL_LIGHT3 = 16387; // 0x4003
    field public static final int GL_LIGHT4 = 16388; // 0x4004
    field public static final int GL_LIGHT5 = 16389; // 0x4005
    field public static final int GL_LIGHT6 = 16390; // 0x4006
    field public static final int GL_LIGHT7 = 16391; // 0x4007
    field public static final int GL_LIGHTING = 2896; // 0xb50
    field public static final int GL_LIGHT_MODEL_AMBIENT = 2899; // 0xb53
    field public static final int GL_LIGHT_MODEL_TWO_SIDE = 2898; // 0xb52
    field public static final int GL_LINEAR = 9729; // 0x2601
    field public static final int GL_LINEAR_ATTENUATION = 4616; // 0x1208
    field public static final int GL_LINEAR_MIPMAP_LINEAR = 9987; // 0x2703
    field public static final int GL_LINEAR_MIPMAP_NEAREST = 9985; // 0x2701
    field public static final int GL_LINES = 1; // 0x1
    field public static final int GL_LINE_LOOP = 2; // 0x2
    field public static final int GL_LINE_SMOOTH = 2848; // 0xb20
    field public static final int GL_LINE_SMOOTH_HINT = 3154; // 0xc52
    field public static final int GL_LINE_STRIP = 3; // 0x3
    field public static final int GL_LUMINANCE = 6409; // 0x1909
    field public static final int GL_LUMINANCE_ALPHA = 6410; // 0x190a
    field public static final int GL_MAX_ELEMENTS_INDICES = 33001; // 0x80e9
    field public static final int GL_MAX_ELEMENTS_VERTICES = 33000; // 0x80e8
    field public static final int GL_MAX_LIGHTS = 3377; // 0xd31
    field public static final int GL_MAX_MODELVIEW_STACK_DEPTH = 3382; // 0xd36
    field public static final int GL_MAX_PROJECTION_STACK_DEPTH = 3384; // 0xd38
    field public static final int GL_MAX_TEXTURE_SIZE = 3379; // 0xd33
    field public static final int GL_MAX_TEXTURE_STACK_DEPTH = 3385; // 0xd39
    field public static final int GL_MAX_TEXTURE_UNITS = 34018; // 0x84e2
    field public static final int GL_MAX_VIEWPORT_DIMS = 3386; // 0xd3a
    field public static final int GL_MODELVIEW = 5888; // 0x1700
    field public static final int GL_MODULATE = 8448; // 0x2100
    field public static final int GL_MULTISAMPLE = 32925; // 0x809d
    field public static final int GL_NAND = 5390; // 0x150e
    field public static final int GL_NEAREST = 9728; // 0x2600
    field public static final int GL_NEAREST_MIPMAP_LINEAR = 9986; // 0x2702
    field public static final int GL_NEAREST_MIPMAP_NEAREST = 9984; // 0x2700
    field public static final int GL_NEVER = 512; // 0x200
    field public static final int GL_NICEST = 4354; // 0x1102
    field public static final int GL_NOOP = 5381; // 0x1505
    field public static final int GL_NOR = 5384; // 0x1508
    field public static final int GL_NORMALIZE = 2977; // 0xba1
    field public static final int GL_NORMAL_ARRAY = 32885; // 0x8075
    field public static final int GL_NOTEQUAL = 517; // 0x205
    field public static final int GL_NO_ERROR = 0; // 0x0
    field public static final int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 34466; // 0x86a2
    field public static final int GL_ONE = 1; // 0x1
    field public static final int GL_ONE_MINUS_DST_ALPHA = 773; // 0x305
    field public static final int GL_ONE_MINUS_DST_COLOR = 775; // 0x307
    field public static final int GL_ONE_MINUS_SRC_ALPHA = 771; // 0x303
    field public static final int GL_ONE_MINUS_SRC_COLOR = 769; // 0x301
    field public static final int GL_OR = 5383; // 0x1507
    field public static final int GL_OR_INVERTED = 5389; // 0x150d
    field public static final int GL_OR_REVERSE = 5387; // 0x150b
    field public static final int GL_OUT_OF_MEMORY = 1285; // 0x505
    field public static final int GL_PACK_ALIGNMENT = 3333; // 0xd05
    field public static final int GL_PALETTE4_R5_G6_B5_OES = 35730; // 0x8b92
    field public static final int GL_PALETTE4_RGB5_A1_OES = 35732; // 0x8b94
    field public static final int GL_PALETTE4_RGB8_OES = 35728; // 0x8b90
    field public static final int GL_PALETTE4_RGBA4_OES = 35731; // 0x8b93
    field public static final int GL_PALETTE4_RGBA8_OES = 35729; // 0x8b91
    field public static final int GL_PALETTE8_R5_G6_B5_OES = 35735; // 0x8b97
    field public static final int GL_PALETTE8_RGB5_A1_OES = 35737; // 0x8b99
    field public static final int GL_PALETTE8_RGB8_OES = 35733; // 0x8b95
    field public static final int GL_PALETTE8_RGBA4_OES = 35736; // 0x8b98
    field public static final int GL_PALETTE8_RGBA8_OES = 35734; // 0x8b96
    field public static final int GL_PERSPECTIVE_CORRECTION_HINT = 3152; // 0xc50
    field public static final int GL_POINTS = 0; // 0x0
    field public static final int GL_POINT_FADE_THRESHOLD_SIZE = 33064; // 0x8128
    field public static final int GL_POINT_SIZE = 2833; // 0xb11
    field public static final int GL_POINT_SMOOTH = 2832; // 0xb10
    field public static final int GL_POINT_SMOOTH_HINT = 3153; // 0xc51
    field public static final int GL_POLYGON_OFFSET_FILL = 32823; // 0x8037
    field public static final int GL_POLYGON_SMOOTH_HINT = 3155; // 0xc53
    field public static final int GL_POSITION = 4611; // 0x1203
    field public static final int GL_PROJECTION = 5889; // 0x1701
    field public static final int GL_QUADRATIC_ATTENUATION = 4617; // 0x1209
    field public static final int GL_RED_BITS = 3410; // 0xd52
    field public static final int GL_RENDERER = 7937; // 0x1f01
    field public static final int GL_REPEAT = 10497; // 0x2901
    field public static final int GL_REPLACE = 7681; // 0x1e01
    field public static final int GL_RESCALE_NORMAL = 32826; // 0x803a
    field public static final int GL_RGB = 6407; // 0x1907
    field public static final int GL_RGBA = 6408; // 0x1908
    field public static final int GL_SAMPLE_ALPHA_TO_COVERAGE = 32926; // 0x809e
    field public static final int GL_SAMPLE_ALPHA_TO_ONE = 32927; // 0x809f
    field public static final int GL_SAMPLE_COVERAGE = 32928; // 0x80a0
    field public static final int GL_SCISSOR_TEST = 3089; // 0xc11
    field public static final int GL_SET = 5391; // 0x150f
    field public static final int GL_SHININESS = 5633; // 0x1601
    field public static final int GL_SHORT = 5122; // 0x1402
    field public static final int GL_SMOOTH = 7425; // 0x1d01
    field public static final int GL_SMOOTH_LINE_WIDTH_RANGE = 2850; // 0xb22
    field public static final int GL_SMOOTH_POINT_SIZE_RANGE = 2834; // 0xb12
    field public static final int GL_SPECULAR = 4610; // 0x1202
    field public static final int GL_SPOT_CUTOFF = 4614; // 0x1206
    field public static final int GL_SPOT_DIRECTION = 4612; // 0x1204
    field public static final int GL_SPOT_EXPONENT = 4613; // 0x1205
    field public static final int GL_SRC_ALPHA = 770; // 0x302
    field public static final int GL_SRC_ALPHA_SATURATE = 776; // 0x308
    field public static final int GL_SRC_COLOR = 768; // 0x300
    field public static final int GL_STACK_OVERFLOW = 1283; // 0x503
    field public static final int GL_STACK_UNDERFLOW = 1284; // 0x504
    field public static final int GL_STENCIL_BITS = 3415; // 0xd57
    field public static final int GL_STENCIL_BUFFER_BIT = 1024; // 0x400
    field public static final int GL_STENCIL_TEST = 2960; // 0xb90
    field public static final int GL_SUBPIXEL_BITS = 3408; // 0xd50
    field public static final int GL_TEXTURE = 5890; // 0x1702
    field public static final int GL_TEXTURE0 = 33984; // 0x84c0
    field public static final int GL_TEXTURE1 = 33985; // 0x84c1
    field public static final int GL_TEXTURE10 = 33994; // 0x84ca
    field public static final int GL_TEXTURE11 = 33995; // 0x84cb
    field public static final int GL_TEXTURE12 = 33996; // 0x84cc
    field public static final int GL_TEXTURE13 = 33997; // 0x84cd
    field public static final int GL_TEXTURE14 = 33998; // 0x84ce
    field public static final int GL_TEXTURE15 = 33999; // 0x84cf
    field public static final int GL_TEXTURE16 = 34000; // 0x84d0
    field public static final int GL_TEXTURE17 = 34001; // 0x84d1
    field public static final int GL_TEXTURE18 = 34002; // 0x84d2
    field public static final int GL_TEXTURE19 = 34003; // 0x84d3
    field public static final int GL_TEXTURE2 = 33986; // 0x84c2
    field public static final int GL_TEXTURE20 = 34004; // 0x84d4
    field public static final int GL_TEXTURE21 = 34005; // 0x84d5
    field public static final int GL_TEXTURE22 = 34006; // 0x84d6
    field public static final int GL_TEXTURE23 = 34007; // 0x84d7
    field public static final int GL_TEXTURE24 = 34008; // 0x84d8
    field public static final int GL_TEXTURE25 = 34009; // 0x84d9
    field public static final int GL_TEXTURE26 = 34010; // 0x84da
    field public static final int GL_TEXTURE27 = 34011; // 0x84db
    field public static final int GL_TEXTURE28 = 34012; // 0x84dc
    field public static final int GL_TEXTURE29 = 34013; // 0x84dd
    field public static final int GL_TEXTURE3 = 33987; // 0x84c3
    field public static final int GL_TEXTURE30 = 34014; // 0x84de
    field public static final int GL_TEXTURE31 = 34015; // 0x84df
    field public static final int GL_TEXTURE4 = 33988; // 0x84c4
    field public static final int GL_TEXTURE5 = 33989; // 0x84c5
    field public static final int GL_TEXTURE6 = 33990; // 0x84c6
    field public static final int GL_TEXTURE7 = 33991; // 0x84c7
    field public static final int GL_TEXTURE8 = 33992; // 0x84c8
    field public static final int GL_TEXTURE9 = 33993; // 0x84c9
    field public static final int GL_TEXTURE_2D = 3553; // 0xde1
    field public static final int GL_TEXTURE_COORD_ARRAY = 32888; // 0x8078
    field public static final int GL_TEXTURE_ENV = 8960; // 0x2300
    field public static final int GL_TEXTURE_ENV_COLOR = 8705; // 0x2201
    field public static final int GL_TEXTURE_ENV_MODE = 8704; // 0x2200
    field public static final int GL_TEXTURE_MAG_FILTER = 10240; // 0x2800
    field public static final int GL_TEXTURE_MIN_FILTER = 10241; // 0x2801
    field public static final int GL_TEXTURE_WRAP_S = 10242; // 0x2802
    field public static final int GL_TEXTURE_WRAP_T = 10243; // 0x2803
    field public static final int GL_TRIANGLES = 4; // 0x4
    field public static final int GL_TRIANGLE_FAN = 6; // 0x6
    field public static final int GL_TRIANGLE_STRIP = 5; // 0x5
    field public static final int GL_TRUE = 1; // 0x1
    field public static final int GL_UNPACK_ALIGNMENT = 3317; // 0xcf5
    field public static final int GL_UNSIGNED_BYTE = 5121; // 0x1401
    field public static final int GL_UNSIGNED_SHORT = 5123; // 0x1403
    field public static final int GL_UNSIGNED_SHORT_4_4_4_4 = 32819; // 0x8033
    field public static final int GL_UNSIGNED_SHORT_5_5_5_1 = 32820; // 0x8034
    field public static final int GL_UNSIGNED_SHORT_5_6_5 = 33635; // 0x8363
    field public static final int GL_VENDOR = 7936; // 0x1f00
    field public static final int GL_VERSION = 7938; // 0x1f02
    field public static final int GL_VERTEX_ARRAY = 32884; // 0x8074
    field public static final int GL_XOR = 5382; // 0x1506
    field public static final int GL_ZERO = 0; // 0x0
  }

  public interface GL10Ext extends javax.microedition.khronos.opengles.GL {
    method public int glQueryMatrixxOES(int[], int, int[], int);
    method public int glQueryMatrixxOES(java.nio.IntBuffer, java.nio.IntBuffer);
  }

  public interface GL11 extends javax.microedition.khronos.opengles.GL10 {
    method public void glBindBuffer(int, int);
    method public void glBufferData(int, int, java.nio.Buffer, int);
    method public void glBufferSubData(int, int, int, java.nio.Buffer);
    method public void glClipPlanef(int, float[], int);
    method public void glClipPlanef(int, java.nio.FloatBuffer);
    method public void glClipPlanex(int, int[], int);
    method public void glClipPlanex(int, java.nio.IntBuffer);
    method public void glColor4ub(byte, byte, byte, byte);
    method public void glColorPointer(int, int, int, int);
    method public void glDeleteBuffers(int, int[], int);
    method public void glDeleteBuffers(int, java.nio.IntBuffer);
    method public void glDrawElements(int, int, int, int);
    method public void glGenBuffers(int, int[], int);
    method public void glGenBuffers(int, java.nio.IntBuffer);
    method public void glGetBooleanv(int, boolean[], int);
    method public void glGetBooleanv(int, java.nio.IntBuffer);
    method public void glGetBufferParameteriv(int, int, int[], int);
    method public void glGetBufferParameteriv(int, int, java.nio.IntBuffer);
    method public void glGetClipPlanef(int, float[], int);
    method public void glGetClipPlanef(int, java.nio.FloatBuffer);
    method public void glGetClipPlanex(int, int[], int);
    method public void glGetClipPlanex(int, java.nio.IntBuffer);
    method public void glGetFixedv(int, int[], int);
    method public void glGetFixedv(int, java.nio.IntBuffer);
    method public void glGetFloatv(int, float[], int);
    method public void glGetFloatv(int, java.nio.FloatBuffer);
    method public void glGetLightfv(int, int, float[], int);
    method public void glGetLightfv(int, int, java.nio.FloatBuffer);
    method public void glGetLightxv(int, int, int[], int);
    method public void glGetLightxv(int, int, java.nio.IntBuffer);
    method public void glGetMaterialfv(int, int, float[], int);
    method public void glGetMaterialfv(int, int, java.nio.FloatBuffer);
    method public void glGetMaterialxv(int, int, int[], int);
    method public void glGetMaterialxv(int, int, java.nio.IntBuffer);
    method public void glGetPointerv(int, java.nio.Buffer[]);
    method public void glGetTexEnviv(int, int, int[], int);
    method public void glGetTexEnviv(int, int, java.nio.IntBuffer);
    method public void glGetTexEnvxv(int, int, int[], int);
    method public void glGetTexEnvxv(int, int, java.nio.IntBuffer);
    method public void glGetTexParameterfv(int, int, float[], int);
    method public void glGetTexParameterfv(int, int, java.nio.FloatBuffer);
    method public void glGetTexParameteriv(int, int, int[], int);
    method public void glGetTexParameteriv(int, int, java.nio.IntBuffer);
    method public void glGetTexParameterxv(int, int, int[], int);
    method public void glGetTexParameterxv(int, int, java.nio.IntBuffer);
    method public boolean glIsBuffer(int);
    method public boolean glIsEnabled(int);
    method public boolean glIsTexture(int);
    method public void glNormalPointer(int, int, int);
    method public void glPointParameterf(int, float);
    method public void glPointParameterfv(int, float[], int);
    method public void glPointParameterfv(int, java.nio.FloatBuffer);
    method public void glPointParameterx(int, int);
    method public void glPointParameterxv(int, int[], int);
    method public void glPointParameterxv(int, java.nio.IntBuffer);
    method public void glPointSizePointerOES(int, int, java.nio.Buffer);
    method public void glTexCoordPointer(int, int, int, int);
    method public void glTexEnvi(int, int, int);
    method public void glTexEnviv(int, int, int[], int);
    method public void glTexEnviv(int, int, java.nio.IntBuffer);
    method public void glTexParameterfv(int, int, float[], int);
    method public void glTexParameterfv(int, int, java.nio.FloatBuffer);
    method public void glTexParameteri(int, int, int);
    method public void glTexParameteriv(int, int, int[], int);
    method public void glTexParameteriv(int, int, java.nio.IntBuffer);
    method public void glTexParameterxv(int, int, int[], int);
    method public void glTexParameterxv(int, int, java.nio.IntBuffer);
    method public void glVertexPointer(int, int, int, int);
    field public static final int GL_ACTIVE_TEXTURE = 34016; // 0x84e0
    field public static final int GL_ADD_SIGNED = 34164; // 0x8574
    field public static final int GL_ALPHA_SCALE = 3356; // 0xd1c
    field public static final int GL_ALPHA_TEST_FUNC = 3009; // 0xbc1
    field public static final int GL_ALPHA_TEST_REF = 3010; // 0xbc2
    field public static final int GL_ARRAY_BUFFER = 34962; // 0x8892
    field public static final int GL_ARRAY_BUFFER_BINDING = 34964; // 0x8894
    field public static final int GL_BLEND_DST = 3040; // 0xbe0
    field public static final int GL_BLEND_SRC = 3041; // 0xbe1
    field public static final int GL_BUFFER_ACCESS = 35003; // 0x88bb
    field public static final int GL_BUFFER_SIZE = 34660; // 0x8764
    field public static final int GL_BUFFER_USAGE = 34661; // 0x8765
    field public static final int GL_CLIENT_ACTIVE_TEXTURE = 34017; // 0x84e1
    field public static final int GL_CLIP_PLANE0 = 12288; // 0x3000
    field public static final int GL_CLIP_PLANE1 = 12289; // 0x3001
    field public static final int GL_CLIP_PLANE2 = 12290; // 0x3002
    field public static final int GL_CLIP_PLANE3 = 12291; // 0x3003
    field public static final int GL_CLIP_PLANE4 = 12292; // 0x3004
    field public static final int GL_CLIP_PLANE5 = 12293; // 0x3005
    field public static final int GL_COLOR_ARRAY_BUFFER_BINDING = 34968; // 0x8898
    field public static final int GL_COLOR_ARRAY_POINTER = 32912; // 0x8090
    field public static final int GL_COLOR_ARRAY_SIZE = 32897; // 0x8081
    field public static final int GL_COLOR_ARRAY_STRIDE = 32899; // 0x8083
    field public static final int GL_COLOR_ARRAY_TYPE = 32898; // 0x8082
    field public static final int GL_COLOR_CLEAR_VALUE = 3106; // 0xc22
    field public static final int GL_COLOR_WRITEMASK = 3107; // 0xc23
    field public static final int GL_COMBINE = 34160; // 0x8570
    field public static final int GL_COMBINE_ALPHA = 34162; // 0x8572
    field public static final int GL_COMBINE_RGB = 34161; // 0x8571
    field public static final int GL_CONSTANT = 34166; // 0x8576
    field public static final int GL_COORD_REPLACE_OES = 34914; // 0x8862
    field public static final int GL_CULL_FACE_MODE = 2885; // 0xb45
    field public static final int GL_CURRENT_COLOR = 2816; // 0xb00
    field public static final int GL_CURRENT_NORMAL = 2818; // 0xb02
    field public static final int GL_CURRENT_TEXTURE_COORDS = 2819; // 0xb03
    field public static final int GL_DEPTH_CLEAR_VALUE = 2931; // 0xb73
    field public static final int GL_DEPTH_FUNC = 2932; // 0xb74
    field public static final int GL_DEPTH_RANGE = 2928; // 0xb70
    field public static final int GL_DEPTH_WRITEMASK = 2930; // 0xb72
    field public static final int GL_DOT3_RGB = 34478; // 0x86ae
    field public static final int GL_DOT3_RGBA = 34479; // 0x86af
    field public static final int GL_DYNAMIC_DRAW = 35048; // 0x88e8
    field public static final int GL_ELEMENT_ARRAY_BUFFER = 34963; // 0x8893
    field public static final int GL_ELEMENT_ARRAY_BUFFER_BINDING = 34965; // 0x8895
    field public static final int GL_FRONT_FACE = 2886; // 0xb46
    field public static final int GL_GENERATE_MIPMAP = 33169; // 0x8191
    field public static final int GL_GENERATE_MIPMAP_HINT = 33170; // 0x8192
    field public static final int GL_INTERPOLATE = 34165; // 0x8575
    field public static final int GL_LINE_WIDTH = 2849; // 0xb21
    field public static final int GL_LOGIC_OP_MODE = 3056; // 0xbf0
    field public static final int GL_MATRIX_MODE = 2976; // 0xba0
    field public static final int GL_MAX_CLIP_PLANES = 3378; // 0xd32
    field public static final int GL_MODELVIEW_MATRIX = 2982; // 0xba6
    field public static final int GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES = 35213; // 0x898d
    field public static final int GL_MODELVIEW_STACK_DEPTH = 2979; // 0xba3
    field public static final int GL_NORMAL_ARRAY_BUFFER_BINDING = 34967; // 0x8897
    field public static final int GL_NORMAL_ARRAY_POINTER = 32911; // 0x808f
    field public static final int GL_NORMAL_ARRAY_STRIDE = 32895; // 0x807f
    field public static final int GL_NORMAL_ARRAY_TYPE = 32894; // 0x807e
    field public static final int GL_OPERAND0_ALPHA = 34200; // 0x8598
    field public static final int GL_OPERAND0_RGB = 34192; // 0x8590
    field public static final int GL_OPERAND1_ALPHA = 34201; // 0x8599
    field public static final int GL_OPERAND1_RGB = 34193; // 0x8591
    field public static final int GL_OPERAND2_ALPHA = 34202; // 0x859a
    field public static final int GL_OPERAND2_RGB = 34194; // 0x8592
    field public static final int GL_POINT_DISTANCE_ATTENUATION = 33065; // 0x8129
    field public static final int GL_POINT_FADE_THRESHOLD_SIZE = 33064; // 0x8128
    field public static final int GL_POINT_SIZE = 2833; // 0xb11
    field public static final int GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES = 35743; // 0x8b9f
    field public static final int GL_POINT_SIZE_ARRAY_OES = 35740; // 0x8b9c
    field public static final int GL_POINT_SIZE_ARRAY_POINTER_OES = 35212; // 0x898c
    field public static final int GL_POINT_SIZE_ARRAY_STRIDE_OES = 35211; // 0x898b
    field public static final int GL_POINT_SIZE_ARRAY_TYPE_OES = 35210; // 0x898a
    field public static final int GL_POINT_SIZE_MAX = 33063; // 0x8127
    field public static final int GL_POINT_SIZE_MIN = 33062; // 0x8126
    field public static final int GL_POINT_SPRITE_OES = 34913; // 0x8861
    field public static final int GL_POLYGON_OFFSET_FACTOR = 32824; // 0x8038
    field public static final int GL_POLYGON_OFFSET_UNITS = 10752; // 0x2a00
    field public static final int GL_PREVIOUS = 34168; // 0x8578
    field public static final int GL_PRIMARY_COLOR = 34167; // 0x8577
    field public static final int GL_PROJECTION_MATRIX = 2983; // 0xba7
    field public static final int GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES = 35214; // 0x898e
    field public static final int GL_PROJECTION_STACK_DEPTH = 2980; // 0xba4
    field public static final int GL_RGB_SCALE = 34163; // 0x8573
    field public static final int GL_SAMPLES = 32937; // 0x80a9
    field public static final int GL_SAMPLE_BUFFERS = 32936; // 0x80a8
    field public static final int GL_SAMPLE_COVERAGE_INVERT = 32939; // 0x80ab
    field public static final int GL_SAMPLE_COVERAGE_VALUE = 32938; // 0x80aa
    field public static final int GL_SCISSOR_BOX = 3088; // 0xc10
    field public static final int GL_SHADE_MODEL = 2900; // 0xb54
    field public static final int GL_SRC0_ALPHA = 34184; // 0x8588
    field public static final int GL_SRC0_RGB = 34176; // 0x8580
    field public static final int GL_SRC1_ALPHA = 34185; // 0x8589
    field public static final int GL_SRC1_RGB = 34177; // 0x8581
    field public static final int GL_SRC2_ALPHA = 34186; // 0x858a
    field public static final int GL_SRC2_RGB = 34178; // 0x8582
    field public static final int GL_STATIC_DRAW = 35044; // 0x88e4
    field public static final int GL_STENCIL_CLEAR_VALUE = 2961; // 0xb91
    field public static final int GL_STENCIL_FAIL = 2964; // 0xb94
    field public static final int GL_STENCIL_FUNC = 2962; // 0xb92
    field public static final int GL_STENCIL_PASS_DEPTH_FAIL = 2965; // 0xb95
    field public static final int GL_STENCIL_PASS_DEPTH_PASS = 2966; // 0xb96
    field public static final int GL_STENCIL_REF = 2967; // 0xb97
    field public static final int GL_STENCIL_VALUE_MASK = 2963; // 0xb93
    field public static final int GL_STENCIL_WRITEMASK = 2968; // 0xb98
    field public static final int GL_SUBTRACT = 34023; // 0x84e7
    field public static final int GL_TEXTURE_BINDING_2D = 32873; // 0x8069
    field public static final int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 34970; // 0x889a
    field public static final int GL_TEXTURE_COORD_ARRAY_POINTER = 32914; // 0x8092
    field public static final int GL_TEXTURE_COORD_ARRAY_SIZE = 32904; // 0x8088
    field public static final int GL_TEXTURE_COORD_ARRAY_STRIDE = 32906; // 0x808a
    field public static final int GL_TEXTURE_COORD_ARRAY_TYPE = 32905; // 0x8089
    field public static final int GL_TEXTURE_MATRIX = 2984; // 0xba8
    field public static final int GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES = 35215; // 0x898f
    field public static final int GL_TEXTURE_STACK_DEPTH = 2981; // 0xba5
    field public static final int GL_VERTEX_ARRAY_BUFFER_BINDING = 34966; // 0x8896
    field public static final int GL_VERTEX_ARRAY_POINTER = 32910; // 0x808e
    field public static final int GL_VERTEX_ARRAY_SIZE = 32890; // 0x807a
    field public static final int GL_VERTEX_ARRAY_STRIDE = 32892; // 0x807c
    field public static final int GL_VERTEX_ARRAY_TYPE = 32891; // 0x807b
    field public static final int GL_VIEWPORT = 2978; // 0xba2
    field public static final int GL_WRITE_ONLY = 35001; // 0x88b9
  }

  public interface GL11Ext extends javax.microedition.khronos.opengles.GL {
    method public void glCurrentPaletteMatrixOES(int);
    method public void glDrawTexfOES(float, float, float, float, float);
    method public void glDrawTexfvOES(float[], int);
    method public void glDrawTexfvOES(java.nio.FloatBuffer);
    method public void glDrawTexiOES(int, int, int, int, int);
    method public void glDrawTexivOES(int[], int);
    method public void glDrawTexivOES(java.nio.IntBuffer);
    method public void glDrawTexsOES(short, short, short, short, short);
    method public void glDrawTexsvOES(short[], int);
    method public void glDrawTexsvOES(java.nio.ShortBuffer);
    method public void glDrawTexxOES(int, int, int, int, int);
    method public void glDrawTexxvOES(int[], int);
    method public void glDrawTexxvOES(java.nio.IntBuffer);
    method public void glEnable(int);
    method public void glEnableClientState(int);
    method public void glLoadPaletteFromModelViewMatrixOES();
    method public void glMatrixIndexPointerOES(int, int, int, java.nio.Buffer);
    method public void glMatrixIndexPointerOES(int, int, int, int);
    method public void glTexParameterfv(int, int, float[], int);
    method public void glWeightPointerOES(int, int, int, java.nio.Buffer);
    method public void glWeightPointerOES(int, int, int, int);
    field public static final int GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES = 35742; // 0x8b9e
    field public static final int GL_MATRIX_INDEX_ARRAY_OES = 34884; // 0x8844
    field public static final int GL_MATRIX_INDEX_ARRAY_POINTER_OES = 34889; // 0x8849
    field public static final int GL_MATRIX_INDEX_ARRAY_SIZE_OES = 34886; // 0x8846
    field public static final int GL_MATRIX_INDEX_ARRAY_STRIDE_OES = 34888; // 0x8848
    field public static final int GL_MATRIX_INDEX_ARRAY_TYPE_OES = 34887; // 0x8847
    field public static final int GL_MATRIX_PALETTE_OES = 34880; // 0x8840
    field public static final int GL_MAX_PALETTE_MATRICES_OES = 34882; // 0x8842
    field public static final int GL_MAX_VERTEX_UNITS_OES = 34468; // 0x86a4
    field public static final int GL_TEXTURE_CROP_RECT_OES = 35741; // 0x8b9d
    field public static final int GL_WEIGHT_ARRAY_BUFFER_BINDING_OES = 34974; // 0x889e
    field public static final int GL_WEIGHT_ARRAY_OES = 34477; // 0x86ad
    field public static final int GL_WEIGHT_ARRAY_POINTER_OES = 34476; // 0x86ac
    field public static final int GL_WEIGHT_ARRAY_SIZE_OES = 34475; // 0x86ab
    field public static final int GL_WEIGHT_ARRAY_STRIDE_OES = 34474; // 0x86aa
    field public static final int GL_WEIGHT_ARRAY_TYPE_OES = 34473; // 0x86a9
  }

  public interface GL11ExtensionPack extends javax.microedition.khronos.opengles.GL {
    method public void glBindFramebufferOES(int, int);
    method public void glBindRenderbufferOES(int, int);
    method public void glBindTexture(int, int);
    method public void glBlendEquation(int);
    method public void glBlendEquationSeparate(int, int);
    method public void glBlendFuncSeparate(int, int, int, int);
    method public int glCheckFramebufferStatusOES(int);
    method public void glCompressedTexImage2D(int, int, int, int, int, int, int, java.nio.Buffer);
    method public void glCopyTexImage2D(int, int, int, int, int, int, int, int);
    method public void glDeleteFramebuffersOES(int, int[], int);
    method public void glDeleteFramebuffersOES(int, java.nio.IntBuffer);
    method public void glDeleteRenderbuffersOES(int, int[], int);
    method public void glDeleteRenderbuffersOES(int, java.nio.IntBuffer);
    method public void glEnable(int);
    method public void glFramebufferRenderbufferOES(int, int, int, int);
    method public void glFramebufferTexture2DOES(int, int, int, int, int);
    method public void glGenFramebuffersOES(int, int[], int);
    method public void glGenFramebuffersOES(int, java.nio.IntBuffer);
    method public void glGenRenderbuffersOES(int, int[], int);
    method public void glGenRenderbuffersOES(int, java.nio.IntBuffer);
    method public void glGenerateMipmapOES(int);
    method public void glGetFramebufferAttachmentParameterivOES(int, int, int, int[], int);
    method public void glGetFramebufferAttachmentParameterivOES(int, int, int, java.nio.IntBuffer);
    method public void glGetIntegerv(int, int[], int);
    method public void glGetIntegerv(int, java.nio.IntBuffer);
    method public void glGetRenderbufferParameterivOES(int, int, int[], int);
    method public void glGetRenderbufferParameterivOES(int, int, java.nio.IntBuffer);
    method public void glGetTexGenfv(int, int, float[], int);
    method public void glGetTexGenfv(int, int, java.nio.FloatBuffer);
    method public void glGetTexGeniv(int, int, int[], int);
    method public void glGetTexGeniv(int, int, java.nio.IntBuffer);
    method public void glGetTexGenxv(int, int, int[], int);
    method public void glGetTexGenxv(int, int, java.nio.IntBuffer);
    method public boolean glIsFramebufferOES(int);
    method public boolean glIsRenderbufferOES(int);
    method public void glRenderbufferStorageOES(int, int, int, int);
    method public void glStencilOp(int, int, int);
    method public void glTexEnvf(int, int, float);
    method public void glTexEnvfv(int, int, float[], int);
    method public void glTexEnvfv(int, int, java.nio.FloatBuffer);
    method public void glTexEnvx(int, int, int);
    method public void glTexEnvxv(int, int, int[], int);
    method public void glTexEnvxv(int, int, java.nio.IntBuffer);
    method public void glTexGenf(int, int, float);
    method public void glTexGenfv(int, int, float[], int);
    method public void glTexGenfv(int, int, java.nio.FloatBuffer);
    method public void glTexGeni(int, int, int);
    method public void glTexGeniv(int, int, int[], int);
    method public void glTexGeniv(int, int, java.nio.IntBuffer);
    method public void glTexGenx(int, int, int);
    method public void glTexGenxv(int, int, int[], int);
    method public void glTexGenxv(int, int, java.nio.IntBuffer);
    method public void glTexParameterf(int, int, float);
    field public static final int GL_BLEND_DST_ALPHA = 32970; // 0x80ca
    field public static final int GL_BLEND_DST_RGB = 32968; // 0x80c8
    field public static final int GL_BLEND_EQUATION = 32777; // 0x8009
    field public static final int GL_BLEND_EQUATION_ALPHA = 34877; // 0x883d
    field public static final int GL_BLEND_EQUATION_RGB = 32777; // 0x8009
    field public static final int GL_BLEND_SRC_ALPHA = 32971; // 0x80cb
    field public static final int GL_BLEND_SRC_RGB = 32969; // 0x80c9
    field public static final int GL_COLOR_ATTACHMENT0_OES = 36064; // 0x8ce0
    field public static final int GL_COLOR_ATTACHMENT10_OES = 36074; // 0x8cea
    field public static final int GL_COLOR_ATTACHMENT11_OES = 36075; // 0x8ceb
    field public static final int GL_COLOR_ATTACHMENT12_OES = 36076; // 0x8cec
    field public static final int GL_COLOR_ATTACHMENT13_OES = 36077; // 0x8ced
    field public static final int GL_COLOR_ATTACHMENT14_OES = 36078; // 0x8cee
    field public static final int GL_COLOR_ATTACHMENT15_OES = 36079; // 0x8cef
    field public static final int GL_COLOR_ATTACHMENT1_OES = 36065; // 0x8ce1
    field public static final int GL_COLOR_ATTACHMENT2_OES = 36066; // 0x8ce2
    field public static final int GL_COLOR_ATTACHMENT3_OES = 36067; // 0x8ce3
    field public static final int GL_COLOR_ATTACHMENT4_OES = 36068; // 0x8ce4
    field public static final int GL_COLOR_ATTACHMENT5_OES = 36069; // 0x8ce5
    field public static final int GL_COLOR_ATTACHMENT6_OES = 36070; // 0x8ce6
    field public static final int GL_COLOR_ATTACHMENT7_OES = 36071; // 0x8ce7
    field public static final int GL_COLOR_ATTACHMENT8_OES = 36072; // 0x8ce8
    field public static final int GL_COLOR_ATTACHMENT9_OES = 36073; // 0x8ce9
    field public static final int GL_DECR_WRAP = 34056; // 0x8508
    field public static final int GL_DEPTH_ATTACHMENT_OES = 36096; // 0x8d00
    field public static final int GL_DEPTH_COMPONENT = 6402; // 0x1902
    field public static final int GL_DEPTH_COMPONENT16 = 33189; // 0x81a5
    field public static final int GL_DEPTH_COMPONENT24 = 33190; // 0x81a6
    field public static final int GL_DEPTH_COMPONENT32 = 33191; // 0x81a7
    field public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES = 36049; // 0x8cd1
    field public static final int GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES = 36048; // 0x8cd0
    field public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES = 36051; // 0x8cd3
    field public static final int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES = 36050; // 0x8cd2
    field public static final int GL_FRAMEBUFFER_BINDING_OES = 36006; // 0x8ca6
    field public static final int GL_FRAMEBUFFER_COMPLETE_OES = 36053; // 0x8cd5
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES = 36054; // 0x8cd6
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES = 36057; // 0x8cd9
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES = 36059; // 0x8cdb
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES = 36058; // 0x8cda
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES = 36055; // 0x8cd7
    field public static final int GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES = 36060; // 0x8cdc
    field public static final int GL_FRAMEBUFFER_OES = 36160; // 0x8d40
    field public static final int GL_FRAMEBUFFER_UNSUPPORTED_OES = 36061; // 0x8cdd
    field public static final int GL_FUNC_ADD = 32774; // 0x8006
    field public static final int GL_FUNC_REVERSE_SUBTRACT = 32779; // 0x800b
    field public static final int GL_FUNC_SUBTRACT = 32778; // 0x800a
    field public static final int GL_INCR_WRAP = 34055; // 0x8507
    field public static final int GL_INVALID_FRAMEBUFFER_OPERATION_OES = 1286; // 0x506
    field public static final int GL_MAX_COLOR_ATTACHMENTS_OES = 36063; // 0x8cdf
    field public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 34076; // 0x851c
    field public static final int GL_MAX_RENDERBUFFER_SIZE_OES = 34024; // 0x84e8
    field public static final int GL_MIRRORED_REPEAT = 33648; // 0x8370
    field public static final int GL_NORMAL_MAP = 34065; // 0x8511
    field public static final int GL_REFLECTION_MAP = 34066; // 0x8512
    field public static final int GL_RENDERBUFFER_ALPHA_SIZE_OES = 36179; // 0x8d53
    field public static final int GL_RENDERBUFFER_BINDING_OES = 36007; // 0x8ca7
    field public static final int GL_RENDERBUFFER_BLUE_SIZE_OES = 36178; // 0x8d52
    field public static final int GL_RENDERBUFFER_DEPTH_SIZE_OES = 36180; // 0x8d54
    field public static final int GL_RENDERBUFFER_GREEN_SIZE_OES = 36177; // 0x8d51
    field public static final int GL_RENDERBUFFER_HEIGHT_OES = 36163; // 0x8d43
    field public static final int GL_RENDERBUFFER_INTERNAL_FORMAT_OES = 36164; // 0x8d44
    field public static final int GL_RENDERBUFFER_OES = 36161; // 0x8d41
    field public static final int GL_RENDERBUFFER_RED_SIZE_OES = 36176; // 0x8d50
    field public static final int GL_RENDERBUFFER_STENCIL_SIZE_OES = 36181; // 0x8d55
    field public static final int GL_RENDERBUFFER_WIDTH_OES = 36162; // 0x8d42
    field public static final int GL_RGB565_OES = 36194; // 0x8d62
    field public static final int GL_RGB5_A1 = 32855; // 0x8057
    field public static final int GL_RGB8 = 32849; // 0x8051
    field public static final int GL_RGBA4 = 32854; // 0x8056
    field public static final int GL_RGBA8 = 32856; // 0x8058
    field public static final int GL_STENCIL_ATTACHMENT_OES = 36128; // 0x8d20
    field public static final int GL_STENCIL_INDEX = 6401; // 0x1901
    field public static final int GL_STENCIL_INDEX1_OES = 36166; // 0x8d46
    field public static final int GL_STENCIL_INDEX4_OES = 36167; // 0x8d47
    field public static final int GL_STENCIL_INDEX8_OES = 36168; // 0x8d48
    field public static final int GL_STR = -1; // 0xffffffff
    field public static final int GL_TEXTURE_BINDING_CUBE_MAP = 34068; // 0x8514
    field public static final int GL_TEXTURE_CUBE_MAP = 34067; // 0x8513
    field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 34070; // 0x8516
    field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072; // 0x8518
    field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074; // 0x851a
    field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X = 34069; // 0x8515
    field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 34071; // 0x8517
    field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 34073; // 0x8519
    field public static final int GL_TEXTURE_GEN_MODE = 9472; // 0x2500
    field public static final int GL_TEXTURE_GEN_STR = 36192; // 0x8d60
  }

}

package javax.net {

  public abstract class ServerSocketFactory {
    ctor protected ServerSocketFactory();
    method public java.net.ServerSocket createServerSocket() throws java.io.IOException;
    method public abstract java.net.ServerSocket createServerSocket(int) throws java.io.IOException;
    method public abstract java.net.ServerSocket createServerSocket(int, int) throws java.io.IOException;
    method public abstract java.net.ServerSocket createServerSocket(int, int, java.net.InetAddress) throws java.io.IOException;
    method public static javax.net.ServerSocketFactory getDefault();
  }

  public abstract class SocketFactory {
    ctor protected SocketFactory();
    method public java.net.Socket createSocket() throws java.io.IOException;
    method public abstract java.net.Socket createSocket(String, int) throws java.io.IOException, java.net.UnknownHostException;
    method public abstract java.net.Socket createSocket(String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
    method public abstract java.net.Socket createSocket(java.net.InetAddress, int) throws java.io.IOException;
    method public abstract java.net.Socket createSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
    method public static javax.net.SocketFactory getDefault();
  }

}

package javax.net.ssl {

  public class CertPathTrustManagerParameters implements javax.net.ssl.ManagerFactoryParameters {
    ctor public CertPathTrustManagerParameters(java.security.cert.CertPathParameters);
    method public java.security.cert.CertPathParameters getParameters();
  }

  public class HandshakeCompletedEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public HandshakeCompletedEvent(javax.net.ssl.SSLSocket, javax.net.ssl.SSLSession);
    method public String getCipherSuite();
    method public java.security.cert.Certificate[] getLocalCertificates();
    method public java.security.Principal getLocalPrincipal();
    method public javax.security.cert.X509Certificate[] getPeerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public java.security.cert.Certificate[] getPeerCertificates() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public javax.net.ssl.SSLSession getSession();
    method public javax.net.ssl.SSLSocket getSocket();
  }

  public interface HandshakeCompletedListener extends java.util.EventListener {
    method public void handshakeCompleted(javax.net.ssl.HandshakeCompletedEvent);
  }

  public interface HostnameVerifier {
    method public boolean verify(String, javax.net.ssl.SSLSession);
  }

  public abstract class HttpsURLConnection extends java.net.HttpURLConnection {
    ctor protected HttpsURLConnection(java.net.URL);
    method public abstract String getCipherSuite();
    method public static javax.net.ssl.HostnameVerifier getDefaultHostnameVerifier();
    method public static javax.net.ssl.SSLSocketFactory getDefaultSSLSocketFactory();
    method public javax.net.ssl.HostnameVerifier getHostnameVerifier();
    method public abstract java.security.cert.Certificate[] getLocalCertificates();
    method public java.security.Principal getLocalPrincipal();
    method public java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public javax.net.ssl.SSLSocketFactory getSSLSocketFactory();
    method public abstract java.security.cert.Certificate[] getServerCertificates() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public static void setDefaultHostnameVerifier(javax.net.ssl.HostnameVerifier);
    method public static void setDefaultSSLSocketFactory(javax.net.ssl.SSLSocketFactory);
    method public void setHostnameVerifier(javax.net.ssl.HostnameVerifier);
    method public void setSSLSocketFactory(javax.net.ssl.SSLSocketFactory);
    field protected javax.net.ssl.HostnameVerifier hostnameVerifier;
  }

  public interface KeyManager {
  }

  public class KeyManagerFactory {
    ctor protected KeyManagerFactory(javax.net.ssl.KeyManagerFactorySpi, java.security.Provider, String);
    method public final String getAlgorithm();
    method public static final String getDefaultAlgorithm();
    method public static final javax.net.ssl.KeyManagerFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.net.ssl.KeyManagerFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.net.ssl.KeyManagerFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final javax.net.ssl.KeyManager[] getKeyManagers();
    method public final java.security.Provider getProvider();
    method public final void init(java.security.KeyStore, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    method public final void init(javax.net.ssl.ManagerFactoryParameters) throws java.security.InvalidAlgorithmParameterException;
  }

  public abstract class KeyManagerFactorySpi {
    ctor public KeyManagerFactorySpi();
    method protected abstract javax.net.ssl.KeyManager[] engineGetKeyManagers();
    method protected abstract void engineInit(java.security.KeyStore, char[]) throws java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    method protected abstract void engineInit(javax.net.ssl.ManagerFactoryParameters) throws java.security.InvalidAlgorithmParameterException;
  }

  public class KeyStoreBuilderParameters implements javax.net.ssl.ManagerFactoryParameters {
    ctor public KeyStoreBuilderParameters(java.security.KeyStore.Builder);
    ctor public KeyStoreBuilderParameters(java.util.List);
    method public java.util.List getParameters();
  }

  public interface ManagerFactoryParameters {
  }

  public class SSLContext {
    ctor protected SSLContext(javax.net.ssl.SSLContextSpi, java.security.Provider, String);
    method public final javax.net.ssl.SSLEngine createSSLEngine();
    method public final javax.net.ssl.SSLEngine createSSLEngine(String, int);
    method public final javax.net.ssl.SSLSessionContext getClientSessionContext();
    method public static javax.net.ssl.SSLContext getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static javax.net.ssl.SSLContext getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static javax.net.ssl.SSLContext getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final String getProtocol();
    method public final java.security.Provider getProvider();
    method public final javax.net.ssl.SSLSessionContext getServerSessionContext();
    method public final javax.net.ssl.SSLServerSocketFactory getServerSocketFactory();
    method public final javax.net.ssl.SSLSocketFactory getSocketFactory();
    method public final void init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) throws java.security.KeyManagementException;
  }

  public abstract class SSLContextSpi {
    ctor public SSLContextSpi();
    method protected abstract javax.net.ssl.SSLEngine engineCreateSSLEngine(String, int);
    method protected abstract javax.net.ssl.SSLEngine engineCreateSSLEngine();
    method protected abstract javax.net.ssl.SSLSessionContext engineGetClientSessionContext();
    method protected abstract javax.net.ssl.SSLSessionContext engineGetServerSessionContext();
    method protected abstract javax.net.ssl.SSLServerSocketFactory engineGetServerSocketFactory();
    method protected abstract javax.net.ssl.SSLSocketFactory engineGetSocketFactory();
    method protected abstract void engineInit(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) throws java.security.KeyManagementException;
  }

  public abstract class SSLEngine {
    ctor protected SSLEngine();
    ctor protected SSLEngine(String, int);
    method public abstract void beginHandshake() throws javax.net.ssl.SSLException;
    method public abstract void closeInbound() throws javax.net.ssl.SSLException;
    method public abstract void closeOutbound();
    method public abstract Runnable getDelegatedTask();
    method public abstract boolean getEnableSessionCreation();
    method public abstract String[] getEnabledCipherSuites();
    method public abstract String[] getEnabledProtocols();
    method public abstract javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus();
    method public abstract boolean getNeedClientAuth();
    method public String getPeerHost();
    method public int getPeerPort();
    method public abstract javax.net.ssl.SSLSession getSession();
    method public abstract String[] getSupportedCipherSuites();
    method public abstract String[] getSupportedProtocols();
    method public abstract boolean getUseClientMode();
    method public abstract boolean getWantClientAuth();
    method public abstract boolean isInboundDone();
    method public abstract boolean isOutboundDone();
    method public abstract void setEnableSessionCreation(boolean);
    method public abstract void setEnabledCipherSuites(String[]);
    method public abstract void setEnabledProtocols(String[]);
    method public abstract void setNeedClientAuth(boolean);
    method public abstract void setUseClientMode(boolean);
    method public abstract void setWantClientAuth(boolean);
    method public abstract javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer, java.nio.ByteBuffer[], int, int) throws javax.net.ssl.SSLException;
    method public javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.net.ssl.SSLException;
    method public javax.net.ssl.SSLEngineResult unwrap(java.nio.ByteBuffer, java.nio.ByteBuffer[]) throws javax.net.ssl.SSLException;
    method public abstract javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[], int, int, java.nio.ByteBuffer) throws javax.net.ssl.SSLException;
    method public javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer[], java.nio.ByteBuffer) throws javax.net.ssl.SSLException;
    method public javax.net.ssl.SSLEngineResult wrap(java.nio.ByteBuffer, java.nio.ByteBuffer) throws javax.net.ssl.SSLException;
  }

  public class SSLEngineResult {
    ctor public SSLEngineResult(javax.net.ssl.SSLEngineResult.Status, javax.net.ssl.SSLEngineResult.HandshakeStatus, int, int);
    method public final int bytesConsumed();
    method public final int bytesProduced();
    method public final javax.net.ssl.SSLEngineResult.HandshakeStatus getHandshakeStatus();
    method public final javax.net.ssl.SSLEngineResult.Status getStatus();
  }

  public enum SSLEngineResult.HandshakeStatus {
    enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus FINISHED;
    enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NEED_TASK;
    enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NEED_UNWRAP;
    enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NEED_WRAP;
    enum_constant public static final javax.net.ssl.SSLEngineResult.HandshakeStatus NOT_HANDSHAKING;
  }

  public enum SSLEngineResult.Status {
    enum_constant public static final javax.net.ssl.SSLEngineResult.Status BUFFER_OVERFLOW;
    enum_constant public static final javax.net.ssl.SSLEngineResult.Status BUFFER_UNDERFLOW;
    enum_constant public static final javax.net.ssl.SSLEngineResult.Status CLOSED;
    enum_constant public static final javax.net.ssl.SSLEngineResult.Status OK;
  }

  public class SSLException extends java.io.IOException {
    ctor public SSLException(String);
    ctor public SSLException(String, Throwable);
    ctor public SSLException(Throwable);
  }

  public class SSLHandshakeException extends javax.net.ssl.SSLException {
    ctor public SSLHandshakeException(String);
  }

  public class SSLKeyException extends javax.net.ssl.SSLException {
    ctor public SSLKeyException(String);
  }

  public class SSLPeerUnverifiedException extends javax.net.ssl.SSLException {
    ctor public SSLPeerUnverifiedException(String);
  }

  public final class SSLPermission extends java.security.BasicPermission {
    ctor public SSLPermission(String);
    ctor public SSLPermission(String, String);
  }

  public class SSLProtocolException extends javax.net.ssl.SSLException {
    ctor public SSLProtocolException(String);
  }

  public abstract class SSLServerSocket extends java.net.ServerSocket {
    ctor protected SSLServerSocket() throws java.io.IOException;
    ctor protected SSLServerSocket(int) throws java.io.IOException;
    ctor protected SSLServerSocket(int, int) throws java.io.IOException;
    ctor protected SSLServerSocket(int, int, java.net.InetAddress) throws java.io.IOException;
    method public abstract boolean getEnableSessionCreation();
    method public abstract String[] getEnabledCipherSuites();
    method public abstract String[] getEnabledProtocols();
    method public abstract boolean getNeedClientAuth();
    method public abstract String[] getSupportedCipherSuites();
    method public abstract String[] getSupportedProtocols();
    method public abstract boolean getUseClientMode();
    method public abstract boolean getWantClientAuth();
    method public abstract void setEnableSessionCreation(boolean);
    method public abstract void setEnabledCipherSuites(String[]);
    method public abstract void setEnabledProtocols(String[]);
    method public abstract void setNeedClientAuth(boolean);
    method public abstract void setUseClientMode(boolean);
    method public abstract void setWantClientAuth(boolean);
  }

  public abstract class SSLServerSocketFactory extends javax.net.ServerSocketFactory {
    ctor protected SSLServerSocketFactory();
    method public static javax.net.ServerSocketFactory getDefault();
    method public abstract String[] getDefaultCipherSuites();
    method public abstract String[] getSupportedCipherSuites();
  }

  public interface SSLSession {
    method public int getApplicationBufferSize();
    method public String getCipherSuite();
    method public long getCreationTime();
    method public byte[] getId();
    method public long getLastAccessedTime();
    method public java.security.cert.Certificate[] getLocalCertificates();
    method public java.security.Principal getLocalPrincipal();
    method public int getPacketBufferSize();
    method public javax.security.cert.X509Certificate[] getPeerCertificateChain() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public java.security.cert.Certificate[] getPeerCertificates() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public String getPeerHost();
    method public int getPeerPort();
    method public java.security.Principal getPeerPrincipal() throws javax.net.ssl.SSLPeerUnverifiedException;
    method public String getProtocol();
    method public javax.net.ssl.SSLSessionContext getSessionContext();
    method public Object getValue(String);
    method public String[] getValueNames();
    method public void invalidate();
    method public boolean isValid();
    method public void putValue(String, Object);
    method public void removeValue(String);
  }

  public class SSLSessionBindingEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public SSLSessionBindingEvent(javax.net.ssl.SSLSession, String);
    method public String getName();
    method public javax.net.ssl.SSLSession getSession();
  }

  public interface SSLSessionBindingListener extends java.util.EventListener {
    method public void valueBound(javax.net.ssl.SSLSessionBindingEvent);
    method public void valueUnbound(javax.net.ssl.SSLSessionBindingEvent);
  }

  public interface SSLSessionContext {
    method public java.util.Enumeration getIds();
    method public javax.net.ssl.SSLSession getSession(byte[]);
    method public int getSessionCacheSize();
    method public int getSessionTimeout();
    method public void setSessionCacheSize(int) throws java.lang.IllegalArgumentException;
    method public void setSessionTimeout(int) throws java.lang.IllegalArgumentException;
  }

  public abstract class SSLSocket extends java.net.Socket {
    ctor protected SSLSocket();
    ctor protected SSLSocket(String, int) throws java.io.IOException, java.net.UnknownHostException;
    ctor protected SSLSocket(java.net.InetAddress, int) throws java.io.IOException;
    ctor protected SSLSocket(String, int, java.net.InetAddress, int) throws java.io.IOException, java.net.UnknownHostException;
    ctor protected SSLSocket(java.net.InetAddress, int, java.net.InetAddress, int) throws java.io.IOException;
    method public abstract void addHandshakeCompletedListener(javax.net.ssl.HandshakeCompletedListener);
    method public abstract boolean getEnableSessionCreation();
    method public abstract String[] getEnabledCipherSuites();
    method public abstract String[] getEnabledProtocols();
    method public abstract boolean getNeedClientAuth();
    method public abstract javax.net.ssl.SSLSession getSession();
    method public abstract String[] getSupportedCipherSuites();
    method public abstract String[] getSupportedProtocols();
    method public abstract boolean getUseClientMode();
    method public abstract boolean getWantClientAuth();
    method public abstract void removeHandshakeCompletedListener(javax.net.ssl.HandshakeCompletedListener);
    method public abstract void setEnableSessionCreation(boolean);
    method public abstract void setEnabledCipherSuites(String[]);
    method public abstract void setEnabledProtocols(String[]);
    method public abstract void setNeedClientAuth(boolean);
    method public abstract void setUseClientMode(boolean);
    method public abstract void setWantClientAuth(boolean);
    method public abstract void startHandshake() throws java.io.IOException;
  }

  public abstract class SSLSocketFactory extends javax.net.SocketFactory {
    ctor public SSLSocketFactory();
    method public abstract java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException;
    method public static javax.net.SocketFactory getDefault();
    method public abstract String[] getDefaultCipherSuites();
    method public abstract String[] getSupportedCipherSuites();
  }

  public interface TrustManager {
  }

  public class TrustManagerFactory {
    ctor protected TrustManagerFactory(javax.net.ssl.TrustManagerFactorySpi, java.security.Provider, String);
    method public final String getAlgorithm();
    method public static final String getDefaultAlgorithm();
    method public static final javax.net.ssl.TrustManagerFactory getInstance(String) throws java.security.NoSuchAlgorithmException;
    method public static final javax.net.ssl.TrustManagerFactory getInstance(String, String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException;
    method public static final javax.net.ssl.TrustManagerFactory getInstance(String, java.security.Provider) throws java.security.NoSuchAlgorithmException;
    method public final java.security.Provider getProvider();
    method public final javax.net.ssl.TrustManager[] getTrustManagers();
    method public final void init(java.security.KeyStore) throws java.security.KeyStoreException;
    method public final void init(javax.net.ssl.ManagerFactoryParameters) throws java.security.InvalidAlgorithmParameterException;
  }

  public abstract class TrustManagerFactorySpi {
    ctor public TrustManagerFactorySpi();
    method protected abstract javax.net.ssl.TrustManager[] engineGetTrustManagers();
    method protected abstract void engineInit(java.security.KeyStore) throws java.security.KeyStoreException;
    method protected abstract void engineInit(javax.net.ssl.ManagerFactoryParameters) throws java.security.InvalidAlgorithmParameterException;
  }

  public abstract class X509ExtendedKeyManager implements javax.net.ssl.X509KeyManager {
    ctor protected X509ExtendedKeyManager();
    method public String chooseEngineClientAlias(String[], java.security.Principal[], javax.net.ssl.SSLEngine);
    method public String chooseEngineServerAlias(String, java.security.Principal[], javax.net.ssl.SSLEngine);
  }

  public interface X509KeyManager extends javax.net.ssl.KeyManager {
    method public String chooseClientAlias(String[], java.security.Principal[], java.net.Socket);
    method public String chooseServerAlias(String, java.security.Principal[], java.net.Socket);
    method public java.security.cert.X509Certificate[] getCertificateChain(String);
    method public String[] getClientAliases(String, java.security.Principal[]);
    method public java.security.PrivateKey getPrivateKey(String);
    method public String[] getServerAliases(String, java.security.Principal[]);
  }

  public interface X509TrustManager extends javax.net.ssl.TrustManager {
    method public void checkClientTrusted(java.security.cert.X509Certificate[], String) throws java.security.cert.CertificateException;
    method public void checkServerTrusted(java.security.cert.X509Certificate[], String) throws java.security.cert.CertificateException;
    method public java.security.cert.X509Certificate[] getAcceptedIssuers();
  }

}

package javax.security.auth {

  public final class AuthPermission extends java.security.BasicPermission {
    ctor public AuthPermission(String);
    ctor public AuthPermission(String, String);
  }

  public class DestroyFailedException extends java.lang.Exception {
    ctor public DestroyFailedException();
    ctor public DestroyFailedException(String);
  }

  public interface Destroyable {
    method public void destroy() throws javax.security.auth.DestroyFailedException;
    method public boolean isDestroyed();
  }

  public final class PrivateCredentialPermission extends java.security.Permission {
    ctor public PrivateCredentialPermission(String, String);
    method public String getActions();
    method public String getCredentialClass();
    method public String[][] getPrincipals();
    method public boolean implies(java.security.Permission);
  }

  public final class Subject implements java.io.Serializable {
    ctor public Subject();
    ctor public Subject(boolean, java.util.Set<? extends java.security.Principal>, java.util.Set<?>, java.util.Set<?>);
    method public static Object doAs(javax.security.auth.Subject, java.security.PrivilegedAction);
    method public static Object doAs(javax.security.auth.Subject, java.security.PrivilegedExceptionAction) throws java.security.PrivilegedActionException;
    method public static Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedAction, java.security.AccessControlContext);
    method public static Object doAsPrivileged(javax.security.auth.Subject, java.security.PrivilegedExceptionAction, java.security.AccessControlContext) throws java.security.PrivilegedActionException;
    method public java.util.Set<java.security.Principal> getPrincipals();
    method public <T extends java.security.Principal> java.util.Set<T> getPrincipals(Class<T>);
    method public java.util.Set<java.lang.Object> getPrivateCredentials();
    method public <T> java.util.Set<T> getPrivateCredentials(Class<T>);
    method public java.util.Set<java.lang.Object> getPublicCredentials();
    method public <T> java.util.Set<T> getPublicCredentials(Class<T>);
    method public static javax.security.auth.Subject getSubject(java.security.AccessControlContext);
    method public boolean isReadOnly();
    method public void setReadOnly();
  }

  public class SubjectDomainCombiner implements java.security.DomainCombiner {
    ctor public SubjectDomainCombiner(javax.security.auth.Subject);
    method public java.security.ProtectionDomain[] combine(java.security.ProtectionDomain[], java.security.ProtectionDomain[]);
    method public javax.security.auth.Subject getSubject();
  }

}

package javax.security.auth.callback {

  public interface Callback {
  }

  public interface CallbackHandler {
    method public void handle(javax.security.auth.callback.Callback[]) throws java.io.IOException, javax.security.auth.callback.UnsupportedCallbackException;
  }

  public class PasswordCallback implements javax.security.auth.callback.Callback java.io.Serializable {
    ctor public PasswordCallback(String, boolean);
    method public void clearPassword();
    method public char[] getPassword();
    method public String getPrompt();
    method public boolean isEchoOn();
    method public void setPassword(char[]);
  }

  public class UnsupportedCallbackException extends java.lang.Exception {
    ctor public UnsupportedCallbackException(javax.security.auth.callback.Callback);
    ctor public UnsupportedCallbackException(javax.security.auth.callback.Callback, String);
    method public javax.security.auth.callback.Callback getCallback();
  }

}

package javax.security.auth.login {

  public class LoginException extends java.security.GeneralSecurityException {
    ctor public LoginException();
    ctor public LoginException(String);
  }

}

package javax.security.auth.x500 {

  public final class X500Principal implements java.security.Principal java.io.Serializable {
    ctor public X500Principal(byte[]);
    ctor public X500Principal(java.io.InputStream);
    ctor public X500Principal(String);
    method public byte[] getEncoded();
    method public String getName();
    method public String getName(String);
    field public static final String CANONICAL = "CANONICAL";
    field public static final String RFC1779 = "RFC1779";
    field public static final String RFC2253 = "RFC2253";
  }

}

package javax.security.cert {

  public abstract class Certificate {
    ctor public Certificate();
    method public abstract byte[] getEncoded() throws javax.security.cert.CertificateEncodingException;
    method public abstract java.security.PublicKey getPublicKey();
    method public abstract String toString();
    method public abstract void verify(java.security.PublicKey) throws javax.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
    method public abstract void verify(java.security.PublicKey, String) throws javax.security.cert.CertificateException, java.security.InvalidKeyException, java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException, java.security.SignatureException;
  }

  public class CertificateEncodingException extends javax.security.cert.CertificateException {
    ctor public CertificateEncodingException(String);
    ctor public CertificateEncodingException();
  }

  public class CertificateException extends java.lang.Exception {
    ctor public CertificateException(String);
    ctor public CertificateException();
  }

  public class CertificateExpiredException extends javax.security.cert.CertificateException {
    ctor public CertificateExpiredException(String);
    ctor public CertificateExpiredException();
  }

  public class CertificateNotYetValidException extends javax.security.cert.CertificateException {
    ctor public CertificateNotYetValidException(String);
    ctor public CertificateNotYetValidException();
  }

  public class CertificateParsingException extends javax.security.cert.CertificateException {
    ctor public CertificateParsingException(String);
    ctor public CertificateParsingException();
  }

  public abstract class X509Certificate extends javax.security.cert.Certificate {
    ctor public X509Certificate();
    method public abstract void checkValidity() throws javax.security.cert.CertificateExpiredException, javax.security.cert.CertificateNotYetValidException;
    method public abstract void checkValidity(java.util.Date) throws javax.security.cert.CertificateExpiredException, javax.security.cert.CertificateNotYetValidException;
    method public static final javax.security.cert.X509Certificate getInstance(java.io.InputStream) throws javax.security.cert.CertificateException;
    method public static final javax.security.cert.X509Certificate getInstance(byte[]) throws javax.security.cert.CertificateException;
    method public abstract java.security.Principal getIssuerDN();
    method public abstract java.util.Date getNotAfter();
    method public abstract java.util.Date getNotBefore();
    method public abstract java.math.BigInteger getSerialNumber();
    method public abstract String getSigAlgName();
    method public abstract String getSigAlgOID();
    method public abstract byte[] getSigAlgParams();
    method public abstract java.security.Principal getSubjectDN();
    method public abstract int getVersion();
  }

}

package javax.sql {

  public class ConnectionEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public ConnectionEvent(javax.sql.PooledConnection);
    ctor public ConnectionEvent(javax.sql.PooledConnection, java.sql.SQLException);
    method public java.sql.SQLException getSQLException();
  }

  public interface ConnectionEventListener extends java.util.EventListener {
    method public void connectionClosed(javax.sql.ConnectionEvent);
    method public void connectionErrorOccurred(javax.sql.ConnectionEvent);
  }

  public interface ConnectionPoolDataSource {
    method public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
    method public int getLoginTimeout() throws java.sql.SQLException;
    method public javax.sql.PooledConnection getPooledConnection() throws java.sql.SQLException;
    method public javax.sql.PooledConnection getPooledConnection(String, String) throws java.sql.SQLException;
    method public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
    method public void setLoginTimeout(int) throws java.sql.SQLException;
  }

  public interface DataSource {
    method public java.sql.Connection getConnection() throws java.sql.SQLException;
    method public java.sql.Connection getConnection(String, String) throws java.sql.SQLException;
    method public java.io.PrintWriter getLogWriter() throws java.sql.SQLException;
    method public int getLoginTimeout() throws java.sql.SQLException;
    method public void setLogWriter(java.io.PrintWriter) throws java.sql.SQLException;
    method public void setLoginTimeout(int) throws java.sql.SQLException;
  }

  public interface PooledConnection {
    method public void addConnectionEventListener(javax.sql.ConnectionEventListener);
    method public void close() throws java.sql.SQLException;
    method public java.sql.Connection getConnection() throws java.sql.SQLException;
    method public void removeConnectionEventListener(javax.sql.ConnectionEventListener);
  }

  public interface RowSet extends java.sql.ResultSet {
    method public void addRowSetListener(javax.sql.RowSetListener);
    method public void clearParameters() throws java.sql.SQLException;
    method public void execute() throws java.sql.SQLException;
    method public String getCommand();
    method public String getDataSourceName();
    method public boolean getEscapeProcessing() throws java.sql.SQLException;
    method public int getMaxFieldSize() throws java.sql.SQLException;
    method public int getMaxRows() throws java.sql.SQLException;
    method public String getPassword();
    method public int getQueryTimeout() throws java.sql.SQLException;
    method public int getTransactionIsolation();
    method public java.util.Map<java.lang.String,java.lang.Class<?>> getTypeMap() throws java.sql.SQLException;
    method public String getUrl() throws java.sql.SQLException;
    method public String getUsername();
    method public boolean isReadOnly();
    method public void removeRowSetListener(javax.sql.RowSetListener);
    method public void setArray(int, java.sql.Array) throws java.sql.SQLException;
    method public void setAsciiStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBigDecimal(int, java.math.BigDecimal) throws java.sql.SQLException;
    method public void setBinaryStream(int, java.io.InputStream, int) throws java.sql.SQLException;
    method public void setBlob(int, java.sql.Blob) throws java.sql.SQLException;
    method public void setBoolean(int, boolean) throws java.sql.SQLException;
    method public void setByte(int, byte) throws java.sql.SQLException;
    method public void setBytes(int, byte[]) throws java.sql.SQLException;
    method public void setCharacterStream(int, java.io.Reader, int) throws java.sql.SQLException;
    method public void setClob(int, java.sql.Clob) throws java.sql.SQLException;
    method public void setCommand(String) throws java.sql.SQLException;
    method public void setConcurrency(int) throws java.sql.SQLException;
    method public void setDataSourceName(String) throws java.sql.SQLException;
    method public void setDate(int, java.sql.Date) throws java.sql.SQLException;
    method public void setDate(int, java.sql.Date, java.util.Calendar) throws java.sql.SQLException;
    method public void setDouble(int, double) throws java.sql.SQLException;
    method public void setEscapeProcessing(boolean) throws java.sql.SQLException;
    method public void setFloat(int, float) throws java.sql.SQLException;
    method public void setInt(int, int) throws java.sql.SQLException;
    method public void setLong(int, long) throws java.sql.SQLException;
    method public void setMaxFieldSize(int) throws java.sql.SQLException;
    method public void setMaxRows(int) throws java.sql.SQLException;
    method public void setNull(int, int) throws java.sql.SQLException;
    method public void setNull(int, int, String) throws java.sql.SQLException;
    method public void setObject(int, Object) throws java.sql.SQLException;
    method public void setObject(int, Object, int) throws java.sql.SQLException;
    method public void setObject(int, Object, int, int) throws java.sql.SQLException;
    method public void setPassword(String) throws java.sql.SQLException;
    method public void setQueryTimeout(int) throws java.sql.SQLException;
    method public void setReadOnly(boolean) throws java.sql.SQLException;
    method public void setRef(int, java.sql.Ref) throws java.sql.SQLException;
    method public void setShort(int, short) throws java.sql.SQLException;
    method public void setString(int, String) throws java.sql.SQLException;
    method public void setTime(int, java.sql.Time) throws java.sql.SQLException;
    method public void setTime(int, java.sql.Time, java.util.Calendar) throws java.sql.SQLException;
    method public void setTimestamp(int, java.sql.Timestamp) throws java.sql.SQLException;
    method public void setTimestamp(int, java.sql.Timestamp, java.util.Calendar) throws java.sql.SQLException;
    method public void setTransactionIsolation(int) throws java.sql.SQLException;
    method public void setType(int) throws java.sql.SQLException;
    method public void setTypeMap(java.util.Map<java.lang.String,java.lang.Class<?>>) throws java.sql.SQLException;
    method public void setUrl(String) throws java.sql.SQLException;
    method public void setUsername(String) throws java.sql.SQLException;
  }

  public class RowSetEvent extends java.util.EventObject implements java.io.Serializable {
    ctor public RowSetEvent(javax.sql.RowSet);
  }

  public interface RowSetInternal {
    method public java.sql.Connection getConnection() throws java.sql.SQLException;
    method public java.sql.ResultSet getOriginal() throws java.sql.SQLException;
    method public java.sql.ResultSet getOriginalRow() throws java.sql.SQLException;
    method public Object[] getParams() throws java.sql.SQLException;
    method public void setMetaData(javax.sql.RowSetMetaData) throws java.sql.SQLException;
  }

  public interface RowSetListener extends java.util.EventListener {
    method public void cursorMoved(javax.sql.RowSetEvent);
    method public void rowChanged(javax.sql.RowSetEvent);
    method public void rowSetChanged(javax.sql.RowSetEvent);
  }

  public interface RowSetMetaData extends java.sql.ResultSetMetaData {
    method public void setAutoIncrement(int, boolean) throws java.sql.SQLException;
    method public void setCaseSensitive(int, boolean) throws java.sql.SQLException;
    method public void setCatalogName(int, String) throws java.sql.SQLException;
    method public void setColumnCount(int) throws java.sql.SQLException;
    method public void setColumnDisplaySize(int, int) throws java.sql.SQLException;
    method public void setColumnLabel(int, String) throws java.sql.SQLException;
    method public void setColumnName(int, String) throws java.sql.SQLException;
    method public void setColumnType(int, int) throws java.sql.SQLException;
    method public void setColumnTypeName(int, String) throws java.sql.SQLException;
    method public void setCurrency(int, boolean) throws java.sql.SQLException;
    method public void setNullable(int, int) throws java.sql.SQLException;
    method public void setPrecision(int, int) throws java.sql.SQLException;
    method public void setScale(int, int) throws java.sql.SQLException;
    method public void setSchemaName(int, String) throws java.sql.SQLException;
    method public void setSearchable(int, boolean) throws java.sql.SQLException;
    method public void setSigned(int, boolean) throws java.sql.SQLException;
    method public void setTableName(int, String) throws java.sql.SQLException;
  }

  public interface RowSetReader {
    method public void readData(javax.sql.RowSetInternal) throws java.sql.SQLException;
  }

  public interface RowSetWriter {
    method public boolean writeData(javax.sql.RowSetInternal) throws java.sql.SQLException;
  }

}

package javax.xml {

  public class XMLConstants {
    ctor public XMLConstants();
    field public static final String DEFAULT_NS_PREFIX = "";
    field public static final String FEATURE_SECURE_PROCESSING = "http://javax.xml.XMLConstants/feature/secure-processing";
    field public static final String NULL_NS_URI = "";
    field public static final String RELAXNG_NS_URI = "http://relaxng.org/ns/structure/1.0";
    field public static final String W3C_XML_SCHEMA_INSTANCE_NS_URI = "http://www.w3.org/2001/XMLSchema-instance";
    field public static final String W3C_XML_SCHEMA_NS_URI = "http://www.w3.org/2001/XMLSchema";
    field public static final String W3C_XPATH_DATATYPE_NS_URI = "http://www.w3.org/2003/11/xpath-datatypes";
    field public static final String XMLNS_ATTRIBUTE = "xmlns";
    field public static final String XMLNS_ATTRIBUTE_NS_URI = "http://www.w3.org/2000/xmlns/";
    field public static final String XML_DTD_NS_URI = "http://www.w3.org/TR/REC-xml";
    field public static final String XML_NS_PREFIX = "xml";
    field public static final String XML_NS_URI = "http://www.w3.org/XML/1998/namespace";
  }

}

package javax.xml.parsers {

  public abstract class DocumentBuilder {
    ctor protected DocumentBuilder();
    method public abstract org.w3c.dom.DOMImplementation getDOMImplementation();
    method public abstract boolean isNamespaceAware();
    method public abstract boolean isValidating();
    method public boolean isXIncludeAware() throws java.lang.UnsupportedOperationException;
    method public abstract org.w3c.dom.Document newDocument();
    method public org.w3c.dom.Document parse(java.io.File) throws java.io.IOException, org.xml.sax.SAXException;
    method public org.w3c.dom.Document parse(java.io.InputStream) throws java.io.IOException, org.xml.sax.SAXException;
    method public org.w3c.dom.Document parse(java.io.InputStream, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public org.w3c.dom.Document parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public abstract org.w3c.dom.Document parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void reset();
    method public abstract void setEntityResolver(org.xml.sax.EntityResolver);
    method public abstract void setErrorHandler(org.xml.sax.ErrorHandler);
  }

  public abstract class DocumentBuilderFactory {
    ctor protected DocumentBuilderFactory();
    method public abstract Object getAttribute(String) throws java.lang.IllegalArgumentException;
    method public abstract boolean getFeature(String) throws javax.xml.parsers.ParserConfigurationException;
    method public boolean isCoalescing();
    method public boolean isExpandEntityReferences();
    method public boolean isIgnoringComments();
    method public boolean isIgnoringElementContentWhitespace();
    method public boolean isNamespaceAware();
    method public boolean isValidating();
    method public boolean isXIncludeAware();
    method public abstract javax.xml.parsers.DocumentBuilder newDocumentBuilder() throws javax.xml.parsers.ParserConfigurationException;
    method public static javax.xml.parsers.DocumentBuilderFactory newInstance() throws javax.xml.parsers.FactoryConfigurationError;
    method public abstract void setAttribute(String, Object) throws java.lang.IllegalArgumentException;
    method public void setCoalescing(boolean);
    method public void setExpandEntityReferences(boolean);
    method public abstract void setFeature(String, boolean) throws javax.xml.parsers.ParserConfigurationException;
    method public void setIgnoringComments(boolean);
    method public void setIgnoringElementContentWhitespace(boolean);
    method public void setNamespaceAware(boolean);
    method public void setValidating(boolean);
    method public void setXIncludeAware(boolean);
  }

  public class FactoryConfigurationError extends java.lang.Error {
    ctor public FactoryConfigurationError();
    ctor public FactoryConfigurationError(Exception);
    ctor public FactoryConfigurationError(Exception, String);
    ctor public FactoryConfigurationError(String);
    method public Exception getException();
  }

  public class ParserConfigurationException extends java.lang.Exception {
    ctor public ParserConfigurationException();
    ctor public ParserConfigurationException(String);
  }

  public abstract class SAXParser {
    ctor protected SAXParser();
    method public abstract org.xml.sax.Parser getParser() throws org.xml.sax.SAXException;
    method public abstract Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public abstract org.xml.sax.XMLReader getXMLReader() throws org.xml.sax.SAXException;
    method public abstract boolean isNamespaceAware();
    method public abstract boolean isValidating();
    method public boolean isXIncludeAware() throws java.lang.UnsupportedOperationException;
    method public void parse(java.io.File, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(java.io.File, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(java.io.InputStream, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(java.io.InputStream, org.xml.sax.HandlerBase, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(java.io.InputStream, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(java.io.InputStream, org.xml.sax.helpers.DefaultHandler, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(org.xml.sax.InputSource, org.xml.sax.HandlerBase) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(org.xml.sax.InputSource, org.xml.sax.helpers.DefaultHandler) throws java.io.IOException, org.xml.sax.SAXException;
    method public void reset();
    method public abstract void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
  }

  public abstract class SAXParserFactory {
    ctor protected SAXParserFactory();
    method public abstract boolean getFeature(String) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public boolean isNamespaceAware();
    method public boolean isValidating();
    method public boolean isXIncludeAware();
    method public static javax.xml.parsers.SAXParserFactory newInstance() throws javax.xml.parsers.FactoryConfigurationError;
    method public abstract javax.xml.parsers.SAXParser newSAXParser() throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXException;
    method public abstract void setFeature(String, boolean) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void setNamespaceAware(boolean);
    method public void setValidating(boolean);
    method public void setXIncludeAware(boolean);
  }

}

package junit.framework {

  public class Assert {
    ctor protected Assert();
    method public static void assertEquals(String, Object, Object);
    method public static void assertEquals(Object, Object);
    method public static void assertEquals(String, String, String);
    method public static void assertEquals(String, String);
    method public static void assertEquals(String, double, double, double);
    method public static void assertEquals(double, double, double);
    method public static void assertEquals(String, float, float, float);
    method public static void assertEquals(float, float, float);
    method public static void assertEquals(String, long, long);
    method public static void assertEquals(long, long);
    method public static void assertEquals(String, boolean, boolean);
    method public static void assertEquals(boolean, boolean);
    method public static void assertEquals(String, byte, byte);
    method public static void assertEquals(byte, byte);
    method public static void assertEquals(String, char, char);
    method public static void assertEquals(char, char);
    method public static void assertEquals(String, short, short);
    method public static void assertEquals(short, short);
    method public static void assertEquals(String, int, int);
    method public static void assertEquals(int, int);
    method public static void assertFalse(String, boolean);
    method public static void assertFalse(boolean);
    method public static void assertNotNull(Object);
    method public static void assertNotNull(String, Object);
    method public static void assertNotSame(String, Object, Object);
    method public static void assertNotSame(Object, Object);
    method public static void assertNull(Object);
    method public static void assertNull(String, Object);
    method public static void assertSame(String, Object, Object);
    method public static void assertSame(Object, Object);
    method public static void assertTrue(String, boolean);
    method public static void assertTrue(boolean);
    method public static void fail(String);
    method public static void fail();
  }

  public class AssertionFailedError extends java.lang.Error {
    ctor public AssertionFailedError();
    ctor public AssertionFailedError(String);
  }

  public class ComparisonFailure extends junit.framework.AssertionFailedError {
    ctor public ComparisonFailure(String, String, String);
  }

  public interface Protectable {
    method public void protect() throws java.lang.Throwable;
  }

  public interface Test {
    method public int countTestCases();
    method public void run(junit.framework.TestResult);
  }

  public abstract class TestCase extends junit.framework.Assert implements junit.framework.Test {
    ctor public TestCase();
    ctor public TestCase(String);
    method public int countTestCases();
    method protected junit.framework.TestResult createResult();
    method public String getName();
    method public junit.framework.TestResult run();
    method public void run(junit.framework.TestResult);
    method public void runBare() throws java.lang.Throwable;
    method protected void runTest() throws java.lang.Throwable;
    method public void setName(String);
    method protected void setUp() throws java.lang.Exception;
    method protected void tearDown() throws java.lang.Exception;
  }

  public class TestFailure {
    ctor public TestFailure(junit.framework.Test, Throwable);
    method public String exceptionMessage();
    method public junit.framework.Test failedTest();
    method public boolean isFailure();
    method public Throwable thrownException();
    method public String trace();
    field protected junit.framework.Test fFailedTest;
    field protected Throwable fThrownException;
  }

  public interface TestListener {
    method public void addError(junit.framework.Test, Throwable);
    method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
    method public void endTest(junit.framework.Test);
    method public void startTest(junit.framework.Test);
  }

  public class TestResult {
    ctor public TestResult();
    method public void addError(junit.framework.Test, Throwable);
    method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
    method public void addListener(junit.framework.TestListener);
    method public void endTest(junit.framework.Test);
    method public int errorCount();
    method public java.util.Enumeration errors();
    method public int failureCount();
    method public java.util.Enumeration failures();
    method public void removeListener(junit.framework.TestListener);
    method protected void run(junit.framework.TestCase);
    method public int runCount();
    method public void runProtected(junit.framework.Test, junit.framework.Protectable);
    method public boolean shouldStop();
    method public void startTest(junit.framework.Test);
    method public void stop();
    method public boolean wasSuccessful();
    field protected java.util.Vector fErrors;
    field protected java.util.Vector fFailures;
    field protected java.util.Vector fListeners;
    field protected int fRunTests;
  }

  public class TestSuite implements junit.framework.Test {
    ctor public TestSuite();
    ctor public TestSuite(Class, String);
    ctor public TestSuite(Class);
    ctor public TestSuite(String);
    method public void addTest(junit.framework.Test);
    method public void addTestSuite(Class);
    method public int countTestCases();
    method public static junit.framework.Test createTest(Class, String);
    method public String getName();
    method public static java.lang.reflect.Constructor getTestConstructor(Class) throws java.lang.NoSuchMethodException;
    method public void run(junit.framework.TestResult);
    method public void runTest(junit.framework.Test, junit.framework.TestResult);
    method public void setName(String);
    method public junit.framework.Test testAt(int);
    method public int testCount();
    method public java.util.Enumeration tests();
  }

}

package junit.runner {

  public abstract class BaseTestRunner implements junit.framework.TestListener {
    ctor public BaseTestRunner();
    method public void addError(junit.framework.Test, Throwable);
    method public void addFailure(junit.framework.Test, junit.framework.AssertionFailedError);
    method protected void clearStatus();
    method public String elapsedTimeAsString(long);
    method public void endTest(junit.framework.Test);
    method public String extractClassName(String);
    method public static String getFilteredTrace(Throwable);
    method public static String getFilteredTrace(String);
    method public junit.runner.TestSuiteLoader getLoader();
    method public static String getPreference(String);
    method public static int getPreference(String, int);
    method protected static java.util.Properties getPreferences();
    method public junit.framework.Test getTest(String);
    method public static boolean inVAJava();
    method protected Class loadSuiteClass(String) throws java.lang.ClassNotFoundException;
    method protected String processArguments(String[]);
    method protected abstract void runFailed(String);
    method public static void savePreferences() throws java.io.IOException;
    method public void setLoading(boolean);
    method public void setPreference(String, String);
    method protected static void setPreferences(java.util.Properties);
    method protected static boolean showStackRaw();
    method public void startTest(junit.framework.Test);
    method public abstract void testEnded(String);
    method public abstract void testFailed(int, junit.framework.Test, Throwable);
    method public abstract void testStarted(String);
    method public static String truncate(String);
    method protected boolean useReloadingTestSuiteLoader();
    field public static final String SUITE_METHODNAME = "suite";
  }

  public interface TestSuiteLoader {
    method public Class load(String) throws java.lang.ClassNotFoundException;
    method public Class reload(Class) throws java.lang.ClassNotFoundException;
  }

  public class Version {
    method public static String id();
  }

}

package org.apache.commons.logging {

  public interface Log {
    method public void debug(Object);
    method public void debug(Object, Throwable);
    method public void error(Object);
    method public void error(Object, Throwable);
    method public void fatal(Object);
    method public void fatal(Object, Throwable);
    method public void info(Object);
    method public void info(Object, Throwable);
    method public boolean isDebugEnabled();
    method public boolean isErrorEnabled();
    method public boolean isFatalEnabled();
    method public boolean isInfoEnabled();
    method public boolean isTraceEnabled();
    method public boolean isWarnEnabled();
    method public void trace(Object);
    method public void trace(Object, Throwable);
    method public void warn(Object);
    method public void warn(Object, Throwable);
  }

}

package org.apache.http {

  public class ConnectionClosedException extends java.io.IOException {
    ctor public ConnectionClosedException(String);
  }

  public interface ConnectionReuseStrategy {
    method public boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public interface FormattedHeader extends org.apache.http.Header {
    method public org.apache.http.util.CharArrayBuffer getBuffer();
    method public int getValuePos();
  }

  public interface Header {
    method public org.apache.http.HeaderElement[] getElements() throws org.apache.http.ParseException;
    method public String getName();
    method public String getValue();
  }

  public interface HeaderElement {
    method public String getName();
    method public org.apache.http.NameValuePair getParameter(int);
    method public org.apache.http.NameValuePair getParameterByName(String);
    method public int getParameterCount();
    method public org.apache.http.NameValuePair[] getParameters();
    method public String getValue();
  }

  public interface HeaderElementIterator extends java.util.Iterator {
    method public org.apache.http.HeaderElement nextElement();
  }

  public interface HeaderIterator extends java.util.Iterator {
    method public org.apache.http.Header nextHeader();
  }

  public interface HttpClientConnection extends org.apache.http.HttpConnection {
    method public void flush() throws java.io.IOException;
    method public boolean isResponseAvailable(int) throws java.io.IOException;
    method public void receiveResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpResponse receiveResponseHeader() throws org.apache.http.HttpException, java.io.IOException;
    method public void sendRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public void sendRequestHeader(org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpConnection {
    method public void close() throws java.io.IOException;
    method public org.apache.http.HttpConnectionMetrics getMetrics();
    method public int getSocketTimeout();
    method public boolean isOpen();
    method public boolean isStale();
    method public void setSocketTimeout(int);
    method public void shutdown() throws java.io.IOException;
  }

  public interface HttpConnectionMetrics {
    method public Object getMetric(String);
    method public long getReceivedBytesCount();
    method public long getRequestCount();
    method public long getResponseCount();
    method public long getSentBytesCount();
    method public void reset();
  }

  public interface HttpEntity {
    method public void consumeContent() throws java.io.IOException;
    method public java.io.InputStream getContent() throws java.io.IOException, java.lang.IllegalStateException;
    method public org.apache.http.Header getContentEncoding();
    method public long getContentLength();
    method public org.apache.http.Header getContentType();
    method public boolean isChunked();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public interface HttpEntityEnclosingRequest extends org.apache.http.HttpRequest {
    method public boolean expectContinue();
    method public org.apache.http.HttpEntity getEntity();
    method public void setEntity(org.apache.http.HttpEntity);
  }

  public class HttpException extends java.lang.Exception {
    ctor public HttpException();
    ctor public HttpException(String);
    ctor public HttpException(String, Throwable);
  }

  public final class HttpHost implements java.lang.Cloneable {
    ctor public HttpHost(String, int, String);
    ctor public HttpHost(String, int);
    ctor public HttpHost(String);
    ctor public HttpHost(org.apache.http.HttpHost);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public String getHostName();
    method public int getPort();
    method public String getSchemeName();
    method public String toHostString();
    method public String toURI();
    field public static final String DEFAULT_SCHEME_NAME = "http";
    field protected final String hostname;
    field protected final String lcHostname;
    field protected final int port;
    field protected final String schemeName;
  }

  public interface HttpInetConnection extends org.apache.http.HttpConnection {
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method public java.net.InetAddress getRemoteAddress();
    method public int getRemotePort();
  }

  public interface HttpMessage {
    method public void addHeader(org.apache.http.Header);
    method public void addHeader(String, String);
    method public boolean containsHeader(String);
    method public org.apache.http.Header[] getAllHeaders();
    method public org.apache.http.Header getFirstHeader(String);
    method public org.apache.http.Header[] getHeaders(String);
    method public org.apache.http.Header getLastHeader(String);
    method public org.apache.http.params.HttpParams getParams();
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public org.apache.http.HeaderIterator headerIterator();
    method public org.apache.http.HeaderIterator headerIterator(String);
    method public void removeHeader(org.apache.http.Header);
    method public void removeHeaders(String);
    method public void setHeader(org.apache.http.Header);
    method public void setHeader(String, String);
    method public void setHeaders(org.apache.http.Header[]);
    method public void setParams(org.apache.http.params.HttpParams);
  }

  public interface HttpRequest extends org.apache.http.HttpMessage {
    method public org.apache.http.RequestLine getRequestLine();
  }

  public interface HttpRequestFactory {
    method public org.apache.http.HttpRequest newHttpRequest(org.apache.http.RequestLine) throws org.apache.http.MethodNotSupportedException;
    method public org.apache.http.HttpRequest newHttpRequest(String, String) throws org.apache.http.MethodNotSupportedException;
  }

  public interface HttpRequestInterceptor {
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpResponse extends org.apache.http.HttpMessage {
    method public org.apache.http.HttpEntity getEntity();
    method public java.util.Locale getLocale();
    method public org.apache.http.StatusLine getStatusLine();
    method public void setEntity(org.apache.http.HttpEntity);
    method public void setLocale(java.util.Locale);
    method public void setReasonPhrase(String) throws java.lang.IllegalStateException;
    method public void setStatusCode(int) throws java.lang.IllegalStateException;
    method public void setStatusLine(org.apache.http.StatusLine);
    method public void setStatusLine(org.apache.http.ProtocolVersion, int);
    method public void setStatusLine(org.apache.http.ProtocolVersion, int, String);
  }

  public interface HttpResponseFactory {
    method public org.apache.http.HttpResponse newHttpResponse(org.apache.http.ProtocolVersion, int, org.apache.http.protocol.HttpContext);
    method public org.apache.http.HttpResponse newHttpResponse(org.apache.http.StatusLine, org.apache.http.protocol.HttpContext);
  }

  public interface HttpResponseInterceptor {
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpServerConnection extends org.apache.http.HttpConnection {
    method public void flush() throws java.io.IOException;
    method public void receiveRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpRequest receiveRequestHeader() throws org.apache.http.HttpException, java.io.IOException;
    method public void sendResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
    method public void sendResponseHeader(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpStatus {
    field public static final int SC_ACCEPTED = 202; // 0xca
    field public static final int SC_BAD_GATEWAY = 502; // 0x1f6
    field public static final int SC_BAD_REQUEST = 400; // 0x190
    field public static final int SC_CONFLICT = 409; // 0x199
    field public static final int SC_CONTINUE = 100; // 0x64
    field public static final int SC_CREATED = 201; // 0xc9
    field public static final int SC_EXPECTATION_FAILED = 417; // 0x1a1
    field public static final int SC_FAILED_DEPENDENCY = 424; // 0x1a8
    field public static final int SC_FORBIDDEN = 403; // 0x193
    field public static final int SC_GATEWAY_TIMEOUT = 504; // 0x1f8
    field public static final int SC_GONE = 410; // 0x19a
    field public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; // 0x1f9
    field public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419; // 0x1a3
    field public static final int SC_INSUFFICIENT_STORAGE = 507; // 0x1fb
    field public static final int SC_INTERNAL_SERVER_ERROR = 500; // 0x1f4
    field public static final int SC_LENGTH_REQUIRED = 411; // 0x19b
    field public static final int SC_LOCKED = 423; // 0x1a7
    field public static final int SC_METHOD_FAILURE = 420; // 0x1a4
    field public static final int SC_METHOD_NOT_ALLOWED = 405; // 0x195
    field public static final int SC_MOVED_PERMANENTLY = 301; // 0x12d
    field public static final int SC_MOVED_TEMPORARILY = 302; // 0x12e
    field public static final int SC_MULTIPLE_CHOICES = 300; // 0x12c
    field public static final int SC_MULTI_STATUS = 207; // 0xcf
    field public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; // 0xcb
    field public static final int SC_NOT_ACCEPTABLE = 406; // 0x196
    field public static final int SC_NOT_FOUND = 404; // 0x194
    field public static final int SC_NOT_IMPLEMENTED = 501; // 0x1f5
    field public static final int SC_NOT_MODIFIED = 304; // 0x130
    field public static final int SC_NO_CONTENT = 204; // 0xcc
    field public static final int SC_OK = 200; // 0xc8
    field public static final int SC_PARTIAL_CONTENT = 206; // 0xce
    field public static final int SC_PAYMENT_REQUIRED = 402; // 0x192
    field public static final int SC_PRECONDITION_FAILED = 412; // 0x19c
    field public static final int SC_PROCESSING = 102; // 0x66
    field public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; // 0x197
    field public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; // 0x1a0
    field public static final int SC_REQUEST_TIMEOUT = 408; // 0x198
    field public static final int SC_REQUEST_TOO_LONG = 413; // 0x19d
    field public static final int SC_REQUEST_URI_TOO_LONG = 414; // 0x19e
    field public static final int SC_RESET_CONTENT = 205; // 0xcd
    field public static final int SC_SEE_OTHER = 303; // 0x12f
    field public static final int SC_SERVICE_UNAVAILABLE = 503; // 0x1f7
    field public static final int SC_SWITCHING_PROTOCOLS = 101; // 0x65
    field public static final int SC_TEMPORARY_REDIRECT = 307; // 0x133
    field public static final int SC_UNAUTHORIZED = 401; // 0x191
    field public static final int SC_UNPROCESSABLE_ENTITY = 422; // 0x1a6
    field public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; // 0x19f
    field public static final int SC_USE_PROXY = 305; // 0x131
  }

  public final class HttpVersion extends org.apache.http.ProtocolVersion implements java.io.Serializable {
    ctor public HttpVersion(int, int);
    field public static final String HTTP = "HTTP";
    field public static final org.apache.http.HttpVersion HTTP_0_9;
    field public static final org.apache.http.HttpVersion HTTP_1_0;
    field public static final org.apache.http.HttpVersion HTTP_1_1;
  }

  public class MalformedChunkCodingException extends java.io.IOException {
    ctor public MalformedChunkCodingException();
    ctor public MalformedChunkCodingException(String);
  }

  public class MethodNotSupportedException extends org.apache.http.HttpException {
    ctor public MethodNotSupportedException(String);
    ctor public MethodNotSupportedException(String, Throwable);
  }

  public interface NameValuePair {
    method public String getName();
    method public String getValue();
  }

  public class NoHttpResponseException extends java.io.IOException {
    ctor public NoHttpResponseException(String);
  }

  public class ParseException extends java.lang.RuntimeException {
    ctor public ParseException();
    ctor public ParseException(String);
  }

  public class ProtocolException extends org.apache.http.HttpException {
    ctor public ProtocolException();
    ctor public ProtocolException(String);
    ctor public ProtocolException(String, Throwable);
  }

  public class ProtocolVersion implements java.lang.Cloneable java.io.Serializable {
    ctor public ProtocolVersion(String, int, int);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public int compareToVersion(org.apache.http.ProtocolVersion);
    method public final boolean equals(Object);
    method public org.apache.http.ProtocolVersion forVersion(int, int);
    method public final int getMajor();
    method public final int getMinor();
    method public final String getProtocol();
    method public final boolean greaterEquals(org.apache.http.ProtocolVersion);
    method public final int hashCode();
    method public boolean isComparable(org.apache.http.ProtocolVersion);
    method public final boolean lessEquals(org.apache.http.ProtocolVersion);
    field protected final int major;
    field protected final int minor;
    field protected final String protocol;
  }

  public interface ReasonPhraseCatalog {
    method public String getReason(int, java.util.Locale);
  }

  public interface RequestLine {
    method public String getMethod();
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public String getUri();
  }

  public interface StatusLine {
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public String getReasonPhrase();
    method public int getStatusCode();
  }

  public interface TokenIterator extends java.util.Iterator {
    method public String nextToken();
  }

  public class UnsupportedHttpVersionException extends org.apache.http.ProtocolException {
    ctor public UnsupportedHttpVersionException();
    ctor public UnsupportedHttpVersionException(String);
  }

}

package org.apache.http.auth {

  public final class AUTH {
    field public static final String PROXY_AUTH = "Proxy-Authenticate";
    field public static final String PROXY_AUTH_RESP = "Proxy-Authorization";
    field public static final String WWW_AUTH = "WWW-Authenticate";
    field public static final String WWW_AUTH_RESP = "Authorization";
  }

  public interface AuthScheme {
    method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
    method public String getParameter(String);
    method public String getRealm();
    method public String getSchemeName();
    method public boolean isComplete();
    method public boolean isConnectionBased();
    method public void processChallenge(org.apache.http.Header) throws org.apache.http.auth.MalformedChallengeException;
  }

  public interface AuthSchemeFactory {
    method public org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
  }

  public final class AuthSchemeRegistry {
    ctor public AuthSchemeRegistry();
    method public org.apache.http.auth.AuthScheme getAuthScheme(String, org.apache.http.params.HttpParams) throws java.lang.IllegalStateException;
    method public java.util.List<java.lang.String> getSchemeNames();
    method public void register(String, org.apache.http.auth.AuthSchemeFactory);
    method public void setItems(java.util.Map<java.lang.String,org.apache.http.auth.AuthSchemeFactory>);
    method public void unregister(String);
  }

  public class AuthScope {
    ctor public AuthScope(String, int, String, String);
    ctor public AuthScope(String, int, String);
    ctor public AuthScope(String, int);
    ctor public AuthScope(org.apache.http.auth.AuthScope);
    method public String getHost();
    method public int getPort();
    method public String getRealm();
    method public String getScheme();
    method public int match(org.apache.http.auth.AuthScope);
    field public static final org.apache.http.auth.AuthScope ANY;
    field public static final String ANY_HOST;
    field public static final int ANY_PORT = -1; // 0xffffffff
    field public static final String ANY_REALM;
    field public static final String ANY_SCHEME;
  }

  public class AuthState {
    ctor public AuthState();
    method public org.apache.http.auth.AuthScheme getAuthScheme();
    method public org.apache.http.auth.AuthScope getAuthScope();
    method public org.apache.http.auth.Credentials getCredentials();
    method public void invalidate();
    method public boolean isValid();
    method public void setAuthScheme(org.apache.http.auth.AuthScheme);
    method public void setAuthScope(org.apache.http.auth.AuthScope);
    method public void setCredentials(org.apache.http.auth.Credentials);
  }

  public class AuthenticationException extends org.apache.http.ProtocolException {
    ctor public AuthenticationException();
    ctor public AuthenticationException(String);
    ctor public AuthenticationException(String, Throwable);
  }

  public final class BasicUserPrincipal implements java.security.Principal {
    ctor public BasicUserPrincipal(String);
    method public String getName();
  }

  public interface Credentials {
    method public String getPassword();
    method public java.security.Principal getUserPrincipal();
  }

  public class InvalidCredentialsException extends org.apache.http.auth.AuthenticationException {
    ctor public InvalidCredentialsException();
    ctor public InvalidCredentialsException(String);
    ctor public InvalidCredentialsException(String, Throwable);
  }

  public class MalformedChallengeException extends org.apache.http.ProtocolException {
    ctor public MalformedChallengeException();
    ctor public MalformedChallengeException(String);
    ctor public MalformedChallengeException(String, Throwable);
  }

  public class NTCredentials implements org.apache.http.auth.Credentials {
    ctor public NTCredentials(String);
    ctor public NTCredentials(String, String, String, String);
    method public String getDomain();
    method public String getPassword();
    method public String getUserName();
    method public java.security.Principal getUserPrincipal();
    method public String getWorkstation();
  }

  public class NTUserPrincipal implements java.security.Principal {
    ctor public NTUserPrincipal(String, String);
    method public String getDomain();
    method public String getName();
    method public String getUsername();
  }

  public class UsernamePasswordCredentials implements org.apache.http.auth.Credentials {
    ctor public UsernamePasswordCredentials(String);
    ctor public UsernamePasswordCredentials(String, String);
    method public String getPassword();
    method public String getUserName();
    method public java.security.Principal getUserPrincipal();
  }

}

package org.apache.http.auth.params {

  public interface AuthPNames {
    field public static final String CREDENTIAL_CHARSET = "http.auth.credential-charset";
  }

  public class AuthParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public AuthParamBean(org.apache.http.params.HttpParams);
    method public void setCredentialCharset(String);
  }

  public final class AuthParams {
    method public static String getCredentialCharset(org.apache.http.params.HttpParams);
    method public static void setCredentialCharset(org.apache.http.params.HttpParams, String);
  }

}

package org.apache.http.client {

  public interface AuthenticationHandler {
    method public java.util.Map<java.lang.String,org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
    method public boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
    method public org.apache.http.auth.AuthScheme selectScheme(java.util.Map<java.lang.String,org.apache.http.Header>, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.AuthenticationException;
  }

  public class CircularRedirectException extends org.apache.http.client.RedirectException {
    ctor public CircularRedirectException();
    ctor public CircularRedirectException(String);
    ctor public CircularRedirectException(String, Throwable);
  }

  public class ClientProtocolException extends java.io.IOException {
    ctor public ClientProtocolException();
    ctor public ClientProtocolException(String);
    ctor public ClientProtocolException(Throwable);
    ctor public ClientProtocolException(String, Throwable);
  }

  public interface CookieStore {
    method public void addCookie(org.apache.http.cookie.Cookie);
    method public void clear();
    method public boolean clearExpired(java.util.Date);
    method public java.util.List<org.apache.http.cookie.Cookie> getCookies();
  }

  public interface CredentialsProvider {
    method public void clear();
    method public org.apache.http.auth.Credentials getCredentials(org.apache.http.auth.AuthScope);
    method public void setCredentials(org.apache.http.auth.AuthScope, org.apache.http.auth.Credentials);
  }

  public interface HttpClient {
    method public org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.client.ResponseHandler<? extends T>) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.client.ResponseHandler<? extends T>, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.client.ResponseHandler<? extends T>) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.client.ResponseHandler<? extends T>, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public org.apache.http.conn.ClientConnectionManager getConnectionManager();
    method public org.apache.http.params.HttpParams getParams();
  }

  public interface HttpRequestRetryHandler {
    method public boolean retryRequest(java.io.IOException, int, org.apache.http.protocol.HttpContext);
  }

  public class HttpResponseException extends org.apache.http.client.ClientProtocolException {
    ctor public HttpResponseException(int, String);
    method public int getStatusCode();
  }

  public class NonRepeatableRequestException extends org.apache.http.ProtocolException {
    ctor public NonRepeatableRequestException();
    ctor public NonRepeatableRequestException(String);
  }

  public class RedirectException extends org.apache.http.ProtocolException {
    ctor public RedirectException();
    ctor public RedirectException(String);
    ctor public RedirectException(String, Throwable);
  }

  public interface RedirectHandler {
    method public java.net.URI getLocationURI(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.ProtocolException;
    method public boolean isRedirectRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public interface RequestDirector {
    method public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface ResponseHandler<T> {
    method public T handleResponse(org.apache.http.HttpResponse) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
  }

  public interface UserTokenHandler {
    method public Object getUserToken(org.apache.http.protocol.HttpContext);
  }

}

package org.apache.http.client.entity {

  public class UrlEncodedFormEntity extends org.apache.http.entity.StringEntity {
    ctor public UrlEncodedFormEntity(java.util.List<? extends org.apache.http.NameValuePair>, String) throws java.io.UnsupportedEncodingException;
    ctor public UrlEncodedFormEntity(java.util.List<? extends org.apache.http.NameValuePair>) throws java.io.UnsupportedEncodingException;
  }

}

package org.apache.http.client.methods {

  public interface AbortableHttpRequest {
    method public void abort();
    method public void setConnectionRequest(org.apache.http.conn.ClientConnectionRequest) throws java.io.IOException;
    method public void setReleaseTrigger(org.apache.http.conn.ConnectionReleaseTrigger) throws java.io.IOException;
  }

  public class HttpDelete extends org.apache.http.client.methods.HttpRequestBase {
    ctor public HttpDelete();
    ctor public HttpDelete(java.net.URI);
    ctor public HttpDelete(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "DELETE";
  }

  public abstract class HttpEntityEnclosingRequestBase extends org.apache.http.client.methods.HttpRequestBase implements org.apache.http.HttpEntityEnclosingRequest {
    ctor public HttpEntityEnclosingRequestBase();
    method public boolean expectContinue();
    method public org.apache.http.HttpEntity getEntity();
    method public void setEntity(org.apache.http.HttpEntity);
  }

  public class HttpGet extends org.apache.http.client.methods.HttpRequestBase {
    ctor public HttpGet();
    ctor public HttpGet(java.net.URI);
    ctor public HttpGet(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "GET";
  }

  public class HttpHead extends org.apache.http.client.methods.HttpRequestBase {
    ctor public HttpHead();
    ctor public HttpHead(java.net.URI);
    ctor public HttpHead(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "HEAD";
  }

  public class HttpOptions extends org.apache.http.client.methods.HttpRequestBase {
    ctor public HttpOptions();
    ctor public HttpOptions(java.net.URI);
    ctor public HttpOptions(String);
    method public java.util.Set<java.lang.String> getAllowedMethods(org.apache.http.HttpResponse);
    method public String getMethod();
    field public static final String METHOD_NAME = "OPTIONS";
  }

  public class HttpPost extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
    ctor public HttpPost();
    ctor public HttpPost(java.net.URI);
    ctor public HttpPost(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "POST";
  }

  public class HttpPut extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
    ctor public HttpPut();
    ctor public HttpPut(java.net.URI);
    ctor public HttpPut(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "PUT";
  }

  public abstract class HttpRequestBase extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.AbortableHttpRequest java.lang.Cloneable org.apache.http.client.methods.HttpUriRequest {
    ctor public HttpRequestBase();
    method public void abort();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public org.apache.http.RequestLine getRequestLine();
    method public java.net.URI getURI();
    method public boolean isAborted();
    method public void setConnectionRequest(org.apache.http.conn.ClientConnectionRequest) throws java.io.IOException;
    method public void setReleaseTrigger(org.apache.http.conn.ConnectionReleaseTrigger) throws java.io.IOException;
    method public void setURI(java.net.URI);
  }

  public class HttpTrace extends org.apache.http.client.methods.HttpRequestBase {
    ctor public HttpTrace();
    ctor public HttpTrace(java.net.URI);
    ctor public HttpTrace(String);
    method public String getMethod();
    field public static final String METHOD_NAME = "TRACE";
  }

  public interface HttpUriRequest extends org.apache.http.HttpRequest {
    method public void abort() throws java.lang.UnsupportedOperationException;
    method public String getMethod();
    method public java.net.URI getURI();
    method public boolean isAborted();
  }

}

package org.apache.http.client.params {

  public interface AllClientPNames extends org.apache.http.params.CoreConnectionPNames org.apache.http.auth.params.AuthPNames org.apache.http.client.params.ClientPNames org.apache.http.conn.params.ConnConnectionPNames org.apache.http.conn.params.ConnManagerPNames org.apache.http.conn.params.ConnRoutePNames org.apache.http.cookie.params.CookieSpecPNames org.apache.http.params.CoreProtocolPNames {
  }

  public final class AuthPolicy {
    field public static final String BASIC = "Basic";
    field public static final String DIGEST = "Digest";
    field public static final String NTLM = "NTLM";
  }

  public interface ClientPNames {
    field public static final String ALLOW_CIRCULAR_REDIRECTS = "http.protocol.allow-circular-redirects";
    field public static final String CONNECTION_MANAGER_FACTORY = "http.connection-manager.factory-object";
    field public static final String CONNECTION_MANAGER_FACTORY_CLASS_NAME = "http.connection-manager.factory-class-name";
    field public static final String COOKIE_POLICY = "http.protocol.cookie-policy";
    field public static final String DEFAULT_HEADERS = "http.default-headers";
    field public static final String DEFAULT_HOST = "http.default-host";
    field public static final String HANDLE_AUTHENTICATION = "http.protocol.handle-authentication";
    field public static final String HANDLE_REDIRECTS = "http.protocol.handle-redirects";
    field public static final String MAX_REDIRECTS = "http.protocol.max-redirects";
    field public static final String REJECT_RELATIVE_REDIRECT = "http.protocol.reject-relative-redirect";
    field public static final String VIRTUAL_HOST = "http.virtual-host";
  }

  public class ClientParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public ClientParamBean(org.apache.http.params.HttpParams);
    method public void setAllowCircularRedirects(boolean);
    method public void setConnectionManagerFactory(org.apache.http.conn.ClientConnectionManagerFactory);
    method public void setConnectionManagerFactoryClassName(String);
    method public void setCookiePolicy(String);
    method public void setDefaultHeaders(java.util.Collection<org.apache.http.Header>);
    method public void setDefaultHost(org.apache.http.HttpHost);
    method public void setHandleAuthentication(boolean);
    method public void setHandleRedirects(boolean);
    method public void setMaxRedirects(int);
    method public void setRejectRelativeRedirect(boolean);
    method public void setVirtualHost(org.apache.http.HttpHost);
  }

  public final class CookiePolicy {
    field public static final String BEST_MATCH = "best-match";
    field public static final String BROWSER_COMPATIBILITY = "compatibility";
    field public static final String NETSCAPE = "netscape";
    field public static final String RFC_2109 = "rfc2109";
    field public static final String RFC_2965 = "rfc2965";
  }

  public class HttpClientParams {
    method public static String getCookiePolicy(org.apache.http.params.HttpParams);
    method public static boolean isAuthenticating(org.apache.http.params.HttpParams);
    method public static boolean isRedirecting(org.apache.http.params.HttpParams);
    method public static void setAuthenticating(org.apache.http.params.HttpParams, boolean);
    method public static void setCookiePolicy(org.apache.http.params.HttpParams, String);
    method public static void setRedirecting(org.apache.http.params.HttpParams, boolean);
  }

}

package org.apache.http.client.protocol {

  public interface ClientContext {
    field public static final String AUTHSCHEME_REGISTRY = "http.authscheme-registry";
    field public static final String AUTH_SCHEME_PREF = "http.auth.scheme-pref";
    field public static final String COOKIESPEC_REGISTRY = "http.cookiespec-registry";
    field public static final String COOKIE_ORIGIN = "http.cookie-origin";
    field public static final String COOKIE_SPEC = "http.cookie-spec";
    field public static final String COOKIE_STORE = "http.cookie-store";
    field public static final String CREDS_PROVIDER = "http.auth.credentials-provider";
    field public static final String PROXY_AUTH_STATE = "http.auth.proxy-scope";
    field public static final String TARGET_AUTH_STATE = "http.auth.target-scope";
    field public static final String USER_TOKEN = "http.user-token";
  }

  public class ClientContextConfigurer implements org.apache.http.client.protocol.ClientContext {
    ctor public ClientContextConfigurer(org.apache.http.protocol.HttpContext);
    method public void setAuthSchemePref(java.util.List<java.lang.String>);
    method public void setAuthSchemeRegistry(org.apache.http.auth.AuthSchemeRegistry);
    method public void setCookieSpecRegistry(org.apache.http.cookie.CookieSpecRegistry);
    method public void setCookieStore(org.apache.http.client.CookieStore);
    method public void setCredentialsProvider(org.apache.http.client.CredentialsProvider);
  }

  public class RequestAddCookies implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestAddCookies();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestDefaultHeaders implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestDefaultHeaders();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestProxyAuthentication implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestProxyAuthentication();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestTargetAuthentication implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestTargetAuthentication();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class ResponseProcessCookies implements org.apache.http.HttpResponseInterceptor {
    ctor public ResponseProcessCookies();
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

}

package org.apache.http.client.utils {

  public class CloneUtils {
    method public static Object clone(Object) throws java.lang.CloneNotSupportedException;
  }

  public class URIUtils {
    method public static java.net.URI createURI(String, String, int, String, String, String) throws java.net.URISyntaxException;
    method public static java.net.URI resolve(java.net.URI, String);
    method public static java.net.URI resolve(java.net.URI, java.net.URI);
    method public static java.net.URI rewriteURI(java.net.URI, org.apache.http.HttpHost, boolean) throws java.net.URISyntaxException;
    method public static java.net.URI rewriteURI(java.net.URI, org.apache.http.HttpHost) throws java.net.URISyntaxException;
  }

  public class URLEncodedUtils {
    ctor public URLEncodedUtils();
    method public static String format(java.util.List<? extends org.apache.http.NameValuePair>, String);
    method public static boolean isEncoded(org.apache.http.HttpEntity);
    method public static java.util.List<org.apache.http.NameValuePair> parse(java.net.URI, String);
    method public static java.util.List<org.apache.http.NameValuePair> parse(org.apache.http.HttpEntity) throws java.io.IOException;
    method public static void parse(java.util.List<org.apache.http.NameValuePair>, java.util.Scanner, String);
    field public static final String CONTENT_TYPE = "application/x-www-form-urlencoded";
  }

}

package org.apache.http.conn {

  public class BasicEofSensorWatcher implements org.apache.http.conn.EofSensorWatcher {
    ctor public BasicEofSensorWatcher(org.apache.http.conn.ManagedClientConnection, boolean);
    method public boolean eofDetected(java.io.InputStream) throws java.io.IOException;
    method public boolean streamAbort(java.io.InputStream) throws java.io.IOException;
    method public boolean streamClosed(java.io.InputStream) throws java.io.IOException;
    field protected boolean attemptReuse;
    field protected org.apache.http.conn.ManagedClientConnection managedConn;
  }

  public class BasicManagedEntity extends org.apache.http.entity.HttpEntityWrapper implements org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.conn.EofSensorWatcher {
    ctor public BasicManagedEntity(org.apache.http.HttpEntity, org.apache.http.conn.ManagedClientConnection, boolean);
    method public void abortConnection() throws java.io.IOException;
    method public boolean eofDetected(java.io.InputStream) throws java.io.IOException;
    method public void releaseConnection() throws java.io.IOException;
    method protected void releaseManagedConnection() throws java.io.IOException;
    method public boolean streamAbort(java.io.InputStream) throws java.io.IOException;
    method public boolean streamClosed(java.io.InputStream) throws java.io.IOException;
    field protected final boolean attemptReuse;
    field protected org.apache.http.conn.ManagedClientConnection managedConn;
  }

  public interface ClientConnectionManager {
    method public void closeExpiredConnections();
    method public void closeIdleConnections(long, java.util.concurrent.TimeUnit);
    method public org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry();
    method public void releaseConnection(org.apache.http.conn.ManagedClientConnection, long, java.util.concurrent.TimeUnit);
    method public org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, Object);
    method public void shutdown();
  }

  public interface ClientConnectionManagerFactory {
    method public org.apache.http.conn.ClientConnectionManager newInstance(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
  }

  public interface ClientConnectionOperator {
    method public org.apache.http.conn.OperatedClientConnection createConnection();
    method public void openConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void updateSecureConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

  public interface ClientConnectionRequest {
    method public void abortRequest();
    method public org.apache.http.conn.ManagedClientConnection getConnection(long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
  }

  public class ConnectTimeoutException extends java.io.InterruptedIOException {
    ctor public ConnectTimeoutException();
    ctor public ConnectTimeoutException(String);
  }

  public interface ConnectionKeepAliveStrategy {
    method public long getKeepAliveDuration(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class ConnectionPoolTimeoutException extends org.apache.http.conn.ConnectTimeoutException {
    ctor public ConnectionPoolTimeoutException();
    ctor public ConnectionPoolTimeoutException(String);
  }

  public interface ConnectionReleaseTrigger {
    method public void abortConnection() throws java.io.IOException;
    method public void releaseConnection() throws java.io.IOException;
  }

  public class EofSensorInputStream extends java.io.InputStream implements org.apache.http.conn.ConnectionReleaseTrigger {
    ctor public EofSensorInputStream(java.io.InputStream, org.apache.http.conn.EofSensorWatcher);
    method public void abortConnection() throws java.io.IOException;
    method protected void checkAbort() throws java.io.IOException;
    method protected void checkClose() throws java.io.IOException;
    method protected void checkEOF(int) throws java.io.IOException;
    method protected boolean isReadAllowed() throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method public void releaseConnection() throws java.io.IOException;
    field protected java.io.InputStream wrappedStream;
  }

  public interface EofSensorWatcher {
    method public boolean eofDetected(java.io.InputStream) throws java.io.IOException;
    method public boolean streamAbort(java.io.InputStream) throws java.io.IOException;
    method public boolean streamClosed(java.io.InputStream) throws java.io.IOException;
  }

  public class HttpHostConnectException extends java.net.ConnectException {
    ctor public HttpHostConnectException(org.apache.http.HttpHost, java.net.ConnectException);
    method public org.apache.http.HttpHost getHost();
  }

  public interface ManagedClientConnection extends org.apache.http.HttpClientConnection org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.HttpInetConnection {
    method public org.apache.http.conn.routing.HttpRoute getRoute();
    method public javax.net.ssl.SSLSession getSSLSession();
    method public Object getState();
    method public boolean isMarkedReusable();
    method public boolean isSecure();
    method public void layerProtocol(org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void markReusable();
    method public void open(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void setIdleDuration(long, java.util.concurrent.TimeUnit);
    method public void setState(Object);
    method public void tunnelProxy(org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void tunnelTarget(boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void unmarkReusable();
  }

  public final class MultihomePlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
    method public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public java.net.Socket createSocket();
    method public static org.apache.http.conn.MultihomePlainSocketFactory getSocketFactory();
    method public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
  }

  public interface OperatedClientConnection extends org.apache.http.HttpClientConnection org.apache.http.HttpInetConnection {
    method public java.net.Socket getSocket();
    method public org.apache.http.HttpHost getTargetHost();
    method public boolean isSecure();
    method public void openCompleted(boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void opening(java.net.Socket, org.apache.http.HttpHost) throws java.io.IOException;
    method public void update(java.net.Socket, org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

}

package org.apache.http.conn.params {

  public interface ConnConnectionPNames {
    field public static final String MAX_STATUS_LINE_GARBAGE = "http.connection.max-status-line-garbage";
  }

  public class ConnConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public ConnConnectionParamBean(org.apache.http.params.HttpParams);
    method public void setMaxStatusLineGarbage(int);
  }

  public interface ConnManagerPNames {
    field public static final String MAX_CONNECTIONS_PER_ROUTE = "http.conn-manager.max-per-route";
    field public static final String MAX_TOTAL_CONNECTIONS = "http.conn-manager.max-total";
    field public static final String TIMEOUT = "http.conn-manager.timeout";
  }

  public class ConnManagerParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public ConnManagerParamBean(org.apache.http.params.HttpParams);
    method public void setConnectionsPerRoute(org.apache.http.conn.params.ConnPerRouteBean);
    method public void setMaxTotalConnections(int);
    method public void setTimeout(long);
  }

  public final class ConnManagerParams implements org.apache.http.conn.params.ConnManagerPNames {
    ctor public ConnManagerParams();
    method public static org.apache.http.conn.params.ConnPerRoute getMaxConnectionsPerRoute(org.apache.http.params.HttpParams);
    method public static int getMaxTotalConnections(org.apache.http.params.HttpParams);
    method public static long getTimeout(org.apache.http.params.HttpParams);
    method public static void setMaxConnectionsPerRoute(org.apache.http.params.HttpParams, org.apache.http.conn.params.ConnPerRoute);
    method public static void setMaxTotalConnections(org.apache.http.params.HttpParams, int);
    method public static void setTimeout(org.apache.http.params.HttpParams, long);
    field public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20; // 0x14
  }

  public interface ConnPerRoute {
    method public int getMaxForRoute(org.apache.http.conn.routing.HttpRoute);
  }

  public final class ConnPerRouteBean implements org.apache.http.conn.params.ConnPerRoute {
    ctor public ConnPerRouteBean(int);
    ctor public ConnPerRouteBean();
    method public int getDefaultMax();
    method public int getMaxForRoute(org.apache.http.conn.routing.HttpRoute);
    method public void setDefaultMaxPerRoute(int);
    method public void setMaxForRoute(org.apache.http.conn.routing.HttpRoute, int);
    method public void setMaxForRoutes(java.util.Map<org.apache.http.conn.routing.HttpRoute,java.lang.Integer>);
    field public static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2; // 0x2
  }

  public interface ConnRoutePNames {
    field public static final String DEFAULT_PROXY = "http.route.default-proxy";
    field public static final String FORCED_ROUTE = "http.route.forced-route";
    field public static final String LOCAL_ADDRESS = "http.route.local-address";
  }

  public class ConnRouteParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public ConnRouteParamBean(org.apache.http.params.HttpParams);
    method public void setDefaultProxy(org.apache.http.HttpHost);
    method public void setForcedRoute(org.apache.http.conn.routing.HttpRoute);
    method public void setLocalAddress(java.net.InetAddress);
  }

  public class ConnRouteParams implements org.apache.http.conn.params.ConnRoutePNames {
    method public static org.apache.http.HttpHost getDefaultProxy(org.apache.http.params.HttpParams);
    method public static org.apache.http.conn.routing.HttpRoute getForcedRoute(org.apache.http.params.HttpParams);
    method public static java.net.InetAddress getLocalAddress(org.apache.http.params.HttpParams);
    method public static void setDefaultProxy(org.apache.http.params.HttpParams, org.apache.http.HttpHost);
    method public static void setForcedRoute(org.apache.http.params.HttpParams, org.apache.http.conn.routing.HttpRoute);
    method public static void setLocalAddress(org.apache.http.params.HttpParams, java.net.InetAddress);
    field public static final org.apache.http.HttpHost NO_HOST;
    field public static final org.apache.http.conn.routing.HttpRoute NO_ROUTE;
  }

}

package org.apache.http.conn.routing {

  public class BasicRouteDirector implements org.apache.http.conn.routing.HttpRouteDirector {
    ctor public BasicRouteDirector();
    method protected int directStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
    method protected int firstStep(org.apache.http.conn.routing.RouteInfo);
    method public int nextStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
    method protected int proxiedStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
  }

  public final class HttpRoute implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
    ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.HttpHost[], boolean, org.apache.http.conn.routing.RouteInfo.TunnelType, org.apache.http.conn.routing.RouteInfo.LayerType);
    ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.HttpHost, boolean, org.apache.http.conn.routing.RouteInfo.TunnelType, org.apache.http.conn.routing.RouteInfo.LayerType);
    ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, boolean);
    ctor public HttpRoute(org.apache.http.HttpHost);
    ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.HttpHost, boolean);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public int getHopCount();
    method public org.apache.http.HttpHost getHopTarget(int);
    method public org.apache.http.conn.routing.RouteInfo.LayerType getLayerType();
    method public java.net.InetAddress getLocalAddress();
    method public org.apache.http.HttpHost getProxyHost();
    method public org.apache.http.HttpHost getTargetHost();
    method public org.apache.http.conn.routing.RouteInfo.TunnelType getTunnelType();
    method public boolean isLayered();
    method public boolean isSecure();
    method public boolean isTunnelled();
  }

  public interface HttpRouteDirector {
    method public int nextStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
    field public static final int COMPLETE = 0; // 0x0
    field public static final int CONNECT_PROXY = 2; // 0x2
    field public static final int CONNECT_TARGET = 1; // 0x1
    field public static final int LAYER_PROTOCOL = 5; // 0x5
    field public static final int TUNNEL_PROXY = 4; // 0x4
    field public static final int TUNNEL_TARGET = 3; // 0x3
    field public static final int UNREACHABLE = -1; // 0xffffffff
  }

  public interface HttpRoutePlanner {
    method public org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
  }

  public interface RouteInfo {
    method public int getHopCount();
    method public org.apache.http.HttpHost getHopTarget(int);
    method public org.apache.http.conn.routing.RouteInfo.LayerType getLayerType();
    method public java.net.InetAddress getLocalAddress();
    method public org.apache.http.HttpHost getProxyHost();
    method public org.apache.http.HttpHost getTargetHost();
    method public org.apache.http.conn.routing.RouteInfo.TunnelType getTunnelType();
    method public boolean isLayered();
    method public boolean isSecure();
    method public boolean isTunnelled();
  }

  public enum RouteInfo.LayerType {
    enum_constant public static final org.apache.http.conn.routing.RouteInfo.LayerType LAYERED;
    enum_constant public static final org.apache.http.conn.routing.RouteInfo.LayerType PLAIN;
  }

  public enum RouteInfo.TunnelType {
    enum_constant public static final org.apache.http.conn.routing.RouteInfo.TunnelType PLAIN;
    enum_constant public static final org.apache.http.conn.routing.RouteInfo.TunnelType TUNNELLED;
  }

  public final class RouteTracker implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
    ctor public RouteTracker(org.apache.http.HttpHost, java.net.InetAddress);
    ctor public RouteTracker(org.apache.http.conn.routing.HttpRoute);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public void connectProxy(org.apache.http.HttpHost, boolean);
    method public void connectTarget(boolean);
    method public int getHopCount();
    method public org.apache.http.HttpHost getHopTarget(int);
    method public org.apache.http.conn.routing.RouteInfo.LayerType getLayerType();
    method public java.net.InetAddress getLocalAddress();
    method public org.apache.http.HttpHost getProxyHost();
    method public org.apache.http.HttpHost getTargetHost();
    method public org.apache.http.conn.routing.RouteInfo.TunnelType getTunnelType();
    method public boolean isConnected();
    method public boolean isLayered();
    method public boolean isSecure();
    method public boolean isTunnelled();
    method public void layerProtocol(boolean);
    method public org.apache.http.conn.routing.HttpRoute toRoute();
    method public void tunnelProxy(org.apache.http.HttpHost, boolean);
    method public void tunnelTarget(boolean);
  }

}

package org.apache.http.conn.scheme {

  public interface HostNameResolver {
    method public java.net.InetAddress resolve(String) throws java.io.IOException;
  }

  public interface LayeredSocketFactory extends org.apache.http.conn.scheme.SocketFactory {
    method public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
  }

  public final class PlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
    ctor public PlainSocketFactory(org.apache.http.conn.scheme.HostNameResolver);
    ctor public PlainSocketFactory();
    method public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public java.net.Socket createSocket();
    method public static org.apache.http.conn.scheme.PlainSocketFactory getSocketFactory();
    method public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
  }

  public final class Scheme {
    ctor public Scheme(String, org.apache.http.conn.scheme.SocketFactory, int);
    method public int getDefaultPort();
    method public String getName();
    method public org.apache.http.conn.scheme.SocketFactory getSocketFactory();
    method public boolean isLayered();
    method public int resolvePort(int);
  }

  public final class SchemeRegistry {
    ctor public SchemeRegistry();
    method public org.apache.http.conn.scheme.Scheme get(String);
    method public org.apache.http.conn.scheme.Scheme getScheme(String);
    method public org.apache.http.conn.scheme.Scheme getScheme(org.apache.http.HttpHost);
    method public java.util.List<java.lang.String> getSchemeNames();
    method public org.apache.http.conn.scheme.Scheme register(org.apache.http.conn.scheme.Scheme);
    method public void setItems(java.util.Map<java.lang.String,org.apache.http.conn.scheme.Scheme>);
    method public org.apache.http.conn.scheme.Scheme unregister(String);
  }

  public interface SocketFactory {
    method public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws org.apache.http.conn.ConnectTimeoutException, java.io.IOException, java.net.UnknownHostException;
    method public java.net.Socket createSocket() throws java.io.IOException;
    method public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
  }

}

package org.apache.http.conn.ssl {

  public abstract class AbstractVerifier implements org.apache.http.conn.ssl.X509HostnameVerifier {
    ctor public AbstractVerifier();
    method public static boolean acceptableCountryWildcard(String);
    method public static int countDots(String);
    method public static String[] getCNs(java.security.cert.X509Certificate);
    method public static String[] getDNSSubjectAlts(java.security.cert.X509Certificate);
    method public final void verify(String, javax.net.ssl.SSLSocket) throws java.io.IOException;
    method public final boolean verify(String, javax.net.ssl.SSLSession);
    method public final void verify(String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
    method public final void verify(String, String[], String[], boolean) throws javax.net.ssl.SSLException;
  }

  public class AllowAllHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
    ctor public AllowAllHostnameVerifier();
    method public final String toString();
    method public final void verify(String, String[], String[]);
  }

  public class BrowserCompatHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
    ctor public BrowserCompatHostnameVerifier();
    method public final String toString();
    method public final void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
  }

  public class SSLSocketFactory implements org.apache.http.conn.scheme.LayeredSocketFactory {
    ctor public SSLSocketFactory(String, java.security.KeyStore, String, java.security.KeyStore, java.security.SecureRandom, org.apache.http.conn.scheme.HostNameResolver) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    ctor public SSLSocketFactory(java.security.KeyStore, String, java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    ctor public SSLSocketFactory(java.security.KeyStore, String) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    ctor public SSLSocketFactory(java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
    method public java.net.Socket connectSocket(java.net.Socket, String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public java.net.Socket createSocket() throws java.io.IOException;
    method public java.net.Socket createSocket(java.net.Socket, String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
    method public org.apache.http.conn.ssl.X509HostnameVerifier getHostnameVerifier();
    method public static org.apache.http.conn.ssl.SSLSocketFactory getSocketFactory();
    method public boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
    method public void setHostnameVerifier(org.apache.http.conn.ssl.X509HostnameVerifier);
    field public static final org.apache.http.conn.ssl.X509HostnameVerifier ALLOW_ALL_HOSTNAME_VERIFIER;
    field public static final org.apache.http.conn.ssl.X509HostnameVerifier BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
    field public static final String SSL = "SSL";
    field public static final String SSLV2 = "SSLv2";
    field public static final org.apache.http.conn.ssl.X509HostnameVerifier STRICT_HOSTNAME_VERIFIER;
    field public static final String TLS = "TLS";
  }

  public class StrictHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
    ctor public StrictHostnameVerifier();
    method public final String toString();
    method public final void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
  }

  public interface X509HostnameVerifier extends javax.net.ssl.HostnameVerifier {
    method public void verify(String, javax.net.ssl.SSLSocket) throws java.io.IOException;
    method public void verify(String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
    method public void verify(String, String[], String[]) throws javax.net.ssl.SSLException;
  }

}

package org.apache.http.conn.util {

  public class InetAddressUtils {
    method public static boolean isIPv4Address(String);
    method public static boolean isIPv6Address(String);
    method public static boolean isIPv6HexCompressedAddress(String);
    method public static boolean isIPv6StdAddress(String);
  }

}

package org.apache.http.cookie {

  public interface ClientCookie extends org.apache.http.cookie.Cookie {
    method public boolean containsAttribute(String);
    method public String getAttribute(String);
    field public static final String COMMENTURL_ATTR = "commenturl";
    field public static final String COMMENT_ATTR = "comment";
    field public static final String DISCARD_ATTR = "discard";
    field public static final String DOMAIN_ATTR = "domain";
    field public static final String EXPIRES_ATTR = "expires";
    field public static final String MAX_AGE_ATTR = "max-age";
    field public static final String PATH_ATTR = "path";
    field public static final String PORT_ATTR = "port";
    field public static final String SECURE_ATTR = "secure";
    field public static final String VERSION_ATTR = "version";
  }

  public interface Cookie {
    method public String getComment();
    method public String getCommentURL();
    method public String getDomain();
    method public java.util.Date getExpiryDate();
    method public String getName();
    method public String getPath();
    method public int[] getPorts();
    method public String getValue();
    method public int getVersion();
    method public boolean isExpired(java.util.Date);
    method public boolean isPersistent();
    method public boolean isSecure();
  }

  public interface CookieAttributeHandler {
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class CookieIdentityComparator implements java.util.Comparator<org.apache.http.cookie.Cookie> java.io.Serializable {
    ctor public CookieIdentityComparator();
    method public int compare(org.apache.http.cookie.Cookie, org.apache.http.cookie.Cookie);
  }

  public final class CookieOrigin {
    ctor public CookieOrigin(String, int, String, boolean);
    method public String getHost();
    method public String getPath();
    method public int getPort();
    method public boolean isSecure();
  }

  public class CookiePathComparator implements java.util.Comparator<org.apache.http.cookie.Cookie> java.io.Serializable {
    ctor public CookiePathComparator();
    method public int compare(org.apache.http.cookie.Cookie, org.apache.http.cookie.Cookie);
  }

  public interface CookieSpec {
    method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
    method public int getVersion();
    method public org.apache.http.Header getVersionHeader();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public interface CookieSpecFactory {
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public final class CookieSpecRegistry {
    ctor public CookieSpecRegistry();
    method public org.apache.http.cookie.CookieSpec getCookieSpec(String, org.apache.http.params.HttpParams) throws java.lang.IllegalStateException;
    method public org.apache.http.cookie.CookieSpec getCookieSpec(String) throws java.lang.IllegalStateException;
    method public java.util.List<java.lang.String> getSpecNames();
    method public void register(String, org.apache.http.cookie.CookieSpecFactory);
    method public void setItems(java.util.Map<java.lang.String,org.apache.http.cookie.CookieSpecFactory>);
    method public void unregister(String);
  }

  public class MalformedCookieException extends org.apache.http.ProtocolException {
    ctor public MalformedCookieException();
    ctor public MalformedCookieException(String);
    ctor public MalformedCookieException(String, Throwable);
  }

  public interface SM {
    field public static final String COOKIE = "Cookie";
    field public static final String COOKIE2 = "Cookie2";
    field public static final String SET_COOKIE = "Set-Cookie";
    field public static final String SET_COOKIE2 = "Set-Cookie2";
  }

  public interface SetCookie extends org.apache.http.cookie.Cookie {
    method public void setComment(String);
    method public void setDomain(String);
    method public void setExpiryDate(java.util.Date);
    method public void setPath(String);
    method public void setSecure(boolean);
    method public void setValue(String);
    method public void setVersion(int);
  }

  public interface SetCookie2 extends org.apache.http.cookie.SetCookie {
    method public void setCommentURL(String);
    method public void setDiscard(boolean);
    method public void setPorts(int[]);
  }

}

package org.apache.http.cookie.params {

  public interface CookieSpecPNames {
    field public static final String DATE_PATTERNS = "http.protocol.cookie-datepatterns";
    field public static final String SINGLE_COOKIE_HEADER = "http.protocol.single-cookie-header";
  }

  public class CookieSpecParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public CookieSpecParamBean(org.apache.http.params.HttpParams);
    method public void setDatePatterns(java.util.Collection<java.lang.String>);
    method public void setSingleHeader(boolean);
  }

}

package org.apache.http.entity {

  public abstract class AbstractHttpEntity implements org.apache.http.HttpEntity {
    ctor protected AbstractHttpEntity();
    method public void consumeContent() throws java.io.IOException, java.lang.UnsupportedOperationException;
    method public org.apache.http.Header getContentEncoding();
    method public org.apache.http.Header getContentType();
    method public boolean isChunked();
    method public void setChunked(boolean);
    method public void setContentEncoding(org.apache.http.Header);
    method public void setContentEncoding(String);
    method public void setContentType(org.apache.http.Header);
    method public void setContentType(String);
    field protected boolean chunked;
    field protected org.apache.http.Header contentEncoding;
    field protected org.apache.http.Header contentType;
  }

  public class BasicHttpEntity extends org.apache.http.entity.AbstractHttpEntity {
    ctor public BasicHttpEntity();
    method public void consumeContent() throws java.io.IOException;
    method public java.io.InputStream getContent() throws java.lang.IllegalStateException;
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void setContent(java.io.InputStream);
    method public void setContentLength(long);
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public class BufferedHttpEntity extends org.apache.http.entity.HttpEntityWrapper {
    ctor public BufferedHttpEntity(org.apache.http.HttpEntity) throws java.io.IOException;
  }

  public class ByteArrayEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
    ctor public ByteArrayEntity(byte[]);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public java.io.InputStream getContent();
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
    field protected final byte[] content;
  }

  public interface ContentLengthStrategy {
    method public long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
    field public static final int CHUNKED = -2; // 0xfffffffe
    field public static final int IDENTITY = -1; // 0xffffffff
  }

  public interface ContentProducer {
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public class EntityTemplate extends org.apache.http.entity.AbstractHttpEntity {
    ctor public EntityTemplate(org.apache.http.entity.ContentProducer);
    method public void consumeContent() throws java.io.IOException;
    method public java.io.InputStream getContent();
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public class FileEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
    ctor public FileEntity(java.io.File, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public java.io.InputStream getContent() throws java.io.IOException;
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
    field protected final java.io.File file;
  }

  public class HttpEntityWrapper implements org.apache.http.HttpEntity {
    ctor public HttpEntityWrapper(org.apache.http.HttpEntity);
    method public void consumeContent() throws java.io.IOException;
    method public java.io.InputStream getContent() throws java.io.IOException;
    method public org.apache.http.Header getContentEncoding();
    method public long getContentLength();
    method public org.apache.http.Header getContentType();
    method public boolean isChunked();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
    field protected org.apache.http.HttpEntity wrappedEntity;
  }

  public class InputStreamEntity extends org.apache.http.entity.AbstractHttpEntity {
    ctor public InputStreamEntity(java.io.InputStream, long);
    method public void consumeContent() throws java.io.IOException;
    method public java.io.InputStream getContent() throws java.io.IOException;
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public class SerializableEntity extends org.apache.http.entity.AbstractHttpEntity {
    ctor public SerializableEntity(java.io.Serializable, boolean) throws java.io.IOException;
    method public java.io.InputStream getContent() throws java.io.IOException, java.lang.IllegalStateException;
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
  }

  public class StringEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
    ctor public StringEntity(String, String) throws java.io.UnsupportedEncodingException;
    ctor public StringEntity(String) throws java.io.UnsupportedEncodingException;
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public java.io.InputStream getContent() throws java.io.IOException;
    method public long getContentLength();
    method public boolean isRepeatable();
    method public boolean isStreaming();
    method public void writeTo(java.io.OutputStream) throws java.io.IOException;
    field protected final byte[] content;
  }

}

package org.apache.http.impl {

  public abstract class AbstractHttpClientConnection implements org.apache.http.HttpClientConnection {
    ctor public AbstractHttpClientConnection();
    method protected abstract void assertOpen() throws java.lang.IllegalStateException;
    method protected org.apache.http.impl.entity.EntityDeserializer createEntityDeserializer();
    method protected org.apache.http.impl.entity.EntitySerializer createEntitySerializer();
    method protected org.apache.http.HttpResponseFactory createHttpResponseFactory();
    method protected org.apache.http.io.HttpMessageWriter createRequestWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.params.HttpParams);
    method protected org.apache.http.io.HttpMessageParser createResponseParser(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpResponseFactory, org.apache.http.params.HttpParams);
    method protected void doFlush() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public org.apache.http.HttpConnectionMetrics getMetrics();
    method protected void init(org.apache.http.io.SessionInputBuffer, org.apache.http.io.SessionOutputBuffer, org.apache.http.params.HttpParams);
    method public boolean isResponseAvailable(int) throws java.io.IOException;
    method public boolean isStale();
    method public void receiveResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpResponse receiveResponseHeader() throws org.apache.http.HttpException, java.io.IOException;
    method public void sendRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public void sendRequestHeader(org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException;
  }

  public abstract class AbstractHttpServerConnection implements org.apache.http.HttpServerConnection {
    ctor public AbstractHttpServerConnection();
    method protected abstract void assertOpen() throws java.lang.IllegalStateException;
    method protected org.apache.http.impl.entity.EntityDeserializer createEntityDeserializer();
    method protected org.apache.http.impl.entity.EntitySerializer createEntitySerializer();
    method protected org.apache.http.HttpRequestFactory createHttpRequestFactory();
    method protected org.apache.http.io.HttpMessageParser createRequestParser(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpRequestFactory, org.apache.http.params.HttpParams);
    method protected org.apache.http.io.HttpMessageWriter createResponseWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.params.HttpParams);
    method protected void doFlush() throws java.io.IOException;
    method public void flush() throws java.io.IOException;
    method public org.apache.http.HttpConnectionMetrics getMetrics();
    method protected void init(org.apache.http.io.SessionInputBuffer, org.apache.http.io.SessionOutputBuffer, org.apache.http.params.HttpParams);
    method public boolean isStale();
    method public void receiveRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpRequest receiveRequestHeader() throws org.apache.http.HttpException, java.io.IOException;
    method public void sendResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
    method public void sendResponseHeader(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class DefaultConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
    ctor public DefaultConnectionReuseStrategy();
    method protected org.apache.http.TokenIterator createTokenIterator(org.apache.http.HeaderIterator);
    method public boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class DefaultHttpClientConnection extends org.apache.http.impl.SocketHttpClientConnection {
    ctor public DefaultHttpClientConnection();
    method public void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

  public class DefaultHttpRequestFactory implements org.apache.http.HttpRequestFactory {
    ctor public DefaultHttpRequestFactory();
    method public org.apache.http.HttpRequest newHttpRequest(org.apache.http.RequestLine) throws org.apache.http.MethodNotSupportedException;
    method public org.apache.http.HttpRequest newHttpRequest(String, String) throws org.apache.http.MethodNotSupportedException;
  }

  public class DefaultHttpResponseFactory implements org.apache.http.HttpResponseFactory {
    ctor public DefaultHttpResponseFactory(org.apache.http.ReasonPhraseCatalog);
    ctor public DefaultHttpResponseFactory();
    method protected java.util.Locale determineLocale(org.apache.http.protocol.HttpContext);
    method public org.apache.http.HttpResponse newHttpResponse(org.apache.http.ProtocolVersion, int, org.apache.http.protocol.HttpContext);
    method public org.apache.http.HttpResponse newHttpResponse(org.apache.http.StatusLine, org.apache.http.protocol.HttpContext);
    field protected final org.apache.http.ReasonPhraseCatalog reasonCatalog;
  }

  public class DefaultHttpServerConnection extends org.apache.http.impl.SocketHttpServerConnection {
    ctor public DefaultHttpServerConnection();
    method public void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

  public class EnglishReasonPhraseCatalog implements org.apache.http.ReasonPhraseCatalog {
    ctor protected EnglishReasonPhraseCatalog();
    method public String getReason(int, java.util.Locale);
    field public static final org.apache.http.impl.EnglishReasonPhraseCatalog INSTANCE;
  }

  public class HttpConnectionMetricsImpl implements org.apache.http.HttpConnectionMetrics {
    ctor public HttpConnectionMetricsImpl(org.apache.http.io.HttpTransportMetrics, org.apache.http.io.HttpTransportMetrics);
    method public Object getMetric(String);
    method public long getReceivedBytesCount();
    method public long getRequestCount();
    method public long getResponseCount();
    method public long getSentBytesCount();
    method public void incrementRequestCount();
    method public void incrementResponseCount();
    method public void reset();
    method public void setMetric(String, Object);
    field public static final String RECEIVED_BYTES_COUNT = "http.received-bytes-count";
    field public static final String REQUEST_COUNT = "http.request-count";
    field public static final String RESPONSE_COUNT = "http.response-count";
    field public static final String SENT_BYTES_COUNT = "http.sent-bytes-count";
  }

  public class NoConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
    ctor public NoConnectionReuseStrategy();
    method public boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class SocketHttpClientConnection extends org.apache.http.impl.AbstractHttpClientConnection implements org.apache.http.HttpInetConnection {
    ctor public SocketHttpClientConnection();
    method protected void assertNotOpen();
    method protected void assertOpen();
    method protected void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method protected org.apache.http.io.SessionInputBuffer createSessionInputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method protected org.apache.http.io.SessionOutputBuffer createSessionOutputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method public java.net.InetAddress getRemoteAddress();
    method public int getRemotePort();
    method protected java.net.Socket getSocket();
    method public int getSocketTimeout();
    method public boolean isOpen();
    method public void setSocketTimeout(int);
    method public void shutdown() throws java.io.IOException;
  }

  public class SocketHttpServerConnection extends org.apache.http.impl.AbstractHttpServerConnection implements org.apache.http.HttpInetConnection {
    ctor public SocketHttpServerConnection();
    method protected void assertNotOpen();
    method protected void assertOpen();
    method protected void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void close() throws java.io.IOException;
    method protected org.apache.http.io.SessionInputBuffer createHttpDataReceiver(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method protected org.apache.http.io.SessionOutputBuffer createHttpDataTransmitter(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method public java.net.InetAddress getRemoteAddress();
    method public int getRemotePort();
    method protected java.net.Socket getSocket();
    method public int getSocketTimeout();
    method public boolean isOpen();
    method public void setSocketTimeout(int);
    method public void shutdown() throws java.io.IOException;
  }

}

package org.apache.http.impl.auth {

  public abstract class AuthSchemeBase implements org.apache.http.auth.AuthScheme {
    ctor public AuthSchemeBase();
    method public boolean isProxy();
    method protected abstract void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
    method public void processChallenge(org.apache.http.Header) throws org.apache.http.auth.MalformedChallengeException;
  }

  public class BasicScheme extends org.apache.http.impl.auth.RFC2617Scheme {
    ctor public BasicScheme();
    method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
    method public static org.apache.http.Header authenticate(org.apache.http.auth.Credentials, String, boolean);
    method public String getSchemeName();
    method public boolean isComplete();
    method public boolean isConnectionBased();
  }

  public class BasicSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
    ctor public BasicSchemeFactory();
    method public org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
  }

  public class DigestScheme extends org.apache.http.impl.auth.RFC2617Scheme {
    ctor public DigestScheme();
    method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
    method public static String createCnonce();
    method public String getSchemeName();
    method public boolean isComplete();
    method public boolean isConnectionBased();
    method public void overrideParamter(String, String);
  }

  public class DigestSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
    ctor public DigestSchemeFactory();
    method public org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
  }

  public interface NTLMEngine {
    method public String generateType1Msg(String, String) throws org.apache.http.impl.auth.NTLMEngineException;
    method public String generateType3Msg(String, String, String, String, String) throws org.apache.http.impl.auth.NTLMEngineException;
  }

  public class NTLMEngineException extends org.apache.http.auth.AuthenticationException {
    ctor public NTLMEngineException();
    ctor public NTLMEngineException(String);
    ctor public NTLMEngineException(String, Throwable);
  }

  public class NTLMScheme extends org.apache.http.impl.auth.AuthSchemeBase {
    ctor public NTLMScheme(org.apache.http.impl.auth.NTLMEngine);
    method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
    method public String getParameter(String);
    method public String getRealm();
    method public String getSchemeName();
    method public boolean isComplete();
    method public boolean isConnectionBased();
    method protected void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
  }

  public abstract class RFC2617Scheme extends org.apache.http.impl.auth.AuthSchemeBase {
    ctor public RFC2617Scheme();
    method public String getParameter(String);
    method protected java.util.Map<java.lang.String,java.lang.String> getParameters();
    method public String getRealm();
    method protected void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
  }

  public class UnsupportedDigestAlgorithmException extends java.lang.RuntimeException {
    ctor public UnsupportedDigestAlgorithmException();
    ctor public UnsupportedDigestAlgorithmException(String);
    ctor public UnsupportedDigestAlgorithmException(String, Throwable);
  }

}

package org.apache.http.impl.client {

  public abstract class AbstractAuthenticationHandler implements org.apache.http.client.AuthenticationHandler {
    ctor public AbstractAuthenticationHandler();
    method protected java.util.List<java.lang.String> getAuthPreferences();
    method protected java.util.Map<java.lang.String,org.apache.http.Header> parseChallenges(org.apache.http.Header[]) throws org.apache.http.auth.MalformedChallengeException;
    method public org.apache.http.auth.AuthScheme selectScheme(java.util.Map<java.lang.String,org.apache.http.Header>, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.AuthenticationException;
  }

  public abstract class AbstractHttpClient implements org.apache.http.client.HttpClient {
    ctor protected AbstractHttpClient(org.apache.http.conn.ClientConnectionManager, org.apache.http.params.HttpParams);
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor);
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor, int);
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor);
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor, int);
    method public void clearRequestInterceptors();
    method public void clearResponseInterceptors();
    method protected abstract org.apache.http.auth.AuthSchemeRegistry createAuthSchemeRegistry();
    method protected abstract org.apache.http.conn.ClientConnectionManager createClientConnectionManager();
    method protected org.apache.http.client.RequestDirector createClientRequestDirector(org.apache.http.protocol.HttpRequestExecutor, org.apache.http.conn.ClientConnectionManager, org.apache.http.ConnectionReuseStrategy, org.apache.http.conn.ConnectionKeepAliveStrategy, org.apache.http.conn.routing.HttpRoutePlanner, org.apache.http.protocol.HttpProcessor, org.apache.http.client.HttpRequestRetryHandler, org.apache.http.client.RedirectHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.UserTokenHandler, org.apache.http.params.HttpParams);
    method protected abstract org.apache.http.conn.ConnectionKeepAliveStrategy createConnectionKeepAliveStrategy();
    method protected abstract org.apache.http.ConnectionReuseStrategy createConnectionReuseStrategy();
    method protected abstract org.apache.http.cookie.CookieSpecRegistry createCookieSpecRegistry();
    method protected abstract org.apache.http.client.CookieStore createCookieStore();
    method protected abstract org.apache.http.client.CredentialsProvider createCredentialsProvider();
    method protected abstract org.apache.http.protocol.HttpContext createHttpContext();
    method protected abstract org.apache.http.params.HttpParams createHttpParams();
    method protected abstract org.apache.http.protocol.BasicHttpProcessor createHttpProcessor();
    method protected abstract org.apache.http.client.HttpRequestRetryHandler createHttpRequestRetryHandler();
    method protected abstract org.apache.http.conn.routing.HttpRoutePlanner createHttpRoutePlanner();
    method protected abstract org.apache.http.client.AuthenticationHandler createProxyAuthenticationHandler();
    method protected abstract org.apache.http.client.RedirectHandler createRedirectHandler();
    method protected abstract org.apache.http.protocol.HttpRequestExecutor createRequestExecutor();
    method protected abstract org.apache.http.client.AuthenticationHandler createTargetAuthenticationHandler();
    method protected abstract org.apache.http.client.UserTokenHandler createUserTokenHandler();
    method protected org.apache.http.params.HttpParams determineParams(org.apache.http.HttpRequest);
    method public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public final org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public final org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.client.ResponseHandler<? extends T>) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.client.ResponseHandler<? extends T>, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.client.ResponseHandler<? extends T>) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public <T> T execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.client.ResponseHandler<? extends T>, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
    method public final org.apache.http.auth.AuthSchemeRegistry getAuthSchemes();
    method public final org.apache.http.conn.ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy();
    method public final org.apache.http.conn.ClientConnectionManager getConnectionManager();
    method public final org.apache.http.ConnectionReuseStrategy getConnectionReuseStrategy();
    method public final org.apache.http.cookie.CookieSpecRegistry getCookieSpecs();
    method public final org.apache.http.client.CookieStore getCookieStore();
    method public final org.apache.http.client.CredentialsProvider getCredentialsProvider();
    method protected final org.apache.http.protocol.BasicHttpProcessor getHttpProcessor();
    method public final org.apache.http.client.HttpRequestRetryHandler getHttpRequestRetryHandler();
    method public final org.apache.http.params.HttpParams getParams();
    method public final org.apache.http.client.AuthenticationHandler getProxyAuthenticationHandler();
    method public final org.apache.http.client.RedirectHandler getRedirectHandler();
    method public final org.apache.http.protocol.HttpRequestExecutor getRequestExecutor();
    method public org.apache.http.HttpRequestInterceptor getRequestInterceptor(int);
    method public int getRequestInterceptorCount();
    method public org.apache.http.HttpResponseInterceptor getResponseInterceptor(int);
    method public int getResponseInterceptorCount();
    method public final org.apache.http.conn.routing.HttpRoutePlanner getRoutePlanner();
    method public final org.apache.http.client.AuthenticationHandler getTargetAuthenticationHandler();
    method public final org.apache.http.client.UserTokenHandler getUserTokenHandler();
    method public void removeRequestInterceptorByClass(Class<? extends org.apache.http.HttpRequestInterceptor>);
    method public void removeResponseInterceptorByClass(Class<? extends org.apache.http.HttpResponseInterceptor>);
    method public void setAuthSchemes(org.apache.http.auth.AuthSchemeRegistry);
    method public void setCookieSpecs(org.apache.http.cookie.CookieSpecRegistry);
    method public void setCookieStore(org.apache.http.client.CookieStore);
    method public void setCredentialsProvider(org.apache.http.client.CredentialsProvider);
    method public void setHttpRequestRetryHandler(org.apache.http.client.HttpRequestRetryHandler);
    method public void setKeepAliveStrategy(org.apache.http.conn.ConnectionKeepAliveStrategy);
    method public void setParams(org.apache.http.params.HttpParams);
    method public void setProxyAuthenticationHandler(org.apache.http.client.AuthenticationHandler);
    method public void setRedirectHandler(org.apache.http.client.RedirectHandler);
    method public void setReuseStrategy(org.apache.http.ConnectionReuseStrategy);
    method public void setRoutePlanner(org.apache.http.conn.routing.HttpRoutePlanner);
    method public void setTargetAuthenticationHandler(org.apache.http.client.AuthenticationHandler);
    method public void setUserTokenHandler(org.apache.http.client.UserTokenHandler);
  }

  public class BasicCookieStore implements org.apache.http.client.CookieStore {
    ctor public BasicCookieStore();
    method public void addCookie(org.apache.http.cookie.Cookie);
    method public void addCookies(org.apache.http.cookie.Cookie[]);
    method public void clear();
    method public boolean clearExpired(java.util.Date);
    method public java.util.List<org.apache.http.cookie.Cookie> getCookies();
  }

  public class BasicCredentialsProvider implements org.apache.http.client.CredentialsProvider {
    ctor public BasicCredentialsProvider();
    method public void clear();
    method public org.apache.http.auth.Credentials getCredentials(org.apache.http.auth.AuthScope);
    method public void setCredentials(org.apache.http.auth.AuthScope, org.apache.http.auth.Credentials);
  }

  public class BasicResponseHandler implements org.apache.http.client.ResponseHandler<java.lang.String> {
    ctor public BasicResponseHandler();
    method public String handleResponse(org.apache.http.HttpResponse) throws org.apache.http.client.HttpResponseException, java.io.IOException;
  }

  public class ClientParamsStack extends org.apache.http.params.AbstractHttpParams {
    ctor public ClientParamsStack(org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
    ctor public ClientParamsStack(org.apache.http.impl.client.ClientParamsStack);
    ctor public ClientParamsStack(org.apache.http.impl.client.ClientParamsStack, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
    method public org.apache.http.params.HttpParams copy();
    method public final org.apache.http.params.HttpParams getApplicationParams();
    method public final org.apache.http.params.HttpParams getClientParams();
    method public final org.apache.http.params.HttpParams getOverrideParams();
    method public Object getParameter(String);
    method public final org.apache.http.params.HttpParams getRequestParams();
    method public boolean removeParameter(String);
    method public org.apache.http.params.HttpParams setParameter(String, Object) throws java.lang.UnsupportedOperationException;
    field protected final org.apache.http.params.HttpParams applicationParams;
    field protected final org.apache.http.params.HttpParams clientParams;
    field protected final org.apache.http.params.HttpParams overrideParams;
    field protected final org.apache.http.params.HttpParams requestParams;
  }

  public class DefaultConnectionKeepAliveStrategy implements org.apache.http.conn.ConnectionKeepAliveStrategy {
    ctor public DefaultConnectionKeepAliveStrategy();
    method public long getKeepAliveDuration(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class DefaultHttpClient extends org.apache.http.impl.client.AbstractHttpClient {
    ctor public DefaultHttpClient(org.apache.http.conn.ClientConnectionManager, org.apache.http.params.HttpParams);
    ctor public DefaultHttpClient(org.apache.http.params.HttpParams);
    ctor public DefaultHttpClient();
    method protected org.apache.http.auth.AuthSchemeRegistry createAuthSchemeRegistry();
    method protected org.apache.http.conn.ClientConnectionManager createClientConnectionManager();
    method protected org.apache.http.conn.ConnectionKeepAliveStrategy createConnectionKeepAliveStrategy();
    method protected org.apache.http.ConnectionReuseStrategy createConnectionReuseStrategy();
    method protected org.apache.http.cookie.CookieSpecRegistry createCookieSpecRegistry();
    method protected org.apache.http.client.CookieStore createCookieStore();
    method protected org.apache.http.client.CredentialsProvider createCredentialsProvider();
    method protected org.apache.http.protocol.HttpContext createHttpContext();
    method protected org.apache.http.params.HttpParams createHttpParams();
    method protected org.apache.http.protocol.BasicHttpProcessor createHttpProcessor();
    method protected org.apache.http.client.HttpRequestRetryHandler createHttpRequestRetryHandler();
    method protected org.apache.http.conn.routing.HttpRoutePlanner createHttpRoutePlanner();
    method protected org.apache.http.client.AuthenticationHandler createProxyAuthenticationHandler();
    method protected org.apache.http.client.RedirectHandler createRedirectHandler();
    method protected org.apache.http.protocol.HttpRequestExecutor createRequestExecutor();
    method protected org.apache.http.client.AuthenticationHandler createTargetAuthenticationHandler();
    method protected org.apache.http.client.UserTokenHandler createUserTokenHandler();
  }

  public class DefaultHttpRequestRetryHandler implements org.apache.http.client.HttpRequestRetryHandler {
    ctor public DefaultHttpRequestRetryHandler(int, boolean);
    ctor public DefaultHttpRequestRetryHandler();
    method public int getRetryCount();
    method public boolean isRequestSentRetryEnabled();
    method public boolean retryRequest(java.io.IOException, int, org.apache.http.protocol.HttpContext);
  }

  public class DefaultProxyAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
    ctor public DefaultProxyAuthenticationHandler();
    method public java.util.Map<java.lang.String,org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
    method public boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class DefaultRedirectHandler implements org.apache.http.client.RedirectHandler {
    ctor public DefaultRedirectHandler();
    method public java.net.URI getLocationURI(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.ProtocolException;
    method public boolean isRedirectRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class DefaultRequestDirector implements org.apache.http.client.RequestDirector {
    ctor public DefaultRequestDirector(org.apache.http.protocol.HttpRequestExecutor, org.apache.http.conn.ClientConnectionManager, org.apache.http.ConnectionReuseStrategy, org.apache.http.conn.ConnectionKeepAliveStrategy, org.apache.http.conn.routing.HttpRoutePlanner, org.apache.http.protocol.HttpProcessor, org.apache.http.client.HttpRequestRetryHandler, org.apache.http.client.RedirectHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.UserTokenHandler, org.apache.http.params.HttpParams);
    method protected org.apache.http.HttpRequest createConnectRequest(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext);
    method protected boolean createTunnelToProxy(org.apache.http.conn.routing.HttpRoute, int, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method protected boolean createTunnelToTarget(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method protected org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
    method protected void establishRoute(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method protected org.apache.http.impl.client.RoutedRequest handleResponse(org.apache.http.impl.client.RoutedRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method protected void releaseConnection();
    method protected void rewriteRequestURI(org.apache.http.impl.client.RequestWrapper, org.apache.http.conn.routing.HttpRoute) throws org.apache.http.ProtocolException;
    field protected final org.apache.http.conn.ClientConnectionManager connManager;
    field protected final org.apache.http.protocol.HttpProcessor httpProcessor;
    field protected final org.apache.http.conn.ConnectionKeepAliveStrategy keepAliveStrategy;
    field protected org.apache.http.conn.ManagedClientConnection managedConn;
    field protected final org.apache.http.params.HttpParams params;
    field protected final org.apache.http.client.RedirectHandler redirectHandler;
    field protected final org.apache.http.protocol.HttpRequestExecutor requestExec;
    field protected final org.apache.http.client.HttpRequestRetryHandler retryHandler;
    field protected final org.apache.http.ConnectionReuseStrategy reuseStrategy;
    field protected final org.apache.http.conn.routing.HttpRoutePlanner routePlanner;
  }

  public class DefaultTargetAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
    ctor public DefaultTargetAuthenticationHandler();
    method public java.util.Map<java.lang.String,org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
    method public boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
  }

  public class DefaultUserTokenHandler implements org.apache.http.client.UserTokenHandler {
    ctor public DefaultUserTokenHandler();
    method public Object getUserToken(org.apache.http.protocol.HttpContext);
  }

  public class EntityEnclosingRequestWrapper extends org.apache.http.impl.client.RequestWrapper implements org.apache.http.HttpEntityEnclosingRequest {
    ctor public EntityEnclosingRequestWrapper(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.ProtocolException;
    method public boolean expectContinue();
    method public org.apache.http.HttpEntity getEntity();
    method public void setEntity(org.apache.http.HttpEntity);
  }

  public class RedirectLocations {
    ctor public RedirectLocations();
    method public void add(java.net.URI);
    method public boolean contains(java.net.URI);
    method public boolean remove(java.net.URI);
  }

  public class RequestWrapper extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.HttpUriRequest {
    ctor public RequestWrapper(org.apache.http.HttpRequest) throws org.apache.http.ProtocolException;
    method public void abort() throws java.lang.UnsupportedOperationException;
    method public int getExecCount();
    method public String getMethod();
    method public org.apache.http.HttpRequest getOriginal();
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public org.apache.http.RequestLine getRequestLine();
    method public java.net.URI getURI();
    method public void incrementExecCount();
    method public boolean isAborted();
    method public boolean isRepeatable();
    method public void resetHeaders();
    method public void setMethod(String);
    method public void setProtocolVersion(org.apache.http.ProtocolVersion);
    method public void setURI(java.net.URI);
  }

  public class RoutedRequest {
    ctor public RoutedRequest(org.apache.http.impl.client.RequestWrapper, org.apache.http.conn.routing.HttpRoute);
    method public final org.apache.http.impl.client.RequestWrapper getRequest();
    method public final org.apache.http.conn.routing.HttpRoute getRoute();
    field protected final org.apache.http.impl.client.RequestWrapper request;
    field protected final org.apache.http.conn.routing.HttpRoute route;
  }

  public class TunnelRefusedException extends org.apache.http.HttpException {
    ctor public TunnelRefusedException(String, org.apache.http.HttpResponse);
    method public org.apache.http.HttpResponse getResponse();
  }

}

package org.apache.http.impl.conn {

  public abstract class AbstractClientConnAdapter implements org.apache.http.conn.ManagedClientConnection {
    ctor protected AbstractClientConnAdapter(org.apache.http.conn.ClientConnectionManager, org.apache.http.conn.OperatedClientConnection);
    method public void abortConnection();
    method protected final void assertNotAborted() throws java.io.InterruptedIOException;
    method protected final void assertValid(org.apache.http.conn.OperatedClientConnection);
    method protected void detach();
    method public void flush() throws java.io.IOException;
    method public java.net.InetAddress getLocalAddress();
    method public int getLocalPort();
    method protected org.apache.http.conn.ClientConnectionManager getManager();
    method public org.apache.http.HttpConnectionMetrics getMetrics();
    method public java.net.InetAddress getRemoteAddress();
    method public int getRemotePort();
    method public javax.net.ssl.SSLSession getSSLSession();
    method public int getSocketTimeout();
    method protected org.apache.http.conn.OperatedClientConnection getWrappedConnection();
    method public boolean isMarkedReusable();
    method public boolean isOpen();
    method public boolean isResponseAvailable(int) throws java.io.IOException;
    method public boolean isSecure();
    method public boolean isStale();
    method public void markReusable();
    method public void receiveResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpResponse receiveResponseHeader() throws org.apache.http.HttpException, java.io.IOException;
    method public void releaseConnection();
    method public void sendRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public void sendRequestHeader(org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException;
    method public void setIdleDuration(long, java.util.concurrent.TimeUnit);
    method public void setSocketTimeout(int);
    method public void unmarkReusable();
  }

  public abstract class AbstractPoolEntry {
    ctor protected AbstractPoolEntry(org.apache.http.conn.ClientConnectionOperator, org.apache.http.conn.routing.HttpRoute);
    method public Object getState();
    method public void layerProtocol(org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void open(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void setState(Object);
    method protected void shutdownEntry();
    method public void tunnelProxy(org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void tunnelTarget(boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    field protected final org.apache.http.conn.ClientConnectionOperator connOperator;
    field protected final org.apache.http.conn.OperatedClientConnection connection;
    field protected volatile org.apache.http.conn.routing.HttpRoute route;
    field protected volatile Object state;
    field protected volatile org.apache.http.conn.routing.RouteTracker tracker;
  }

  public abstract class AbstractPooledConnAdapter extends org.apache.http.impl.conn.AbstractClientConnAdapter {
    ctor protected AbstractPooledConnAdapter(org.apache.http.conn.ClientConnectionManager, org.apache.http.impl.conn.AbstractPoolEntry);
    method protected final void assertAttached();
    method public void close() throws java.io.IOException;
    method public org.apache.http.conn.routing.HttpRoute getRoute();
    method public Object getState();
    method public void layerProtocol(org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void open(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void setState(Object);
    method public void shutdown() throws java.io.IOException;
    method public void tunnelProxy(org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void tunnelTarget(boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    field protected volatile org.apache.http.impl.conn.AbstractPoolEntry poolEntry;
  }

  public class DefaultClientConnection extends org.apache.http.impl.SocketHttpClientConnection implements org.apache.http.conn.OperatedClientConnection {
    ctor public DefaultClientConnection();
    method public final java.net.Socket getSocket();
    method public final org.apache.http.HttpHost getTargetHost();
    method public final boolean isSecure();
    method public void openCompleted(boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void opening(java.net.Socket, org.apache.http.HttpHost) throws java.io.IOException;
    method public void update(java.net.Socket, org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

  public class DefaultClientConnectionOperator implements org.apache.http.conn.ClientConnectionOperator {
    ctor public DefaultClientConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry);
    method public org.apache.http.conn.OperatedClientConnection createConnection();
    method public void openConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method protected void prepareSocket(java.net.Socket, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public void updateSecureConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
    field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
  }

  public class DefaultHttpRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
    ctor public DefaultHttpRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry);
    method public org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
    field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
  }

  public class DefaultResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
    ctor public DefaultResponseParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpResponseFactory, org.apache.http.params.HttpParams);
    method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class IdleConnectionHandler {
    ctor public IdleConnectionHandler();
    method public void add(org.apache.http.HttpConnection, long, java.util.concurrent.TimeUnit);
    method public void closeExpiredConnections();
    method public void closeIdleConnections(long);
    method public boolean remove(org.apache.http.HttpConnection);
    method public void removeAll();
  }

  public class LoggingSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
    ctor public LoggingSessionInputBuffer(org.apache.http.io.SessionInputBuffer, org.apache.http.impl.conn.Wire);
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method public boolean isDataAvailable(int) throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
    method public int readLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
  }

  public class LoggingSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
    ctor public LoggingSessionOutputBuffer(org.apache.http.io.SessionOutputBuffer, org.apache.http.impl.conn.Wire);
    method public void flush() throws java.io.IOException;
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method public void write(byte[], int, int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void write(byte[]) throws java.io.IOException;
    method public void writeLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
    method public void writeLine(String) throws java.io.IOException;
  }

  public class ProxySelectorRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
    ctor public ProxySelectorRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry, java.net.ProxySelector);
    method protected java.net.Proxy chooseProxy(java.util.List<java.net.Proxy>, org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext);
    method protected org.apache.http.HttpHost determineProxy(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
    method public org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
    method protected String getHost(java.net.InetSocketAddress);
    method public java.net.ProxySelector getProxySelector();
    method public void setProxySelector(java.net.ProxySelector);
    field protected java.net.ProxySelector proxySelector;
    field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
  }

  public class SingleClientConnManager implements org.apache.http.conn.ClientConnectionManager {
    ctor public SingleClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
    method protected final void assertStillUp() throws java.lang.IllegalStateException;
    method public void closeExpiredConnections();
    method public void closeIdleConnections(long, java.util.concurrent.TimeUnit);
    method protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry);
    method public org.apache.http.conn.ManagedClientConnection getConnection(org.apache.http.conn.routing.HttpRoute, Object);
    method public org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry();
    method public void releaseConnection(org.apache.http.conn.ManagedClientConnection, long, java.util.concurrent.TimeUnit);
    method public final org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, Object);
    method protected void revokeConnection();
    method public void shutdown();
    field public static final String MISUSE_MESSAGE = "Invalid use of SingleClientConnManager: connection still allocated.\nMake sure to release the connection before allocating another one.";
    field protected boolean alwaysShutDown;
    field protected org.apache.http.conn.ClientConnectionOperator connOperator;
    field protected long connectionExpiresTime;
    field protected volatile boolean isShutDown;
    field protected long lastReleaseTime;
    field protected org.apache.http.impl.conn.SingleClientConnManager.ConnAdapter managedConn;
    field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
    field protected org.apache.http.impl.conn.SingleClientConnManager.PoolEntry uniquePoolEntry;
  }

  protected class SingleClientConnManager.ConnAdapter extends org.apache.http.impl.conn.AbstractPooledConnAdapter {
    ctor protected SingleClientConnManager.ConnAdapter(org.apache.http.impl.conn.SingleClientConnManager.PoolEntry, org.apache.http.conn.routing.HttpRoute);
  }

  protected class SingleClientConnManager.PoolEntry extends org.apache.http.impl.conn.AbstractPoolEntry {
    ctor protected SingleClientConnManager.PoolEntry();
    method protected void close() throws java.io.IOException;
    method protected void shutdown() throws java.io.IOException;
  }

  public class Wire {
    ctor public Wire(org.apache.commons.logging.Log);
    method public boolean enabled();
    method public void input(java.io.InputStream) throws java.io.IOException;
    method public void input(byte[], int, int) throws java.io.IOException;
    method public void input(byte[]) throws java.io.IOException;
    method public void input(int) throws java.io.IOException;
    method public void input(String) throws java.io.IOException;
    method public void output(java.io.InputStream) throws java.io.IOException;
    method public void output(byte[], int, int) throws java.io.IOException;
    method public void output(byte[]) throws java.io.IOException;
    method public void output(int) throws java.io.IOException;
    method public void output(String) throws java.io.IOException;
  }

}

package org.apache.http.impl.conn.tsccm {

  public abstract class AbstractConnPool implements org.apache.http.impl.conn.tsccm.RefQueueHandler {
    ctor protected AbstractConnPool();
    method protected void closeConnection(org.apache.http.conn.OperatedClientConnection);
    method public void closeExpiredConnections();
    method public void closeIdleConnections(long, java.util.concurrent.TimeUnit);
    method public abstract void deleteClosedConnections();
    method public void enableConnectionGC() throws java.lang.IllegalStateException;
    method public abstract void freeEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry, boolean, long, java.util.concurrent.TimeUnit);
    method public final org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntry(org.apache.http.conn.routing.HttpRoute, Object, long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
    method protected abstract void handleLostEntry(org.apache.http.conn.routing.HttpRoute);
    method public void handleReference(java.lang.ref.Reference);
    method public abstract org.apache.http.impl.conn.tsccm.PoolEntryRequest requestPoolEntry(org.apache.http.conn.routing.HttpRoute, Object);
    method public void shutdown();
    field protected org.apache.http.impl.conn.IdleConnectionHandler idleConnHandler;
    field protected volatile boolean isShutDown;
    field protected java.util.Set<org.apache.http.impl.conn.tsccm.BasicPoolEntryRef> issuedConnections;
    field protected int numConnections;
    field protected final java.util.concurrent.locks.Lock poolLock;
    field protected java.lang.ref.ReferenceQueue<java.lang.Object> refQueue;
  }

  public class BasicPoolEntry extends org.apache.http.impl.conn.AbstractPoolEntry {
    ctor public BasicPoolEntry(org.apache.http.conn.ClientConnectionOperator, org.apache.http.conn.routing.HttpRoute, java.lang.ref.ReferenceQueue<java.lang.Object>);
    method protected final org.apache.http.conn.OperatedClientConnection getConnection();
    method protected final org.apache.http.conn.routing.HttpRoute getPlannedRoute();
    method protected final org.apache.http.impl.conn.tsccm.BasicPoolEntryRef getWeakRef();
  }

  public class BasicPoolEntryRef extends java.lang.ref.WeakReference<org.apache.http.impl.conn.tsccm.BasicPoolEntry> {
    ctor public BasicPoolEntryRef(org.apache.http.impl.conn.tsccm.BasicPoolEntry, java.lang.ref.ReferenceQueue<java.lang.Object>);
    method public final org.apache.http.conn.routing.HttpRoute getRoute();
  }

  public class BasicPooledConnAdapter extends org.apache.http.impl.conn.AbstractPooledConnAdapter {
    ctor protected BasicPooledConnAdapter(org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager, org.apache.http.impl.conn.AbstractPoolEntry);
    method protected org.apache.http.impl.conn.AbstractPoolEntry getPoolEntry();
  }

  public class ConnPoolByRoute extends org.apache.http.impl.conn.tsccm.AbstractConnPool {
    ctor public ConnPoolByRoute(org.apache.http.conn.ClientConnectionOperator, org.apache.http.params.HttpParams);
    method protected org.apache.http.impl.conn.tsccm.BasicPoolEntry createEntry(org.apache.http.impl.conn.tsccm.RouteSpecificPool, org.apache.http.conn.ClientConnectionOperator);
    method protected java.util.Queue<org.apache.http.impl.conn.tsccm.BasicPoolEntry> createFreeConnQueue();
    method protected java.util.Map<org.apache.http.conn.routing.HttpRoute,org.apache.http.impl.conn.tsccm.RouteSpecificPool> createRouteToPoolMap();
    method protected java.util.Queue<org.apache.http.impl.conn.tsccm.WaitingThread> createWaitingThreadQueue();
    method public void deleteClosedConnections();
    method protected void deleteEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry);
    method protected void deleteLeastUsedEntry();
    method public void freeEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry, boolean, long, java.util.concurrent.TimeUnit);
    method public int getConnectionsInPool(org.apache.http.conn.routing.HttpRoute);
    method protected org.apache.http.impl.conn.tsccm.BasicPoolEntry getEntryBlocking(org.apache.http.conn.routing.HttpRoute, Object, long, java.util.concurrent.TimeUnit, org.apache.http.impl.conn.tsccm.WaitingThreadAborter) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
    method protected org.apache.http.impl.conn.tsccm.BasicPoolEntry getFreeEntry(org.apache.http.impl.conn.tsccm.RouteSpecificPool, Object);
    method protected org.apache.http.impl.conn.tsccm.RouteSpecificPool getRoutePool(org.apache.http.conn.routing.HttpRoute, boolean);
    method protected void handleLostEntry(org.apache.http.conn.routing.HttpRoute);
    method protected org.apache.http.impl.conn.tsccm.RouteSpecificPool newRouteSpecificPool(org.apache.http.conn.routing.HttpRoute);
    method protected org.apache.http.impl.conn.tsccm.WaitingThread newWaitingThread(java.util.concurrent.locks.Condition, org.apache.http.impl.conn.tsccm.RouteSpecificPool);
    method protected void notifyWaitingThread(org.apache.http.impl.conn.tsccm.RouteSpecificPool);
    method public org.apache.http.impl.conn.tsccm.PoolEntryRequest requestPoolEntry(org.apache.http.conn.routing.HttpRoute, Object);
    field protected java.util.Queue<org.apache.http.impl.conn.tsccm.BasicPoolEntry> freeConnections;
    field protected final int maxTotalConnections;
    field protected final org.apache.http.conn.ClientConnectionOperator operator;
    field protected final java.util.Map<org.apache.http.conn.routing.HttpRoute,org.apache.http.impl.conn.tsccm.RouteSpecificPool> routeToPool;
    field protected java.util.Queue<org.apache.http.impl.conn.tsccm.WaitingThread> waitingThreads;
  }

  public interface PoolEntryRequest {
    method public void abortRequest();
    method public org.apache.http.impl.conn.tsccm.BasicPoolEntry getPoolEntry(long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
  }

  public interface RefQueueHandler {
    method public void handleReference(java.lang.ref.Reference<?>);
  }

  public class RefQueueWorker implements java.lang.Runnable {
    ctor public RefQueueWorker(java.lang.ref.ReferenceQueue<?>, org.apache.http.impl.conn.tsccm.RefQueueHandler);
    method public void run();
    method public void shutdown();
    field protected final org.apache.http.impl.conn.tsccm.RefQueueHandler refHandler;
    field protected final java.lang.ref.ReferenceQueue<?> refQueue;
    field protected volatile Thread workerThread;
  }

  public class RouteSpecificPool {
    ctor public RouteSpecificPool(org.apache.http.conn.routing.HttpRoute, int);
    method public org.apache.http.impl.conn.tsccm.BasicPoolEntry allocEntry(Object);
    method public void createdEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry);
    method public boolean deleteEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry);
    method public void dropEntry();
    method public void freeEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry);
    method public int getCapacity();
    method public final int getEntryCount();
    method public final int getMaxEntries();
    method public final org.apache.http.conn.routing.HttpRoute getRoute();
    method public boolean hasThread();
    method public boolean isUnused();
    method public org.apache.http.impl.conn.tsccm.WaitingThread nextThread();
    method public void queueThread(org.apache.http.impl.conn.tsccm.WaitingThread);
    method public void removeThread(org.apache.http.impl.conn.tsccm.WaitingThread);
    field protected final java.util.LinkedList<org.apache.http.impl.conn.tsccm.BasicPoolEntry> freeEntries;
    field protected final int maxEntries;
    field protected int numEntries;
    field protected final org.apache.http.conn.routing.HttpRoute route;
    field protected final java.util.Queue<org.apache.http.impl.conn.tsccm.WaitingThread> waitingThreads;
  }

  public class ThreadSafeClientConnManager implements org.apache.http.conn.ClientConnectionManager {
    ctor public ThreadSafeClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
    method public void closeExpiredConnections();
    method public void closeIdleConnections(long, java.util.concurrent.TimeUnit);
    method protected org.apache.http.conn.ClientConnectionOperator createConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry);
    method protected org.apache.http.impl.conn.tsccm.AbstractConnPool createConnectionPool(org.apache.http.params.HttpParams);
    method public int getConnectionsInPool(org.apache.http.conn.routing.HttpRoute);
    method public int getConnectionsInPool();
    method public org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry();
    method public void releaseConnection(org.apache.http.conn.ManagedClientConnection, long, java.util.concurrent.TimeUnit);
    method public org.apache.http.conn.ClientConnectionRequest requestConnection(org.apache.http.conn.routing.HttpRoute, Object);
    method public void shutdown();
    field protected org.apache.http.conn.ClientConnectionOperator connOperator;
    field protected final org.apache.http.impl.conn.tsccm.AbstractConnPool connectionPool;
    field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
  }

  public class WaitingThread {
    ctor public WaitingThread(java.util.concurrent.locks.Condition, org.apache.http.impl.conn.tsccm.RouteSpecificPool);
    method public boolean await(java.util.Date) throws java.lang.InterruptedException;
    method public final java.util.concurrent.locks.Condition getCondition();
    method public final org.apache.http.impl.conn.tsccm.RouteSpecificPool getPool();
    method public final Thread getThread();
    method public void interrupt();
    method public void wakeup();
  }

  public class WaitingThreadAborter {
    ctor public WaitingThreadAborter();
    method public void abort();
    method public void setWaitingThread(org.apache.http.impl.conn.tsccm.WaitingThread);
  }

}

package org.apache.http.impl.cookie {

  public abstract class AbstractCookieAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public AbstractCookieAttributeHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public abstract class AbstractCookieSpec implements org.apache.http.cookie.CookieSpec {
    ctor public AbstractCookieSpec();
    method protected org.apache.http.cookie.CookieAttributeHandler findAttribHandler(String);
    method protected org.apache.http.cookie.CookieAttributeHandler getAttribHandler(String);
    method protected java.util.Collection<org.apache.http.cookie.CookieAttributeHandler> getAttribHandlers();
    method public void registerAttribHandler(String, org.apache.http.cookie.CookieAttributeHandler);
  }

  public class BasicClientCookie implements org.apache.http.cookie.ClientCookie java.lang.Cloneable org.apache.http.cookie.SetCookie {
    ctor public BasicClientCookie(String, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public boolean containsAttribute(String);
    method public String getAttribute(String);
    method public String getComment();
    method public String getCommentURL();
    method public String getDomain();
    method public java.util.Date getExpiryDate();
    method public String getName();
    method public String getPath();
    method public int[] getPorts();
    method public String getValue();
    method public int getVersion();
    method public boolean isExpired(java.util.Date);
    method public boolean isPersistent();
    method public boolean isSecure();
    method public void setAttribute(String, String);
    method public void setComment(String);
    method public void setDomain(String);
    method public void setExpiryDate(java.util.Date);
    method public void setPath(String);
    method public void setSecure(boolean);
    method public void setValue(String);
    method public void setVersion(int);
  }

  public class BasicClientCookie2 extends org.apache.http.impl.cookie.BasicClientCookie implements org.apache.http.cookie.SetCookie2 {
    ctor public BasicClientCookie2(String, String);
    method public void setCommentURL(String);
    method public void setDiscard(boolean);
    method public void setPorts(int[]);
  }

  public class BasicCommentHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
    ctor public BasicCommentHandler();
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BasicDomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public BasicDomainHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BasicExpiresHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
    ctor public BasicExpiresHandler(String[]);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BasicMaxAgeHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
    ctor public BasicMaxAgeHandler();
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BasicPathHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public BasicPathHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BasicSecureHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
    ctor public BasicSecureHandler();
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BestMatchSpec implements org.apache.http.cookie.CookieSpec {
    ctor public BestMatchSpec(String[], boolean);
    ctor public BestMatchSpec();
    method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
    method public int getVersion();
    method public org.apache.http.Header getVersionHeader();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class BestMatchSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
    ctor public BestMatchSpecFactory();
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public class BrowserCompatSpec extends org.apache.http.impl.cookie.CookieSpecBase {
    ctor public BrowserCompatSpec(String[]);
    ctor public BrowserCompatSpec();
    method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
    method public int getVersion();
    method public org.apache.http.Header getVersionHeader();
    method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
    field protected static final String[] DATE_PATTERNS;
  }

  public class BrowserCompatSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
    ctor public BrowserCompatSpecFactory();
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public abstract class CookieSpecBase extends org.apache.http.impl.cookie.AbstractCookieSpec {
    ctor public CookieSpecBase();
    method protected static String getDefaultDomain(org.apache.http.cookie.CookieOrigin);
    method protected static String getDefaultPath(org.apache.http.cookie.CookieOrigin);
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method protected java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.HeaderElement[], org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class DateParseException extends java.lang.Exception {
    ctor public DateParseException();
    ctor public DateParseException(String);
  }

  public final class DateUtils {
    method public static String formatDate(java.util.Date);
    method public static String formatDate(java.util.Date, String);
    method public static java.util.Date parseDate(String) throws org.apache.http.impl.cookie.DateParseException;
    method public static java.util.Date parseDate(String, String[]) throws org.apache.http.impl.cookie.DateParseException;
    method public static java.util.Date parseDate(String, String[], java.util.Date) throws org.apache.http.impl.cookie.DateParseException;
    field public static final java.util.TimeZone GMT;
    field public static final String PATTERN_ASCTIME = "EEE MMM d HH:mm:ss yyyy";
    field public static final String PATTERN_RFC1036 = "EEEE, dd-MMM-yy HH:mm:ss zzz";
    field public static final String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
  }

  public class NetscapeDomainHandler extends org.apache.http.impl.cookie.BasicDomainHandler {
    ctor public NetscapeDomainHandler();
  }

  public class NetscapeDraftHeaderParser {
    ctor public NetscapeDraftHeaderParser();
    method public org.apache.http.HeaderElement parseHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    field public static final org.apache.http.impl.cookie.NetscapeDraftHeaderParser DEFAULT;
  }

  public class NetscapeDraftSpec extends org.apache.http.impl.cookie.CookieSpecBase {
    ctor public NetscapeDraftSpec(String[]);
    ctor public NetscapeDraftSpec();
    method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
    method public int getVersion();
    method public org.apache.http.Header getVersionHeader();
    method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
    field protected static final String EXPIRES_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";
  }

  public class NetscapeDraftSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
    ctor public NetscapeDraftSpecFactory();
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public class RFC2109DomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2109DomainHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2109Spec extends org.apache.http.impl.cookie.CookieSpecBase {
    ctor public RFC2109Spec(String[], boolean);
    ctor public RFC2109Spec();
    method protected void formatCookieAsVer(org.apache.http.util.CharArrayBuffer, org.apache.http.cookie.Cookie, int);
    method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
    method protected void formatParamAsVer(org.apache.http.util.CharArrayBuffer, String, String, int);
    method public int getVersion();
    method public org.apache.http.Header getVersionHeader();
    method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2109SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
    ctor public RFC2109SpecFactory();
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public class RFC2109VersionHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
    ctor public RFC2109VersionHandler();
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2965CommentUrlAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2965CommentUrlAttributeHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2965DiscardAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2965DiscardAttributeHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2965DomainAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2965DomainAttributeHandler();
    method public boolean domainMatch(String, String);
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2965PortAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2965PortAttributeHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

  public class RFC2965Spec extends org.apache.http.impl.cookie.RFC2109Spec {
    ctor public RFC2965Spec();
    ctor public RFC2965Spec(String[], boolean);
  }

  public class RFC2965SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
    ctor public RFC2965SpecFactory();
    method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
  }

  public class RFC2965VersionAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
    ctor public RFC2965VersionAttributeHandler();
    method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
    method public void parse(org.apache.http.cookie.SetCookie, String) throws org.apache.http.cookie.MalformedCookieException;
    method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
  }

}

package org.apache.http.impl.entity {

  public class EntityDeserializer {
    ctor public EntityDeserializer(org.apache.http.entity.ContentLengthStrategy);
    method public org.apache.http.HttpEntity deserialize(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
    method protected org.apache.http.entity.BasicHttpEntity doDeserialize(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class EntitySerializer {
    ctor public EntitySerializer(org.apache.http.entity.ContentLengthStrategy);
    method protected java.io.OutputStream doSerialize(org.apache.http.io.SessionOutputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
    method public void serialize(org.apache.http.io.SessionOutputBuffer, org.apache.http.HttpMessage, org.apache.http.HttpEntity) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class LaxContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
    ctor public LaxContentLengthStrategy();
    method public long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
  }

  public class StrictContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
    ctor public StrictContentLengthStrategy();
    method public long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
  }

}

package org.apache.http.impl.io {

  public abstract class AbstractMessageParser implements org.apache.http.io.HttpMessageParser {
    ctor public AbstractMessageParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.params.HttpParams);
    method public org.apache.http.HttpMessage parse() throws org.apache.http.HttpException, java.io.IOException;
    method protected abstract org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
    method public static org.apache.http.Header[] parseHeaders(org.apache.http.io.SessionInputBuffer, int, int, org.apache.http.message.LineParser) throws org.apache.http.HttpException, java.io.IOException;
    field protected final org.apache.http.message.LineParser lineParser;
  }

  public abstract class AbstractMessageWriter implements org.apache.http.io.HttpMessageWriter {
    ctor public AbstractMessageWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
    method public void write(org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
    method protected abstract void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
    field protected final org.apache.http.util.CharArrayBuffer lineBuf;
    field protected final org.apache.http.message.LineFormatter lineFormatter;
    field protected final org.apache.http.io.SessionOutputBuffer sessionBuffer;
  }

  public abstract class AbstractSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
    ctor public AbstractSessionInputBuffer();
    method protected int fillBuffer() throws java.io.IOException;
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method protected boolean hasBufferedData();
    method protected void init(java.io.InputStream, int, org.apache.http.params.HttpParams);
    method public int read() throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public int readLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
  }

  public abstract class AbstractSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
    ctor public AbstractSessionOutputBuffer();
    method public void flush() throws java.io.IOException;
    method protected void flushBuffer() throws java.io.IOException;
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method protected void init(java.io.OutputStream, int, org.apache.http.params.HttpParams);
    method public void write(byte[], int, int) throws java.io.IOException;
    method public void write(byte[]) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void writeLine(String) throws java.io.IOException;
    method public void writeLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
  }

  public class ChunkedInputStream extends java.io.InputStream {
    ctor public ChunkedInputStream(org.apache.http.io.SessionInputBuffer);
    method public org.apache.http.Header[] getFooters();
    method public int read() throws java.io.IOException;
  }

  public class ChunkedOutputStream extends java.io.OutputStream {
    ctor public ChunkedOutputStream(org.apache.http.io.SessionOutputBuffer, int) throws java.io.IOException;
    ctor public ChunkedOutputStream(org.apache.http.io.SessionOutputBuffer) throws java.io.IOException;
    method public void finish() throws java.io.IOException;
    method protected void flushCache() throws java.io.IOException;
    method protected void flushCacheWithAppend(byte[], int, int) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method protected void writeClosingChunk() throws java.io.IOException;
  }

  public class ContentLengthInputStream extends java.io.InputStream {
    ctor public ContentLengthInputStream(org.apache.http.io.SessionInputBuffer, long);
    method public int read() throws java.io.IOException;
  }

  public class ContentLengthOutputStream extends java.io.OutputStream {
    ctor public ContentLengthOutputStream(org.apache.http.io.SessionOutputBuffer, long);
    method public void write(int) throws java.io.IOException;
  }

  public class HttpRequestParser extends org.apache.http.impl.io.AbstractMessageParser {
    ctor public HttpRequestParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpRequestFactory, org.apache.http.params.HttpParams);
    method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
  }

  public class HttpRequestWriter extends org.apache.http.impl.io.AbstractMessageWriter {
    ctor public HttpRequestWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
    method protected void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
  }

  public class HttpResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
    ctor public HttpResponseParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpResponseFactory, org.apache.http.params.HttpParams);
    method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
  }

  public class HttpResponseWriter extends org.apache.http.impl.io.AbstractMessageWriter {
    ctor public HttpResponseWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
    method protected void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
  }

  public class HttpTransportMetricsImpl implements org.apache.http.io.HttpTransportMetrics {
    ctor public HttpTransportMetricsImpl();
    method public long getBytesTransferred();
    method public void incrementBytesTransferred(long);
    method public void reset();
    method public void setBytesTransferred(long);
  }

  public class IdentityInputStream extends java.io.InputStream {
    ctor public IdentityInputStream(org.apache.http.io.SessionInputBuffer);
    method public int read() throws java.io.IOException;
  }

  public class IdentityOutputStream extends java.io.OutputStream {
    ctor public IdentityOutputStream(org.apache.http.io.SessionOutputBuffer);
    method public void write(int) throws java.io.IOException;
  }

  public class SocketInputBuffer extends org.apache.http.impl.io.AbstractSessionInputBuffer {
    ctor public SocketInputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
    method public boolean isDataAvailable(int) throws java.io.IOException;
  }

  public class SocketOutputBuffer extends org.apache.http.impl.io.AbstractSessionOutputBuffer {
    ctor public SocketOutputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
  }

}

package org.apache.http.io {

  public interface HttpMessageParser {
    method public org.apache.http.HttpMessage parse() throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpMessageWriter {
    method public void write(org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpTransportMetrics {
    method public long getBytesTransferred();
    method public void reset();
  }

  public interface SessionInputBuffer {
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method public boolean isDataAvailable(int) throws java.io.IOException;
    method public int read(byte[], int, int) throws java.io.IOException;
    method public int read(byte[]) throws java.io.IOException;
    method public int read() throws java.io.IOException;
    method public int readLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
    method public String readLine() throws java.io.IOException;
  }

  public interface SessionOutputBuffer {
    method public void flush() throws java.io.IOException;
    method public org.apache.http.io.HttpTransportMetrics getMetrics();
    method public void write(byte[], int, int) throws java.io.IOException;
    method public void write(byte[]) throws java.io.IOException;
    method public void write(int) throws java.io.IOException;
    method public void writeLine(String) throws java.io.IOException;
    method public void writeLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
  }

}

package org.apache.http.message {

  public abstract class AbstractHttpMessage implements org.apache.http.HttpMessage {
    ctor protected AbstractHttpMessage(org.apache.http.params.HttpParams);
    ctor protected AbstractHttpMessage();
    method public void addHeader(org.apache.http.Header);
    method public void addHeader(String, String);
    method public boolean containsHeader(String);
    method public org.apache.http.Header[] getAllHeaders();
    method public org.apache.http.Header getFirstHeader(String);
    method public org.apache.http.Header[] getHeaders(String);
    method public org.apache.http.Header getLastHeader(String);
    method public org.apache.http.params.HttpParams getParams();
    method public org.apache.http.HeaderIterator headerIterator();
    method public org.apache.http.HeaderIterator headerIterator(String);
    method public void removeHeader(org.apache.http.Header);
    method public void removeHeaders(String);
    method public void setHeader(org.apache.http.Header);
    method public void setHeader(String, String);
    method public void setHeaders(org.apache.http.Header[]);
    method public void setParams(org.apache.http.params.HttpParams);
    field protected org.apache.http.message.HeaderGroup headergroup;
    field protected org.apache.http.params.HttpParams params;
  }

  public class BasicHeader implements java.lang.Cloneable org.apache.http.Header {
    ctor public BasicHeader(String, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.HeaderElement[] getElements() throws org.apache.http.ParseException;
    method public String getName();
    method public String getValue();
  }

  public class BasicHeaderElement implements java.lang.Cloneable org.apache.http.HeaderElement {
    ctor public BasicHeaderElement(String, String, org.apache.http.NameValuePair[]);
    ctor public BasicHeaderElement(String, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public String getName();
    method public org.apache.http.NameValuePair getParameter(int);
    method public org.apache.http.NameValuePair getParameterByName(String);
    method public int getParameterCount();
    method public org.apache.http.NameValuePair[] getParameters();
    method public String getValue();
  }

  public class BasicHeaderElementIterator implements org.apache.http.HeaderElementIterator {
    ctor public BasicHeaderElementIterator(org.apache.http.HeaderIterator, org.apache.http.message.HeaderValueParser);
    ctor public BasicHeaderElementIterator(org.apache.http.HeaderIterator);
    method public boolean hasNext();
    method public final Object next() throws java.util.NoSuchElementException;
    method public org.apache.http.HeaderElement nextElement() throws java.util.NoSuchElementException;
    method public void remove() throws java.lang.UnsupportedOperationException;
  }

  public class BasicHeaderIterator implements org.apache.http.HeaderIterator {
    ctor public BasicHeaderIterator(org.apache.http.Header[], String);
    method protected boolean filterHeader(int);
    method protected int findNext(int);
    method public boolean hasNext();
    method public final Object next() throws java.util.NoSuchElementException;
    method public org.apache.http.Header nextHeader() throws java.util.NoSuchElementException;
    method public void remove() throws java.lang.UnsupportedOperationException;
    field protected final org.apache.http.Header[] allHeaders;
    field protected int currentIndex;
    field protected String headerName;
  }

  public class BasicHeaderValueFormatter implements org.apache.http.message.HeaderValueFormatter {
    ctor public BasicHeaderValueFormatter();
    method protected void doFormatValue(org.apache.http.util.CharArrayBuffer, String, boolean);
    method protected int estimateElementsLen(org.apache.http.HeaderElement[]);
    method protected int estimateHeaderElementLen(org.apache.http.HeaderElement);
    method protected int estimateNameValuePairLen(org.apache.http.NameValuePair);
    method protected int estimateParametersLen(org.apache.http.NameValuePair[]);
    method public static final String formatElements(org.apache.http.HeaderElement[], boolean, org.apache.http.message.HeaderValueFormatter);
    method public org.apache.http.util.CharArrayBuffer formatElements(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement[], boolean);
    method public static final String formatHeaderElement(org.apache.http.HeaderElement, boolean, org.apache.http.message.HeaderValueFormatter);
    method public org.apache.http.util.CharArrayBuffer formatHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement, boolean);
    method public static final String formatNameValuePair(org.apache.http.NameValuePair, boolean, org.apache.http.message.HeaderValueFormatter);
    method public org.apache.http.util.CharArrayBuffer formatNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair, boolean);
    method public static final String formatParameters(org.apache.http.NameValuePair[], boolean, org.apache.http.message.HeaderValueFormatter);
    method public org.apache.http.util.CharArrayBuffer formatParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair[], boolean);
    method protected boolean isSeparator(char);
    method protected boolean isUnsafe(char);
    field public static final org.apache.http.message.BasicHeaderValueFormatter DEFAULT;
    field public static final String SEPARATORS = " ;,:@()<>\\\"/[]?={}\t";
    field public static final String UNSAFE_CHARS = "\"\\";
  }

  public class BasicHeaderValueParser implements org.apache.http.message.HeaderValueParser {
    ctor public BasicHeaderValueParser();
    method protected org.apache.http.HeaderElement createHeaderElement(String, String, org.apache.http.NameValuePair[]);
    method protected org.apache.http.NameValuePair createNameValuePair(String, String);
    method public static final org.apache.http.HeaderElement[] parseElements(String, org.apache.http.message.HeaderValueParser) throws org.apache.http.ParseException;
    method public org.apache.http.HeaderElement[] parseElements(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    method public static final org.apache.http.HeaderElement parseHeaderElement(String, org.apache.http.message.HeaderValueParser) throws org.apache.http.ParseException;
    method public org.apache.http.HeaderElement parseHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    method public static final org.apache.http.NameValuePair parseNameValuePair(String, org.apache.http.message.HeaderValueParser) throws org.apache.http.ParseException;
    method public org.apache.http.NameValuePair parseNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    method public org.apache.http.NameValuePair parseNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor, char[]);
    method public static final org.apache.http.NameValuePair[] parseParameters(String, org.apache.http.message.HeaderValueParser) throws org.apache.http.ParseException;
    method public org.apache.http.NameValuePair[] parseParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    field public static final org.apache.http.message.BasicHeaderValueParser DEFAULT;
  }

  public class BasicHttpEntityEnclosingRequest extends org.apache.http.message.BasicHttpRequest implements org.apache.http.HttpEntityEnclosingRequest {
    ctor public BasicHttpEntityEnclosingRequest(String, String);
    ctor public BasicHttpEntityEnclosingRequest(String, String, org.apache.http.ProtocolVersion);
    ctor public BasicHttpEntityEnclosingRequest(org.apache.http.RequestLine);
    method public boolean expectContinue();
    method public org.apache.http.HttpEntity getEntity();
    method public void setEntity(org.apache.http.HttpEntity);
  }

  public class BasicHttpRequest extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpRequest {
    ctor public BasicHttpRequest(String, String);
    ctor public BasicHttpRequest(String, String, org.apache.http.ProtocolVersion);
    ctor public BasicHttpRequest(org.apache.http.RequestLine);
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public org.apache.http.RequestLine getRequestLine();
  }

  public class BasicHttpResponse extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpResponse {
    ctor public BasicHttpResponse(org.apache.http.StatusLine, org.apache.http.ReasonPhraseCatalog, java.util.Locale);
    ctor public BasicHttpResponse(org.apache.http.StatusLine);
    ctor public BasicHttpResponse(org.apache.http.ProtocolVersion, int, String);
    method public org.apache.http.HttpEntity getEntity();
    method public java.util.Locale getLocale();
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method protected String getReason(int);
    method public org.apache.http.StatusLine getStatusLine();
    method public void setEntity(org.apache.http.HttpEntity);
    method public void setLocale(java.util.Locale);
    method public void setReasonPhrase(String);
    method public void setStatusCode(int);
    method public void setStatusLine(org.apache.http.StatusLine);
    method public void setStatusLine(org.apache.http.ProtocolVersion, int);
    method public void setStatusLine(org.apache.http.ProtocolVersion, int, String);
  }

  public class BasicLineFormatter implements org.apache.http.message.LineFormatter {
    ctor public BasicLineFormatter();
    method public org.apache.http.util.CharArrayBuffer appendProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.ProtocolVersion);
    method protected void doFormatHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.Header);
    method protected void doFormatRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.RequestLine);
    method protected void doFormatStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.StatusLine);
    method protected int estimateProtocolVersionLen(org.apache.http.ProtocolVersion);
    method public static final String formatHeader(org.apache.http.Header, org.apache.http.message.LineFormatter);
    method public org.apache.http.util.CharArrayBuffer formatHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.Header);
    method public static final String formatProtocolVersion(org.apache.http.ProtocolVersion, org.apache.http.message.LineFormatter);
    method public static final String formatRequestLine(org.apache.http.RequestLine, org.apache.http.message.LineFormatter);
    method public org.apache.http.util.CharArrayBuffer formatRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.RequestLine);
    method public static final String formatStatusLine(org.apache.http.StatusLine, org.apache.http.message.LineFormatter);
    method public org.apache.http.util.CharArrayBuffer formatStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.StatusLine);
    method protected org.apache.http.util.CharArrayBuffer initBuffer(org.apache.http.util.CharArrayBuffer);
    field public static final org.apache.http.message.BasicLineFormatter DEFAULT;
  }

  public class BasicLineParser implements org.apache.http.message.LineParser {
    ctor public BasicLineParser(org.apache.http.ProtocolVersion);
    ctor public BasicLineParser();
    method protected org.apache.http.ProtocolVersion createProtocolVersion(int, int);
    method protected org.apache.http.RequestLine createRequestLine(String, String, org.apache.http.ProtocolVersion);
    method protected org.apache.http.StatusLine createStatusLine(org.apache.http.ProtocolVersion, int, String);
    method public boolean hasProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    method public static final org.apache.http.Header parseHeader(String, org.apache.http.message.LineParser) throws org.apache.http.ParseException;
    method public org.apache.http.Header parseHeader(org.apache.http.util.CharArrayBuffer) throws org.apache.http.ParseException;
    method public static final org.apache.http.ProtocolVersion parseProtocolVersion(String, org.apache.http.message.LineParser) throws org.apache.http.ParseException;
    method public org.apache.http.ProtocolVersion parseProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public static final org.apache.http.RequestLine parseRequestLine(String, org.apache.http.message.LineParser) throws org.apache.http.ParseException;
    method public org.apache.http.RequestLine parseRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public static final org.apache.http.StatusLine parseStatusLine(String, org.apache.http.message.LineParser) throws org.apache.http.ParseException;
    method public org.apache.http.StatusLine parseStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method protected void skipWhitespace(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    field public static final org.apache.http.message.BasicLineParser DEFAULT;
    field protected final org.apache.http.ProtocolVersion protocol;
  }

  public class BasicListHeaderIterator implements org.apache.http.HeaderIterator {
    ctor public BasicListHeaderIterator(java.util.List, String);
    method protected boolean filterHeader(int);
    method protected int findNext(int);
    method public boolean hasNext();
    method public final Object next() throws java.util.NoSuchElementException;
    method public org.apache.http.Header nextHeader() throws java.util.NoSuchElementException;
    method public void remove() throws java.lang.UnsupportedOperationException;
    field protected final java.util.List allHeaders;
    field protected int currentIndex;
    field protected String headerName;
    field protected int lastIndex;
  }

  public class BasicNameValuePair implements java.lang.Cloneable org.apache.http.NameValuePair {
    ctor public BasicNameValuePair(String, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public String getName();
    method public String getValue();
  }

  public class BasicRequestLine implements java.lang.Cloneable org.apache.http.RequestLine {
    ctor public BasicRequestLine(String, String, org.apache.http.ProtocolVersion);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public String getMethod();
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public String getUri();
  }

  public class BasicStatusLine implements java.lang.Cloneable org.apache.http.StatusLine {
    ctor public BasicStatusLine(org.apache.http.ProtocolVersion, int, String);
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.ProtocolVersion getProtocolVersion();
    method public String getReasonPhrase();
    method public int getStatusCode();
  }

  public class BasicTokenIterator implements org.apache.http.TokenIterator {
    ctor public BasicTokenIterator(org.apache.http.HeaderIterator);
    method protected String createToken(String, int, int);
    method protected int findNext(int) throws org.apache.http.ParseException;
    method protected int findTokenEnd(int);
    method protected int findTokenSeparator(int);
    method protected int findTokenStart(int);
    method public boolean hasNext();
    method protected boolean isHttpSeparator(char);
    method protected boolean isTokenChar(char);
    method protected boolean isTokenSeparator(char);
    method protected boolean isWhitespace(char);
    method public final Object next() throws java.util.NoSuchElementException, org.apache.http.ParseException;
    method public String nextToken() throws java.util.NoSuchElementException, org.apache.http.ParseException;
    method public final void remove() throws java.lang.UnsupportedOperationException;
    field public static final String HTTP_SEPARATORS = " ,;=()<>@:\\\"/[]?{}\t";
    field protected String currentHeader;
    field protected String currentToken;
    field protected final org.apache.http.HeaderIterator headerIt;
    field protected int searchPos;
  }

  public class BufferedHeader implements java.lang.Cloneable org.apache.http.FormattedHeader {
    ctor public BufferedHeader(org.apache.http.util.CharArrayBuffer) throws org.apache.http.ParseException;
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.util.CharArrayBuffer getBuffer();
    method public org.apache.http.HeaderElement[] getElements() throws org.apache.http.ParseException;
    method public String getName();
    method public String getValue();
    method public int getValuePos();
  }

  public class HeaderGroup implements java.lang.Cloneable {
    ctor public HeaderGroup();
    method public void addHeader(org.apache.http.Header);
    method public void clear();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public boolean containsHeader(String);
    method public org.apache.http.message.HeaderGroup copy();
    method public org.apache.http.Header[] getAllHeaders();
    method public org.apache.http.Header getCondensedHeader(String);
    method public org.apache.http.Header getFirstHeader(String);
    method public org.apache.http.Header[] getHeaders(String);
    method public org.apache.http.Header getLastHeader(String);
    method public org.apache.http.HeaderIterator iterator();
    method public org.apache.http.HeaderIterator iterator(String);
    method public void removeHeader(org.apache.http.Header);
    method public void setHeaders(org.apache.http.Header[]);
    method public void updateHeader(org.apache.http.Header);
  }

  public interface HeaderValueFormatter {
    method public org.apache.http.util.CharArrayBuffer formatElements(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement[], boolean);
    method public org.apache.http.util.CharArrayBuffer formatHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement, boolean);
    method public org.apache.http.util.CharArrayBuffer formatNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair, boolean);
    method public org.apache.http.util.CharArrayBuffer formatParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair[], boolean);
  }

  public interface HeaderValueParser {
    method public org.apache.http.HeaderElement[] parseElements(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public org.apache.http.HeaderElement parseHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public org.apache.http.NameValuePair parseNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public org.apache.http.NameValuePair[] parseParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
  }

  public interface LineFormatter {
    method public org.apache.http.util.CharArrayBuffer appendProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.ProtocolVersion);
    method public org.apache.http.util.CharArrayBuffer formatHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.Header);
    method public org.apache.http.util.CharArrayBuffer formatRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.RequestLine);
    method public org.apache.http.util.CharArrayBuffer formatStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.StatusLine);
  }

  public interface LineParser {
    method public boolean hasProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
    method public org.apache.http.Header parseHeader(org.apache.http.util.CharArrayBuffer) throws org.apache.http.ParseException;
    method public org.apache.http.ProtocolVersion parseProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public org.apache.http.RequestLine parseRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
    method public org.apache.http.StatusLine parseStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
  }

  public class ParserCursor {
    ctor public ParserCursor(int, int);
    method public boolean atEnd();
    method public int getLowerBound();
    method public int getPos();
    method public int getUpperBound();
    method public void updatePos(int);
  }

}

package org.apache.http.params {

  public abstract class AbstractHttpParams implements org.apache.http.params.HttpParams {
    ctor protected AbstractHttpParams();
    method public boolean getBooleanParameter(String, boolean);
    method public double getDoubleParameter(String, double);
    method public int getIntParameter(String, int);
    method public long getLongParameter(String, long);
    method public boolean isParameterFalse(String);
    method public boolean isParameterTrue(String);
    method public org.apache.http.params.HttpParams setBooleanParameter(String, boolean);
    method public org.apache.http.params.HttpParams setDoubleParameter(String, double);
    method public org.apache.http.params.HttpParams setIntParameter(String, int);
    method public org.apache.http.params.HttpParams setLongParameter(String, long);
  }

  public final class BasicHttpParams extends org.apache.http.params.AbstractHttpParams implements java.lang.Cloneable java.io.Serializable {
    ctor public BasicHttpParams();
    method public void clear();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.params.HttpParams copy();
    method protected void copyParams(org.apache.http.params.HttpParams);
    method public Object getParameter(String);
    method public boolean isParameterSet(String);
    method public boolean isParameterSetLocally(String);
    method public boolean removeParameter(String);
    method public org.apache.http.params.HttpParams setParameter(String, Object);
    method public void setParameters(String[], Object);
  }

  public interface CoreConnectionPNames {
    field public static final String CONNECTION_TIMEOUT = "http.connection.timeout";
    field public static final String MAX_HEADER_COUNT = "http.connection.max-header-count";
    field public static final String MAX_LINE_LENGTH = "http.connection.max-line-length";
    field public static final String SOCKET_BUFFER_SIZE = "http.socket.buffer-size";
    field public static final String SO_LINGER = "http.socket.linger";
    field public static final String SO_TIMEOUT = "http.socket.timeout";
    field public static final String STALE_CONNECTION_CHECK = "http.connection.stalecheck";
    field public static final String TCP_NODELAY = "http.tcp.nodelay";
  }

  public interface CoreProtocolPNames {
    field public static final String HTTP_CONTENT_CHARSET = "http.protocol.content-charset";
    field public static final String HTTP_ELEMENT_CHARSET = "http.protocol.element-charset";
    field public static final String ORIGIN_SERVER = "http.origin-server";
    field public static final String PROTOCOL_VERSION = "http.protocol.version";
    field public static final String STRICT_TRANSFER_ENCODING = "http.protocol.strict-transfer-encoding";
    field public static final String USER_AGENT = "http.useragent";
    field public static final String USE_EXPECT_CONTINUE = "http.protocol.expect-continue";
    field public static final String WAIT_FOR_CONTINUE = "http.protocol.wait-for-continue";
  }

  public final class DefaultedHttpParams extends org.apache.http.params.AbstractHttpParams {
    ctor public DefaultedHttpParams(org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
    method public org.apache.http.params.HttpParams copy();
    method public org.apache.http.params.HttpParams getDefaults();
    method public Object getParameter(String);
    method public boolean removeParameter(String);
    method public org.apache.http.params.HttpParams setParameter(String, Object);
  }

  public abstract class HttpAbstractParamBean {
    ctor public HttpAbstractParamBean(org.apache.http.params.HttpParams);
    field protected final org.apache.http.params.HttpParams params;
  }

  public class HttpConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public HttpConnectionParamBean(org.apache.http.params.HttpParams);
    method public void setConnectionTimeout(int);
    method public void setLinger(int);
    method public void setSoTimeout(int);
    method public void setSocketBufferSize(int);
    method public void setStaleCheckingEnabled(boolean);
    method public void setTcpNoDelay(boolean);
  }

  public final class HttpConnectionParams implements org.apache.http.params.CoreConnectionPNames {
    method public static int getConnectionTimeout(org.apache.http.params.HttpParams);
    method public static int getLinger(org.apache.http.params.HttpParams);
    method public static int getSoTimeout(org.apache.http.params.HttpParams);
    method public static int getSocketBufferSize(org.apache.http.params.HttpParams);
    method public static boolean getTcpNoDelay(org.apache.http.params.HttpParams);
    method public static boolean isStaleCheckingEnabled(org.apache.http.params.HttpParams);
    method public static void setConnectionTimeout(org.apache.http.params.HttpParams, int);
    method public static void setLinger(org.apache.http.params.HttpParams, int);
    method public static void setSoTimeout(org.apache.http.params.HttpParams, int);
    method public static void setSocketBufferSize(org.apache.http.params.HttpParams, int);
    method public static void setStaleCheckingEnabled(org.apache.http.params.HttpParams, boolean);
    method public static void setTcpNoDelay(org.apache.http.params.HttpParams, boolean);
  }

  public interface HttpParams {
    method public org.apache.http.params.HttpParams copy();
    method public boolean getBooleanParameter(String, boolean);
    method public double getDoubleParameter(String, double);
    method public int getIntParameter(String, int);
    method public long getLongParameter(String, long);
    method public Object getParameter(String);
    method public boolean isParameterFalse(String);
    method public boolean isParameterTrue(String);
    method public boolean removeParameter(String);
    method public org.apache.http.params.HttpParams setBooleanParameter(String, boolean);
    method public org.apache.http.params.HttpParams setDoubleParameter(String, double);
    method public org.apache.http.params.HttpParams setIntParameter(String, int);
    method public org.apache.http.params.HttpParams setLongParameter(String, long);
    method public org.apache.http.params.HttpParams setParameter(String, Object);
  }

  public class HttpProtocolParamBean extends org.apache.http.params.HttpAbstractParamBean {
    ctor public HttpProtocolParamBean(org.apache.http.params.HttpParams);
    method public void setContentCharset(String);
    method public void setHttpElementCharset(String);
    method public void setUseExpectContinue(boolean);
    method public void setUserAgent(String);
    method public void setVersion(org.apache.http.HttpVersion);
  }

  public final class HttpProtocolParams implements org.apache.http.params.CoreProtocolPNames {
    method public static String getContentCharset(org.apache.http.params.HttpParams);
    method public static String getHttpElementCharset(org.apache.http.params.HttpParams);
    method public static String getUserAgent(org.apache.http.params.HttpParams);
    method public static org.apache.http.ProtocolVersion getVersion(org.apache.http.params.HttpParams);
    method public static void setContentCharset(org.apache.http.params.HttpParams, String);
    method public static void setHttpElementCharset(org.apache.http.params.HttpParams, String);
    method public static void setUseExpectContinue(org.apache.http.params.HttpParams, boolean);
    method public static void setUserAgent(org.apache.http.params.HttpParams, String);
    method public static void setVersion(org.apache.http.params.HttpParams, org.apache.http.ProtocolVersion);
    method public static boolean useExpectContinue(org.apache.http.params.HttpParams);
  }

}

package org.apache.http.protocol {

  public class BasicHttpContext implements org.apache.http.protocol.HttpContext {
    ctor public BasicHttpContext();
    ctor public BasicHttpContext(org.apache.http.protocol.HttpContext);
    method public Object getAttribute(String);
    method public Object removeAttribute(String);
    method public void setAttribute(String, Object);
  }

  public final class BasicHttpProcessor implements java.lang.Cloneable org.apache.http.protocol.HttpProcessor org.apache.http.protocol.HttpRequestInterceptorList org.apache.http.protocol.HttpResponseInterceptorList {
    ctor public BasicHttpProcessor();
    method public void addInterceptor(org.apache.http.HttpRequestInterceptor);
    method public void addInterceptor(org.apache.http.HttpRequestInterceptor, int);
    method public void addInterceptor(org.apache.http.HttpResponseInterceptor);
    method public void addInterceptor(org.apache.http.HttpResponseInterceptor, int);
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor);
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor, int);
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor, int);
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor);
    method public void clearInterceptors();
    method public void clearRequestInterceptors();
    method public void clearResponseInterceptors();
    method public Object clone() throws java.lang.CloneNotSupportedException;
    method public org.apache.http.protocol.BasicHttpProcessor copy();
    method protected void copyInterceptors(org.apache.http.protocol.BasicHttpProcessor);
    method public org.apache.http.HttpRequestInterceptor getRequestInterceptor(int);
    method public int getRequestInterceptorCount();
    method public org.apache.http.HttpResponseInterceptor getResponseInterceptor(int);
    method public int getResponseInterceptorCount();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public void removeRequestInterceptorByClass(Class);
    method public void removeResponseInterceptorByClass(Class);
    method public void setInterceptors(java.util.List);
    field protected java.util.List requestInterceptors;
    field protected java.util.List responseInterceptors;
  }

  public final class DefaultedHttpContext implements org.apache.http.protocol.HttpContext {
    ctor public DefaultedHttpContext(org.apache.http.protocol.HttpContext, org.apache.http.protocol.HttpContext);
    method public Object getAttribute(String);
    method public org.apache.http.protocol.HttpContext getDefaults();
    method public Object removeAttribute(String);
    method public void setAttribute(String, Object);
  }

  public interface ExecutionContext {
    field public static final String HTTP_CONNECTION = "http.connection";
    field public static final String HTTP_PROXY_HOST = "http.proxy_host";
    field public static final String HTTP_REQUEST = "http.request";
    field public static final String HTTP_REQ_SENT = "http.request_sent";
    field public static final String HTTP_RESPONSE = "http.response";
    field public static final String HTTP_TARGET_HOST = "http.target_host";
  }

  public final class HTTP {
    method public static boolean isWhitespace(char);
    field public static final String ASCII = "ASCII";
    field public static final String CHARSET_PARAM = "; charset=";
    field public static final String CHUNK_CODING = "chunked";
    field public static final String CONN_CLOSE = "Close";
    field public static final String CONN_DIRECTIVE = "Connection";
    field public static final String CONN_KEEP_ALIVE = "Keep-Alive";
    field public static final String CONTENT_ENCODING = "Content-Encoding";
    field public static final String CONTENT_LEN = "Content-Length";
    field public static final String CONTENT_TYPE = "Content-Type";
    field public static final int CR = 13; // 0xd
    field public static final String DATE_HEADER = "Date";
    field public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1";
    field public static final String DEFAULT_CONTENT_TYPE = "application/octet-stream";
    field public static final String DEFAULT_PROTOCOL_CHARSET = "US-ASCII";
    field public static final String EXPECT_CONTINUE = "100-Continue";
    field public static final String EXPECT_DIRECTIVE = "Expect";
    field public static final int HT = 9; // 0x9
    field public static final String IDENTITY_CODING = "identity";
    field public static final String ISO_8859_1 = "ISO-8859-1";
    field public static final int LF = 10; // 0xa
    field public static final String OCTET_STREAM_TYPE = "application/octet-stream";
    field public static final String PLAIN_TEXT_TYPE = "text/plain";
    field public static final String SERVER_HEADER = "Server";
    field public static final int SP = 32; // 0x20
    field public static final String TARGET_HOST = "Host";
    field public static final String TRANSFER_ENCODING = "Transfer-Encoding";
    field public static final String USER_AGENT = "User-Agent";
    field public static final String US_ASCII = "US-ASCII";
    field public static final String UTF_16 = "UTF-16";
    field public static final String UTF_8 = "UTF-8";
  }

  public interface HttpContext {
    method public Object getAttribute(String);
    method public Object removeAttribute(String);
    method public void setAttribute(String, Object);
    field public static final String RESERVED_PREFIX = "http.";
  }

  public class HttpDateGenerator {
    ctor public HttpDateGenerator();
    method public String getCurrentDate();
    field public static final java.util.TimeZone GMT;
    field public static final String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
  }

  public interface HttpExpectationVerifier {
    method public void verify(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
  }

  public interface HttpProcessor extends org.apache.http.HttpRequestInterceptor org.apache.http.HttpResponseInterceptor {
  }

  public class HttpRequestExecutor {
    ctor public HttpRequestExecutor();
    method protected boolean canResponseHaveBody(org.apache.http.HttpRequest, org.apache.http.HttpResponse);
    method protected org.apache.http.HttpResponse doReceiveResponse(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method protected org.apache.http.HttpResponse doSendRequest(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.HttpResponse execute(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public void postProcess(org.apache.http.HttpResponse, org.apache.http.protocol.HttpProcessor, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public void preProcess(org.apache.http.HttpRequest, org.apache.http.protocol.HttpProcessor, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public interface HttpRequestHandler {
    method public void handle(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class HttpRequestHandlerRegistry implements org.apache.http.protocol.HttpRequestHandlerResolver {
    ctor public HttpRequestHandlerRegistry();
    method public org.apache.http.protocol.HttpRequestHandler lookup(String);
    method protected boolean matchUriRequestPattern(String, String);
    method public void register(String, org.apache.http.protocol.HttpRequestHandler);
    method public void setHandlers(java.util.Map);
    method public void unregister(String);
  }

  public interface HttpRequestHandlerResolver {
    method public org.apache.http.protocol.HttpRequestHandler lookup(String);
  }

  public interface HttpRequestInterceptorList {
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor);
    method public void addRequestInterceptor(org.apache.http.HttpRequestInterceptor, int);
    method public void clearRequestInterceptors();
    method public org.apache.http.HttpRequestInterceptor getRequestInterceptor(int);
    method public int getRequestInterceptorCount();
    method public void removeRequestInterceptorByClass(Class);
    method public void setInterceptors(java.util.List);
  }

  public interface HttpResponseInterceptorList {
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor);
    method public void addResponseInterceptor(org.apache.http.HttpResponseInterceptor, int);
    method public void clearResponseInterceptors();
    method public org.apache.http.HttpResponseInterceptor getResponseInterceptor(int);
    method public int getResponseInterceptorCount();
    method public void removeResponseInterceptorByClass(Class);
    method public void setInterceptors(java.util.List);
  }

  public class HttpService {
    ctor public HttpService(org.apache.http.protocol.HttpProcessor, org.apache.http.ConnectionReuseStrategy, org.apache.http.HttpResponseFactory);
    method protected void doService(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public org.apache.http.params.HttpParams getParams();
    method protected void handleException(org.apache.http.HttpException, org.apache.http.HttpResponse);
    method public void handleRequest(org.apache.http.HttpServerConnection, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
    method public void setConnReuseStrategy(org.apache.http.ConnectionReuseStrategy);
    method public void setExpectationVerifier(org.apache.http.protocol.HttpExpectationVerifier);
    method public void setHandlerResolver(org.apache.http.protocol.HttpRequestHandlerResolver);
    method public void setHttpProcessor(org.apache.http.protocol.HttpProcessor);
    method public void setParams(org.apache.http.params.HttpParams);
    method public void setResponseFactory(org.apache.http.HttpResponseFactory);
  }

  public class RequestConnControl implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestConnControl();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestContent implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestContent();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestDate implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestDate();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestExpectContinue implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestExpectContinue();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestTargetHost implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestTargetHost();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class RequestUserAgent implements org.apache.http.HttpRequestInterceptor {
    ctor public RequestUserAgent();
    method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class ResponseConnControl implements org.apache.http.HttpResponseInterceptor {
    ctor public ResponseConnControl();
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class ResponseContent implements org.apache.http.HttpResponseInterceptor {
    ctor public ResponseContent();
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class ResponseDate implements org.apache.http.HttpResponseInterceptor {
    ctor public ResponseDate();
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class ResponseServer implements org.apache.http.HttpResponseInterceptor {
    ctor public ResponseServer();
    method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
  }

  public class SyncBasicHttpContext extends org.apache.http.protocol.BasicHttpContext {
    ctor public SyncBasicHttpContext(org.apache.http.protocol.HttpContext);
  }

  public class UriPatternMatcher {
    ctor public UriPatternMatcher();
    method public Object lookup(String);
    method protected boolean matchUriRequestPattern(String, String);
    method public void register(String, Object);
    method public void setHandlers(java.util.Map);
    method public void unregister(String);
  }

}

package org.apache.http.util {

  public final class ByteArrayBuffer {
    ctor public ByteArrayBuffer(int);
    method public void append(byte[], int, int);
    method public void append(int);
    method public void append(char[], int, int);
    method public void append(org.apache.http.util.CharArrayBuffer, int, int);
    method public byte[] buffer();
    method public int byteAt(int);
    method public int capacity();
    method public void clear();
    method public boolean isEmpty();
    method public boolean isFull();
    method public int length();
    method public void setLength(int);
    method public byte[] toByteArray();
  }

  public final class CharArrayBuffer {
    ctor public CharArrayBuffer(int);
    method public void append(char[], int, int);
    method public void append(String);
    method public void append(org.apache.http.util.CharArrayBuffer, int, int);
    method public void append(org.apache.http.util.CharArrayBuffer);
    method public void append(char);
    method public void append(byte[], int, int);
    method public void append(org.apache.http.util.ByteArrayBuffer, int, int);
    method public void append(Object);
    method public char[] buffer();
    method public int capacity();
    method public char charAt(int);
    method public void clear();
    method public void ensureCapacity(int);
    method public int indexOf(int, int, int);
    method public int indexOf(int);
    method public boolean isEmpty();
    method public boolean isFull();
    method public int length();
    method public void setLength(int);
    method public String substring(int, int);
    method public String substringTrimmed(int, int);
    method public char[] toCharArray();
  }

  public final class EncodingUtils {
    method public static byte[] getAsciiBytes(String);
    method public static String getAsciiString(byte[], int, int);
    method public static String getAsciiString(byte[]);
    method public static byte[] getBytes(String, String);
    method public static String getString(byte[], int, int, String);
    method public static String getString(byte[], String);
  }

  public final class EntityUtils {
    method public static String getContentCharSet(org.apache.http.HttpEntity) throws org.apache.http.ParseException;
    method public static byte[] toByteArray(org.apache.http.HttpEntity) throws java.io.IOException;
    method public static String toString(org.apache.http.HttpEntity, String) throws java.io.IOException, org.apache.http.ParseException;
    method public static String toString(org.apache.http.HttpEntity) throws java.io.IOException, org.apache.http.ParseException;
  }

  public final class ExceptionUtils {
    method public static void initCause(Throwable, Throwable);
  }

  public final class LangUtils {
    method public static boolean equals(Object, Object);
    method public static boolean equals(Object[], Object[]);
    method public static int hashCode(int, int);
    method public static int hashCode(int, boolean);
    method public static int hashCode(int, Object);
    field public static final int HASH_OFFSET = 37; // 0x25
    field public static final int HASH_SEED = 17; // 0x11
  }

  public class VersionInfo {
    ctor protected VersionInfo(String, String, String, String, String);
    method protected static final org.apache.http.util.VersionInfo fromMap(String, java.util.Map, ClassLoader);
    method public final String getClassloader();
    method public final String getModule();
    method public final String getPackage();
    method public final String getRelease();
    method public final String getTimestamp();
    method public static final org.apache.http.util.VersionInfo[] loadVersionInfo(String[], ClassLoader);
    method public static final org.apache.http.util.VersionInfo loadVersionInfo(String, ClassLoader);
    field public static final String PROPERTY_MODULE = "info.module";
    field public static final String PROPERTY_RELEASE = "info.release";
    field public static final String PROPERTY_TIMESTAMP = "info.timestamp";
    field public static final String UNAVAILABLE = "UNAVAILABLE";
    field public static final String VERSION_PROPERTY_FILE = "version.properties";
  }

}

package org.json {

  public class JSONArray {
    ctor public JSONArray();
    ctor public JSONArray(org.json.JSONTokener) throws org.json.JSONException;
    ctor public JSONArray(String) throws org.json.JSONException;
    ctor public JSONArray(java.util.Collection);
    method public Object get(int) throws org.json.JSONException;
    method public boolean getBoolean(int) throws org.json.JSONException;
    method public double getDouble(int) throws org.json.JSONException;
    method public int getInt(int) throws org.json.JSONException;
    method public org.json.JSONArray getJSONArray(int) throws org.json.JSONException;
    method public org.json.JSONObject getJSONObject(int) throws org.json.JSONException;
    method public long getLong(int) throws org.json.JSONException;
    method public String getString(int) throws org.json.JSONException;
    method public boolean isNull(int);
    method public String join(String) throws org.json.JSONException;
    method public int length();
    method public Object opt(int);
    method public boolean optBoolean(int);
    method public boolean optBoolean(int, boolean);
    method public double optDouble(int);
    method public double optDouble(int, double);
    method public int optInt(int);
    method public int optInt(int, int);
    method public org.json.JSONArray optJSONArray(int);
    method public org.json.JSONObject optJSONObject(int);
    method public long optLong(int);
    method public long optLong(int, long);
    method public String optString(int);
    method public String optString(int, String);
    method public org.json.JSONArray put(boolean);
    method public org.json.JSONArray put(double) throws org.json.JSONException;
    method public org.json.JSONArray put(int);
    method public org.json.JSONArray put(long);
    method public org.json.JSONArray put(Object);
    method public org.json.JSONArray put(int, boolean) throws org.json.JSONException;
    method public org.json.JSONArray put(int, double) throws org.json.JSONException;
    method public org.json.JSONArray put(int, int) throws org.json.JSONException;
    method public org.json.JSONArray put(int, long) throws org.json.JSONException;
    method public org.json.JSONArray put(int, Object) throws org.json.JSONException;
    method public org.json.JSONObject toJSONObject(org.json.JSONArray) throws org.json.JSONException;
    method public String toString(int) throws org.json.JSONException;
  }

  public class JSONException extends java.lang.Exception {
    ctor public JSONException(String);
  }

  public class JSONObject {
    ctor public JSONObject();
    ctor public JSONObject(org.json.JSONObject, String[]) throws org.json.JSONException;
    ctor public JSONObject(org.json.JSONTokener) throws org.json.JSONException;
    ctor public JSONObject(java.util.Map);
    ctor public JSONObject(String) throws org.json.JSONException;
    method public org.json.JSONObject accumulate(String, Object) throws org.json.JSONException;
    method public Object get(String) throws org.json.JSONException;
    method public boolean getBoolean(String) throws org.json.JSONException;
    method public double getDouble(String) throws org.json.JSONException;
    method public int getInt(String) throws org.json.JSONException;
    method public org.json.JSONArray getJSONArray(String) throws org.json.JSONException;
    method public org.json.JSONObject getJSONObject(String) throws org.json.JSONException;
    method public long getLong(String) throws org.json.JSONException;
    method public String getString(String) throws org.json.JSONException;
    method public boolean has(String);
    method public boolean isNull(String);
    method public java.util.Iterator keys();
    method public int length();
    method public org.json.JSONArray names();
    method public static String numberToString(Number) throws org.json.JSONException;
    method public Object opt(String);
    method public boolean optBoolean(String);
    method public boolean optBoolean(String, boolean);
    method public double optDouble(String);
    method public double optDouble(String, double);
    method public int optInt(String);
    method public int optInt(String, int);
    method public org.json.JSONArray optJSONArray(String);
    method public org.json.JSONObject optJSONObject(String);
    method public long optLong(String);
    method public long optLong(String, long);
    method public String optString(String);
    method public String optString(String, String);
    method public org.json.JSONObject put(String, boolean) throws org.json.JSONException;
    method public org.json.JSONObject put(String, double) throws org.json.JSONException;
    method public org.json.JSONObject put(String, int) throws org.json.JSONException;
    method public org.json.JSONObject put(String, long) throws org.json.JSONException;
    method public org.json.JSONObject put(String, Object) throws org.json.JSONException;
    method public org.json.JSONObject putOpt(String, Object) throws org.json.JSONException;
    method public static String quote(String);
    method public Object remove(String);
    method public org.json.JSONArray toJSONArray(org.json.JSONArray) throws org.json.JSONException;
    method public String toString(int) throws org.json.JSONException;
    field public static final Object NULL;
  }

  public class JSONStringer {
    ctor public JSONStringer();
    method public org.json.JSONStringer array() throws org.json.JSONException;
    method public org.json.JSONStringer endArray() throws org.json.JSONException;
    method public org.json.JSONStringer endObject() throws org.json.JSONException;
    method public org.json.JSONStringer key(String) throws org.json.JSONException;
    method public org.json.JSONStringer object() throws org.json.JSONException;
    method public org.json.JSONStringer value(boolean) throws org.json.JSONException;
    method public org.json.JSONStringer value(double) throws org.json.JSONException;
    method public org.json.JSONStringer value(long) throws org.json.JSONException;
    method public org.json.JSONStringer value(Object) throws org.json.JSONException;
  }

  public class JSONTokener {
    ctor public JSONTokener(String);
    method public void back();
    method public static int dehexchar(char);
    method public boolean more();
    method public char next();
    method public char next(char) throws org.json.JSONException;
    method public String next(int) throws org.json.JSONException;
    method public char nextClean() throws org.json.JSONException;
    method public String nextString(char) throws org.json.JSONException;
    method public String nextTo(char);
    method public String nextTo(String);
    method public Object nextValue() throws org.json.JSONException;
    method public void skipPast(String);
    method public char skipTo(char);
    method public org.json.JSONException syntaxError(String);
  }

}

package org.w3c.dom {

  public interface Attr extends org.w3c.dom.Node {
    method public String getName();
    method public org.w3c.dom.Element getOwnerElement();
    method public boolean getSpecified();
    method public String getValue();
    method public void setValue(String) throws org.w3c.dom.DOMException;
  }

  public interface CDATASection extends org.w3c.dom.Text {
  }

  public interface CharacterData extends org.w3c.dom.Node {
    method public void appendData(String) throws org.w3c.dom.DOMException;
    method public void deleteData(int, int) throws org.w3c.dom.DOMException;
    method public String getData() throws org.w3c.dom.DOMException;
    method public int getLength();
    method public void insertData(int, String) throws org.w3c.dom.DOMException;
    method public void replaceData(int, int, String) throws org.w3c.dom.DOMException;
    method public void setData(String) throws org.w3c.dom.DOMException;
    method public String substringData(int, int) throws org.w3c.dom.DOMException;
  }

  public interface Comment extends org.w3c.dom.CharacterData {
  }

  public class DOMException extends java.lang.RuntimeException {
    ctor public DOMException(short, String);
    field public static final short DOMSTRING_SIZE_ERR = 2; // 0x2
    field public static final short HIERARCHY_REQUEST_ERR = 3; // 0x3
    field public static final short INDEX_SIZE_ERR = 1; // 0x1
    field public static final short INUSE_ATTRIBUTE_ERR = 10; // 0xa
    field public static final short INVALID_ACCESS_ERR = 15; // 0xf
    field public static final short INVALID_CHARACTER_ERR = 5; // 0x5
    field public static final short INVALID_MODIFICATION_ERR = 13; // 0xd
    field public static final short INVALID_STATE_ERR = 11; // 0xb
    field public static final short NAMESPACE_ERR = 14; // 0xe
    field public static final short NOT_FOUND_ERR = 8; // 0x8
    field public static final short NOT_SUPPORTED_ERR = 9; // 0x9
    field public static final short NO_DATA_ALLOWED_ERR = 6; // 0x6
    field public static final short NO_MODIFICATION_ALLOWED_ERR = 7; // 0x7
    field public static final short SYNTAX_ERR = 12; // 0xc
    field public static final short WRONG_DOCUMENT_ERR = 4; // 0x4
    field public short code;
  }

  public interface DOMImplementation {
    method public org.w3c.dom.Document createDocument(String, String, org.w3c.dom.DocumentType) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.DocumentType createDocumentType(String, String, String) throws org.w3c.dom.DOMException;
    method public boolean hasFeature(String, String);
  }

  public interface Document extends org.w3c.dom.Node {
    method public org.w3c.dom.Attr createAttribute(String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Attr createAttributeNS(String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.CDATASection createCDATASection(String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Comment createComment(String);
    method public org.w3c.dom.DocumentFragment createDocumentFragment();
    method public org.w3c.dom.Element createElement(String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Element createElementNS(String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.EntityReference createEntityReference(String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.ProcessingInstruction createProcessingInstruction(String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Text createTextNode(String);
    method public org.w3c.dom.DocumentType getDoctype();
    method public org.w3c.dom.Element getDocumentElement();
    method public org.w3c.dom.Element getElementById(String);
    method public org.w3c.dom.NodeList getElementsByTagName(String);
    method public org.w3c.dom.NodeList getElementsByTagNameNS(String, String);
    method public org.w3c.dom.DOMImplementation getImplementation();
    method public org.w3c.dom.Node importNode(org.w3c.dom.Node, boolean) throws org.w3c.dom.DOMException;
  }

  public interface DocumentFragment extends org.w3c.dom.Node {
  }

  public interface DocumentType extends org.w3c.dom.Node {
    method public org.w3c.dom.NamedNodeMap getEntities();
    method public String getInternalSubset();
    method public String getName();
    method public org.w3c.dom.NamedNodeMap getNotations();
    method public String getPublicId();
    method public String getSystemId();
  }

  public interface Element extends org.w3c.dom.Node {
    method public String getAttribute(String);
    method public String getAttributeNS(String, String);
    method public org.w3c.dom.Attr getAttributeNode(String);
    method public org.w3c.dom.Attr getAttributeNodeNS(String, String);
    method public org.w3c.dom.NodeList getElementsByTagName(String);
    method public org.w3c.dom.NodeList getElementsByTagNameNS(String, String);
    method public String getTagName();
    method public boolean hasAttribute(String);
    method public boolean hasAttributeNS(String, String);
    method public void removeAttribute(String) throws org.w3c.dom.DOMException;
    method public void removeAttributeNS(String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Attr removeAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
    method public void setAttribute(String, String) throws org.w3c.dom.DOMException;
    method public void setAttributeNS(String, String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Attr setAttributeNode(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Attr setAttributeNodeNS(org.w3c.dom.Attr) throws org.w3c.dom.DOMException;
  }

  public interface Entity extends org.w3c.dom.Node {
    method public String getNotationName();
    method public String getPublicId();
    method public String getSystemId();
  }

  public interface EntityReference extends org.w3c.dom.Node {
  }

  public interface NamedNodeMap {
    method public int getLength();
    method public org.w3c.dom.Node getNamedItem(String);
    method public org.w3c.dom.Node getNamedItemNS(String, String);
    method public org.w3c.dom.Node item(int);
    method public org.w3c.dom.Node removeNamedItem(String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Node removeNamedItemNS(String, String) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Node setNamedItem(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Node setNamedItemNS(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
  }

  public interface Node {
    method public org.w3c.dom.Node appendChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Node cloneNode(boolean);
    method public org.w3c.dom.NamedNodeMap getAttributes();
    method public org.w3c.dom.NodeList getChildNodes();
    method public org.w3c.dom.Node getFirstChild();
    method public org.w3c.dom.Node getLastChild();
    method public String getLocalName();
    method public String getNamespaceURI();
    method public org.w3c.dom.Node getNextSibling();
    method public String getNodeName();
    method public short getNodeType();
    method public String getNodeValue() throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Document getOwnerDocument();
    method public org.w3c.dom.Node getParentNode();
    method public String getPrefix();
    method public org.w3c.dom.Node getPreviousSibling();
    method public boolean hasAttributes();
    method public boolean hasChildNodes();
    method public org.w3c.dom.Node insertBefore(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
    method public boolean isSupported(String, String);
    method public void normalize();
    method public org.w3c.dom.Node removeChild(org.w3c.dom.Node) throws org.w3c.dom.DOMException;
    method public org.w3c.dom.Node replaceChild(org.w3c.dom.Node, org.w3c.dom.Node) throws org.w3c.dom.DOMException;
    method public void setNodeValue(String) throws org.w3c.dom.DOMException;
    method public void setPrefix(String) throws org.w3c.dom.DOMException;
    field public static final short ATTRIBUTE_NODE = 2; // 0x2
    field public static final short CDATA_SECTION_NODE = 4; // 0x4
    field public static final short COMMENT_NODE = 8; // 0x8
    field public static final short DOCUMENT_FRAGMENT_NODE = 11; // 0xb
    field public static final short DOCUMENT_NODE = 9; // 0x9
    field public static final short DOCUMENT_TYPE_NODE = 10; // 0xa
    field public static final short ELEMENT_NODE = 1; // 0x1
    field public static final short ENTITY_NODE = 6; // 0x6
    field public static final short ENTITY_REFERENCE_NODE = 5; // 0x5
    field public static final short NOTATION_NODE = 12; // 0xc
    field public static final short PROCESSING_INSTRUCTION_NODE = 7; // 0x7
    field public static final short TEXT_NODE = 3; // 0x3
  }

  public interface NodeList {
    method public int getLength();
    method public org.w3c.dom.Node item(int);
  }

  public interface Notation extends org.w3c.dom.Node {
    method public String getPublicId();
    method public String getSystemId();
  }

  public interface ProcessingInstruction extends org.w3c.dom.Node {
    method public String getData();
    method public String getTarget();
    method public void setData(String) throws org.w3c.dom.DOMException;
  }

  public interface Text extends org.w3c.dom.CharacterData {
    method public org.w3c.dom.Text splitText(int) throws org.w3c.dom.DOMException;
  }

}

package org.xml.sax {

  public interface AttributeList {
    method public int getLength();
    method public String getName(int);
    method public String getType(int);
    method public String getType(String);
    method public String getValue(int);
    method public String getValue(String);
  }

  public interface Attributes {
    method public int getIndex(String, String);
    method public int getIndex(String);
    method public int getLength();
    method public String getLocalName(int);
    method public String getQName(int);
    method public String getType(int);
    method public String getType(String, String);
    method public String getType(String);
    method public String getURI(int);
    method public String getValue(int);
    method public String getValue(String, String);
    method public String getValue(String);
  }

  public interface ContentHandler {
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String, String, String) throws org.xml.sax.SAXException;
    method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void skippedEntity(String) throws org.xml.sax.SAXException;
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
    method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
  }

  public interface DTDHandler {
    method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
    method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
  }

  public interface DocumentHandler {
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String) throws org.xml.sax.SAXException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
  }

  public interface EntityResolver {
    method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
  }

  public interface ErrorHandler {
    method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
  }

  public class HandlerBase implements org.xml.sax.DTDHandler org.xml.sax.DocumentHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler {
    ctor public HandlerBase();
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String) throws org.xml.sax.SAXException;
    method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void notationDecl(String, String, String);
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public org.xml.sax.InputSource resolveEntity(String, String) throws org.xml.sax.SAXException;
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
    method public void unparsedEntityDecl(String, String, String, String);
    method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
  }

  public class InputSource {
    ctor public InputSource();
    ctor public InputSource(String);
    ctor public InputSource(java.io.InputStream);
    ctor public InputSource(java.io.Reader);
    method public java.io.InputStream getByteStream();
    method public java.io.Reader getCharacterStream();
    method public String getEncoding();
    method public String getPublicId();
    method public String getSystemId();
    method public void setByteStream(java.io.InputStream);
    method public void setCharacterStream(java.io.Reader);
    method public void setEncoding(String);
    method public void setPublicId(String);
    method public void setSystemId(String);
  }

  public interface Locator {
    method public int getColumnNumber();
    method public int getLineNumber();
    method public String getPublicId();
    method public String getSystemId();
  }

  public interface Parser {
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setDocumentHandler(org.xml.sax.DocumentHandler);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setLocale(java.util.Locale) throws org.xml.sax.SAXException;
  }

  public class SAXException extends java.lang.Exception {
    ctor public SAXException();
    ctor public SAXException(String);
    ctor public SAXException(Exception);
    ctor public SAXException(String, Exception);
    method public Exception getException();
  }

  public class SAXNotRecognizedException extends org.xml.sax.SAXException {
    ctor public SAXNotRecognizedException();
    ctor public SAXNotRecognizedException(String);
  }

  public class SAXNotSupportedException extends org.xml.sax.SAXException {
    ctor public SAXNotSupportedException();
    ctor public SAXNotSupportedException(String);
  }

  public class SAXParseException extends org.xml.sax.SAXException {
    ctor public SAXParseException(String, org.xml.sax.Locator);
    ctor public SAXParseException(String, org.xml.sax.Locator, Exception);
    ctor public SAXParseException(String, String, String, int, int);
    ctor public SAXParseException(String, String, String, int, int, Exception);
    method public int getColumnNumber();
    method public int getLineNumber();
    method public String getPublicId();
    method public String getSystemId();
  }

  public interface XMLFilter extends org.xml.sax.XMLReader {
    method public org.xml.sax.XMLReader getParent();
    method public void setParent(org.xml.sax.XMLReader);
  }

  public interface XMLReader {
    method public org.xml.sax.ContentHandler getContentHandler();
    method public org.xml.sax.DTDHandler getDTDHandler();
    method public org.xml.sax.EntityResolver getEntityResolver();
    method public org.xml.sax.ErrorHandler getErrorHandler();
    method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void setContentHandler(org.xml.sax.ContentHandler);
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
  }

}

package org.xml.sax.ext {

  public interface Attributes2 extends org.xml.sax.Attributes {
    method public boolean isDeclared(int);
    method public boolean isDeclared(String);
    method public boolean isDeclared(String, String);
    method public boolean isSpecified(int);
    method public boolean isSpecified(String, String);
    method public boolean isSpecified(String);
  }

  public class Attributes2Impl extends org.xml.sax.helpers.AttributesImpl implements org.xml.sax.ext.Attributes2 {
    ctor public Attributes2Impl();
    ctor public Attributes2Impl(org.xml.sax.Attributes);
    method public boolean isDeclared(int);
    method public boolean isDeclared(String, String);
    method public boolean isDeclared(String);
    method public boolean isSpecified(int);
    method public boolean isSpecified(String, String);
    method public boolean isSpecified(String);
    method public void setDeclared(int, boolean);
    method public void setSpecified(int, boolean);
  }

  public interface DeclHandler {
    method public void attributeDecl(String, String, String, String, String) throws org.xml.sax.SAXException;
    method public void elementDecl(String, String) throws org.xml.sax.SAXException;
    method public void externalEntityDecl(String, String, String) throws org.xml.sax.SAXException;
    method public void internalEntityDecl(String, String) throws org.xml.sax.SAXException;
  }

  public class DefaultHandler2 extends org.xml.sax.helpers.DefaultHandler implements org.xml.sax.ext.DeclHandler org.xml.sax.ext.EntityResolver2 org.xml.sax.ext.LexicalHandler {
    ctor public DefaultHandler2();
    method public void attributeDecl(String, String, String, String, String) throws org.xml.sax.SAXException;
    method public void comment(char[], int, int) throws org.xml.sax.SAXException;
    method public void elementDecl(String, String) throws org.xml.sax.SAXException;
    method public void endCDATA() throws org.xml.sax.SAXException;
    method public void endDTD() throws org.xml.sax.SAXException;
    method public void endEntity(String) throws org.xml.sax.SAXException;
    method public void externalEntityDecl(String, String, String) throws org.xml.sax.SAXException;
    method public org.xml.sax.InputSource getExternalSubset(String, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void internalEntityDecl(String, String) throws org.xml.sax.SAXException;
    method public org.xml.sax.InputSource resolveEntity(String, String, String, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void startCDATA() throws org.xml.sax.SAXException;
    method public void startDTD(String, String, String) throws org.xml.sax.SAXException;
    method public void startEntity(String) throws org.xml.sax.SAXException;
  }

  public interface EntityResolver2 extends org.xml.sax.EntityResolver {
    method public org.xml.sax.InputSource getExternalSubset(String, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public org.xml.sax.InputSource resolveEntity(String, String, String, String) throws java.io.IOException, org.xml.sax.SAXException;
  }

  public interface LexicalHandler {
    method public void comment(char[], int, int) throws org.xml.sax.SAXException;
    method public void endCDATA() throws org.xml.sax.SAXException;
    method public void endDTD() throws org.xml.sax.SAXException;
    method public void endEntity(String) throws org.xml.sax.SAXException;
    method public void startCDATA() throws org.xml.sax.SAXException;
    method public void startDTD(String, String, String) throws org.xml.sax.SAXException;
    method public void startEntity(String) throws org.xml.sax.SAXException;
  }

  public interface Locator2 extends org.xml.sax.Locator {
    method public String getEncoding();
    method public String getXMLVersion();
  }

  public class Locator2Impl extends org.xml.sax.helpers.LocatorImpl implements org.xml.sax.ext.Locator2 {
    ctor public Locator2Impl();
    ctor public Locator2Impl(org.xml.sax.Locator);
    method public String getEncoding();
    method public String getXMLVersion();
    method public void setEncoding(String);
    method public void setXMLVersion(String);
  }

}

package org.xml.sax.helpers {

  public class AttributeListImpl implements org.xml.sax.AttributeList {
    ctor public AttributeListImpl();
    ctor public AttributeListImpl(org.xml.sax.AttributeList);
    method public void addAttribute(String, String, String);
    method public void clear();
    method public int getLength();
    method public String getName(int);
    method public String getType(int);
    method public String getType(String);
    method public String getValue(int);
    method public String getValue(String);
    method public void removeAttribute(String);
    method public void setAttributeList(org.xml.sax.AttributeList);
  }

  public class AttributesImpl implements org.xml.sax.Attributes {
    ctor public AttributesImpl();
    ctor public AttributesImpl(org.xml.sax.Attributes);
    method public void addAttribute(String, String, String, String, String);
    method public void clear();
    method public int getIndex(String, String);
    method public int getIndex(String);
    method public int getLength();
    method public String getLocalName(int);
    method public String getQName(int);
    method public String getType(int);
    method public String getType(String, String);
    method public String getType(String);
    method public String getURI(int);
    method public String getValue(int);
    method public String getValue(String, String);
    method public String getValue(String);
    method public void removeAttribute(int);
    method public void setAttribute(int, String, String, String, String, String);
    method public void setAttributes(org.xml.sax.Attributes);
    method public void setLocalName(int, String);
    method public void setQName(int, String);
    method public void setType(int, String);
    method public void setURI(int, String);
    method public void setValue(int, String);
  }

  public class DefaultHandler implements org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler {
    ctor public DefaultHandler();
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String, String, String) throws org.xml.sax.SAXException;
    method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
    method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void skippedEntity(String) throws org.xml.sax.SAXException;
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
    method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
    method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
    method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
  }

  public class LocatorImpl implements org.xml.sax.Locator {
    ctor public LocatorImpl();
    ctor public LocatorImpl(org.xml.sax.Locator);
    method public int getColumnNumber();
    method public int getLineNumber();
    method public String getPublicId();
    method public String getSystemId();
    method public void setColumnNumber(int);
    method public void setLineNumber(int);
    method public void setPublicId(String);
    method public void setSystemId(String);
  }

  public class NamespaceSupport {
    ctor public NamespaceSupport();
    method public boolean declarePrefix(String, String);
    method public java.util.Enumeration getDeclaredPrefixes();
    method public String getPrefix(String);
    method public java.util.Enumeration getPrefixes();
    method public java.util.Enumeration getPrefixes(String);
    method public String getURI(String);
    method public boolean isNamespaceDeclUris();
    method public void popContext();
    method public String[] processName(String, String[], boolean);
    method public void pushContext();
    method public void reset();
    method public void setNamespaceDeclUris(boolean);
    field public static final String NSDECL = "http://www.w3.org/xmlns/2000/";
    field public static final String XMLNS = "http://www.w3.org/XML/1998/namespace";
  }

  public class ParserAdapter implements org.xml.sax.DocumentHandler org.xml.sax.XMLReader {
    ctor public ParserAdapter() throws org.xml.sax.SAXException;
    ctor public ParserAdapter(org.xml.sax.Parser);
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String) throws org.xml.sax.SAXException;
    method public org.xml.sax.ContentHandler getContentHandler();
    method public org.xml.sax.DTDHandler getDTDHandler();
    method public org.xml.sax.EntityResolver getEntityResolver();
    method public org.xml.sax.ErrorHandler getErrorHandler();
    method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public void setContentHandler(org.xml.sax.ContentHandler);
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, org.xml.sax.AttributeList) throws org.xml.sax.SAXException;
  }

  public class ParserFactory {
    method public static org.xml.sax.Parser makeParser() throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException, java.lang.NullPointerException;
    method public static org.xml.sax.Parser makeParser(String) throws java.lang.ClassCastException, java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public class XMLFilterImpl implements org.xml.sax.ContentHandler org.xml.sax.DTDHandler org.xml.sax.EntityResolver org.xml.sax.ErrorHandler org.xml.sax.XMLFilter {
    ctor public XMLFilterImpl();
    ctor public XMLFilterImpl(org.xml.sax.XMLReader);
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String, String, String) throws org.xml.sax.SAXException;
    method public void endPrefixMapping(String) throws org.xml.sax.SAXException;
    method public void error(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public void fatalError(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
    method public org.xml.sax.ContentHandler getContentHandler();
    method public org.xml.sax.DTDHandler getDTDHandler();
    method public org.xml.sax.EntityResolver getEntityResolver();
    method public org.xml.sax.ErrorHandler getErrorHandler();
    method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public org.xml.sax.XMLReader getParent();
    method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void notationDecl(String, String, String) throws org.xml.sax.SAXException;
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public org.xml.sax.InputSource resolveEntity(String, String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void setContentHandler(org.xml.sax.ContentHandler);
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void setParent(org.xml.sax.XMLReader);
    method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void skippedEntity(String) throws org.xml.sax.SAXException;
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
    method public void startPrefixMapping(String, String) throws org.xml.sax.SAXException;
    method public void unparsedEntityDecl(String, String, String, String) throws org.xml.sax.SAXException;
    method public void warning(org.xml.sax.SAXParseException) throws org.xml.sax.SAXException;
  }

  public class XMLReaderAdapter implements org.xml.sax.ContentHandler org.xml.sax.Parser {
    ctor public XMLReaderAdapter() throws org.xml.sax.SAXException;
    ctor public XMLReaderAdapter(org.xml.sax.XMLReader);
    method public void characters(char[], int, int) throws org.xml.sax.SAXException;
    method public void endDocument() throws org.xml.sax.SAXException;
    method public void endElement(String, String, String) throws org.xml.sax.SAXException;
    method public void endPrefixMapping(String);
    method public void ignorableWhitespace(char[], int, int) throws org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void processingInstruction(String, String) throws org.xml.sax.SAXException;
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setDocumentHandler(org.xml.sax.DocumentHandler);
    method public void setDocumentLocator(org.xml.sax.Locator);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setLocale(java.util.Locale) throws org.xml.sax.SAXException;
    method public void skippedEntity(String) throws org.xml.sax.SAXException;
    method public void startDocument() throws org.xml.sax.SAXException;
    method public void startElement(String, String, String, org.xml.sax.Attributes) throws org.xml.sax.SAXException;
    method public void startPrefixMapping(String, String);
  }

  public final class XMLReaderFactory {
    method public static org.xml.sax.XMLReader createXMLReader() throws org.xml.sax.SAXException;
    method public static org.xml.sax.XMLReader createXMLReader(String) throws org.xml.sax.SAXException;
  }

}

package org.xmlpull.v1 {

  public interface XmlPullParser {
    method public void defineEntityReplacementText(String, String) throws org.xmlpull.v1.XmlPullParserException;
    method public int getAttributeCount();
    method public String getAttributeName(int);
    method public String getAttributeNamespace(int);
    method public String getAttributePrefix(int);
    method public String getAttributeType(int);
    method public String getAttributeValue(int);
    method public String getAttributeValue(String, String);
    method public int getColumnNumber();
    method public int getDepth();
    method public int getEventType() throws org.xmlpull.v1.XmlPullParserException;
    method public boolean getFeature(String);
    method public String getInputEncoding();
    method public int getLineNumber();
    method public String getName();
    method public String getNamespace(String);
    method public String getNamespace();
    method public int getNamespaceCount(int) throws org.xmlpull.v1.XmlPullParserException;
    method public String getNamespacePrefix(int) throws org.xmlpull.v1.XmlPullParserException;
    method public String getNamespaceUri(int) throws org.xmlpull.v1.XmlPullParserException;
    method public String getPositionDescription();
    method public String getPrefix();
    method public Object getProperty(String);
    method public String getText();
    method public char[] getTextCharacters(int[]);
    method public boolean isAttributeDefault(int);
    method public boolean isEmptyElementTag() throws org.xmlpull.v1.XmlPullParserException;
    method public boolean isWhitespace() throws org.xmlpull.v1.XmlPullParserException;
    method public int next() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public int nextTag() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public String nextText() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public int nextToken() throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public void require(int, String, String) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public void setFeature(String, boolean) throws org.xmlpull.v1.XmlPullParserException;
    method public void setInput(java.io.Reader) throws org.xmlpull.v1.XmlPullParserException;
    method public void setInput(java.io.InputStream, String) throws org.xmlpull.v1.XmlPullParserException;
    method public void setProperty(String, Object) throws org.xmlpull.v1.XmlPullParserException;
    field public static final int CDSECT = 5; // 0x5
    field public static final int COMMENT = 9; // 0x9
    field public static final int DOCDECL = 10; // 0xa
    field public static final int END_DOCUMENT = 1; // 0x1
    field public static final int END_TAG = 3; // 0x3
    field public static final int ENTITY_REF = 6; // 0x6
    field public static final String FEATURE_PROCESS_DOCDECL = "http://xmlpull.org/v1/doc/features.html#process-docdecl";
    field public static final String FEATURE_PROCESS_NAMESPACES = "http://xmlpull.org/v1/doc/features.html#process-namespaces";
    field public static final String FEATURE_REPORT_NAMESPACE_ATTRIBUTES = "http://xmlpull.org/v1/doc/features.html#report-namespace-prefixes";
    field public static final String FEATURE_VALIDATION = "http://xmlpull.org/v1/doc/features.html#validation";
    field public static final int IGNORABLE_WHITESPACE = 7; // 0x7
    field public static final String NO_NAMESPACE = "";
    field public static final int PROCESSING_INSTRUCTION = 8; // 0x8
    field public static final int START_DOCUMENT = 0; // 0x0
    field public static final int START_TAG = 2; // 0x2
    field public static final int TEXT = 4; // 0x4
    field public static final String[] TYPES;
  }

  public class XmlPullParserException extends java.lang.Exception {
    ctor public XmlPullParserException(String);
    ctor public XmlPullParserException(String, org.xmlpull.v1.XmlPullParser, Throwable);
    method public int getColumnNumber();
    method public Throwable getDetail();
    method public int getLineNumber();
    field protected int column;
    field protected Throwable detail;
    field protected int row;
  }

  public class XmlPullParserFactory {
    ctor protected XmlPullParserFactory();
    method public boolean getFeature(String);
    method public boolean isNamespaceAware();
    method public boolean isValidating();
    method public static org.xmlpull.v1.XmlPullParserFactory newInstance() throws org.xmlpull.v1.XmlPullParserException;
    method public static org.xmlpull.v1.XmlPullParserFactory newInstance(String, Class) throws org.xmlpull.v1.XmlPullParserException;
    method public org.xmlpull.v1.XmlPullParser newPullParser() throws org.xmlpull.v1.XmlPullParserException;
    method public org.xmlpull.v1.XmlSerializer newSerializer() throws org.xmlpull.v1.XmlPullParserException;
    method public void setFeature(String, boolean) throws org.xmlpull.v1.XmlPullParserException;
    method public void setNamespaceAware(boolean);
    method public void setValidating(boolean);
    field public static final String PROPERTY_NAME = "org.xmlpull.v1.XmlPullParserFactory";
    field protected String classNamesLocation;
    field protected java.util.HashMap features;
    field protected java.util.ArrayList parserClasses;
    field protected java.util.ArrayList serializerClasses;
  }

  public interface XmlSerializer {
    method public org.xmlpull.v1.XmlSerializer attribute(String, String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void cdsect(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void comment(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void docdecl(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void endDocument() throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public org.xmlpull.v1.XmlSerializer endTag(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void entityRef(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void flush() throws java.io.IOException;
    method public int getDepth();
    method public boolean getFeature(String);
    method public String getName();
    method public String getNamespace();
    method public String getPrefix(String, boolean) throws java.lang.IllegalArgumentException;
    method public Object getProperty(String);
    method public void ignorableWhitespace(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void processingInstruction(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setFeature(String, boolean) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setOutput(java.io.OutputStream, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setOutput(java.io.Writer) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setPrefix(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setProperty(String, Object) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void startDocument(String, Boolean) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public org.xmlpull.v1.XmlSerializer startTag(String, String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public org.xmlpull.v1.XmlSerializer text(String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public org.xmlpull.v1.XmlSerializer text(char[], int, int) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
  }

}

package org.xmlpull.v1.sax2 {

  public class Driver implements org.xml.sax.Attributes org.xml.sax.Locator org.xml.sax.XMLReader {
    ctor public Driver() throws org.xmlpull.v1.XmlPullParserException;
    ctor public Driver(org.xmlpull.v1.XmlPullParser) throws org.xmlpull.v1.XmlPullParserException;
    method public int getColumnNumber();
    method public org.xml.sax.ContentHandler getContentHandler();
    method public org.xml.sax.DTDHandler getDTDHandler();
    method public org.xml.sax.EntityResolver getEntityResolver();
    method public org.xml.sax.ErrorHandler getErrorHandler();
    method public boolean getFeature(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public int getIndex(String, String);
    method public int getIndex(String);
    method public int getLength();
    method public int getLineNumber();
    method public String getLocalName(int);
    method public Object getProperty(String) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public String getPublicId();
    method public String getQName(int);
    method public String getSystemId();
    method public String getType(int);
    method public String getType(String, String);
    method public String getType(String);
    method public String getURI(int);
    method public String getValue(int);
    method public String getValue(String, String);
    method public String getValue(String);
    method public void parse(org.xml.sax.InputSource) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parse(String) throws java.io.IOException, org.xml.sax.SAXException;
    method public void parseSubTree(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xml.sax.SAXException;
    method public void setContentHandler(org.xml.sax.ContentHandler);
    method public void setDTDHandler(org.xml.sax.DTDHandler);
    method public void setEntityResolver(org.xml.sax.EntityResolver);
    method public void setErrorHandler(org.xml.sax.ErrorHandler);
    method public void setFeature(String, boolean) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method public void setProperty(String, Object) throws org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException;
    method protected void startElement(String, String, String) throws org.xml.sax.SAXException;
    field protected static final String APACHE_DYNAMIC_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/dynamic";
    field protected static final String APACHE_SCHEMA_VALIDATION_FEATURE = "http://apache.org/xml/features/validation/schema";
    field protected static final String DECLARATION_HANDLER_PROPERTY = "http://xml.org/sax/properties/declaration-handler";
    field protected static final String LEXICAL_HANDLER_PROPERTY = "http://xml.org/sax/properties/lexical-handler";
    field protected static final String NAMESPACES_FEATURE = "http://xml.org/sax/features/namespaces";
    field protected static final String NAMESPACE_PREFIXES_FEATURE = "http://xml.org/sax/features/namespace-prefixes";
    field protected static final String VALIDATION_FEATURE = "http://xml.org/sax/features/validation";
    field protected org.xml.sax.ContentHandler contentHandler;
    field protected org.xml.sax.ErrorHandler errorHandler;
    field protected org.xmlpull.v1.XmlPullParser pp;
    field protected String systemId;
  }

}

